在visual studio中制作直接跳转

标签 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 获得了代码段寄存器的编号。

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

最佳答案

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

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

这将像这样编译:

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

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

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

__asm {
    push 0x11223344
    ret
}

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

相关文章:

汇编语言——用 XOR 组合字符

x64 上的 COM 调用约定

.net - 如何在 AfterBuild 中将 ILMerge 与 .NET 4.5 结合使用?

css - VS2012 - CSS\9 中的验证警告

c - 程序收到信号 : “EXC_BAD_ACCESS”

c - 声明一个指向内存中地址 0x200 处的整数的指针

c - 当虚拟内存使用量达到256GB时进程输入界面停止响应

c - modbus 十六进制地址转换

assembly - ARM7TDMI(GameBoy Advance)上操作系统相关的操作和模式

c++ - 安装了 MPI 但仍然出现链接器错误 LNK2019