【发布时间】:2013-06-05 04:47:55
【问题描述】:
我想在 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获得了代码段寄存器的编号。
有人可以帮我编码直接跳转吗?谢谢!
【问题讨论】:
-
如果你想直接跳转到一个已知的硬编码地址而不用汇编魔法,你也可以使用
((void (*)(void))0x11223344)();。 -
这组装成 mov eax,11223344h; mov esi,esp;调用 eax;没有直接跳转:(
-
为什么必须使用直接跳转?为什么不能只使用寄存器或内存间接跳转?
标签: c assembly visual-studio-2012 x86