如何在 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个字节是跳转的距离(从指令后面的字节开始计算,执行通常会继续)。
我如何跳转到英特尔汇编语法中的已知内存地址(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个字节是跳转的距离(从指令后面的字节开始计算,执行通常会继续)。