如何在 x64 和 x32 的英特尔语法中跳转到内存位置

How to jump to memory location in intel syntax for both x64 and x32

我如何跳转到英特尔汇编语法中的已知内存地址(x32 和 x64)。

我想我掌握了 64 位语法。例如,如果在 x64 中我想跳转到 0x75767 处的代码并且我位于 0000,我会这样做:

0000: FF 25 01 00 00 00         jmp QWORD PTR [rip+0x75761]

这样^正确吗?我想我可以使用 objdump objdump.exe -D -Mintel,i386 -b binary -m i386 test.bin 将那些字节分解成 x32 指令,结果是:

jmp    DWORD PTR 0x75761

然后只需使用 clang++.exe -masm=intel -m32 -c test.o 将此指令转换为 x32 字节,但它表示:

error: invalid operand for instruction
jmp DWORD PTR 0x75761
^

我想避免写入任何寄存器。

我的 x64 jmp 指令是否正确?

我如何在 x32 中完成类似的事情?假设在 x32 中我需要跳转到 0x400107 并且我在 0x400000

我正在调整 运行 Windows 上的进程内存。如果我的问题不准确,请原谅我,我正在学习。

不清楚您需要汇编代码还是机器代码。如果你想跳转到一个绝对地址,那么在 64 位模式下使用一个嵌入式指针寻址 rip relative:

jmp [rip+foo]
foo: .quad target_address

机器码:ff 25 00 00 00 00 xx xx xx xx xx xx xx xx(后8字节为目标绝对地址)

在 32 位代码中,如果您不担心分支预测,您可以使用 push+ret 技巧:

push offset foo
ret

机器码:68 xx xx xx xx c3

如果你能计算出相对地址,你当然可以只使用一个普通的jmp,即e9 xx xx xx xx,最后4个字节是跳转的距离(从指令后面的字节开始计算,执行通常会继续)。