我想直接进入Visual Studio。因为Visual Studio使用的MASM不支持直接跳转,比如jmp 0x12345678,所以我想用它的操作代码来创建这个跳转。我的代码是这样的

//0xEA = jmpf, 0x11223344 = jump target, 0x002e = code segment
unsigned char jmpf[] = {0xEA,0x44,0x33,0x22,0x11,0x2E,0x00};

//make stack executable (because of DEP)
DWORD oldprotect;
DWORD error;
VirtualProtect(&jmpf,7,PAGE_EXECUTE_READWRITE,&oldprotect);

unsigned int addr = (unsigned int)jmpf;

_asm{
    mov eax, addr
    jmp eax
}

跳跃分解为:
EA 44 33 22 11 2E 00         jmp  002E:11223344

但如果我执行此跳转,则会在地址0xffffff处的读取上引发访问冲突异常。我不确定这个跳转与0xFFFFFFFF有什么关系。
我从http://ref.x86asm.net/coder32.html得到操作码(名为jmpf),从http://www.c-jump.com/CIS77/CPU/x86/lecture.html得到代码段寄存器的编号。
有人能帮我编码一个直接跳转吗?谢谢!

最佳答案

要在visual studio中执行直接跳转,可以首先将绝对目标地址存储在变量中,并在asm中使用它:

unsigned int target = 0x11223344;
__asm {
    jmp target
}

这将编译如下:
69044B7C  - FF25 E4330669       JMP DWORD PTR DS:[test.690633E4]

这还允许您在编译时指定目标地址和变量。
至于直接跳。。。我想没有。你提到的0xea是操作系统不允许你使用的跳远。如果您确实需要对地址进行硬编码,则可以使用以下方法进行跳转:
__asm {
    push 0x11223344
    ret
}

关于c - 在Visual Studio中制作直接跳转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16926591/

10-13 05:27