在视觉工作室直接跳跃

时间:2013-06-04 20:09:39

标签: c assembly visual-studio-2012 x86

我想在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 

但是如果我执行此跳转,则会在地址0xFFFFFFFF的读取时抛出访问冲突异常。我不确定这个跳转是如何与0xFFFFFFFF相关的。

我从http://ref.x86asm.net/coder32.html(名为jmpf)获取了OP代码,并从http://www.c-jump.com/CIS77/CPU/x86/lecture.html获得了代码段寄存器的编号。

有人可以帮我编码直接跳转吗?谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

这将按以下方式编译:

69044B7C  - FF25 E4330669       JMP DWORD PTR DS:[test.690633E4]

这也允许您在编译时和变量中指定目标地址。

至于DIRECT跳......我认为没有。您提到的0xea是操作系统不允许您使用的远程跳转。如果您确实需要对您的地址进行硬编码,则跳转会有以下解决方法:

__asm {
    push 0x11223344
    ret
}