assembly x64中的相对JMP

axkjgtzd  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(123)

所以我试图找到一些澄清这一点,不能工作出来/不正确的谷歌给给予我正确的结果,所以我希望有人可以理解我在这里。
我正试图了解x64的汇编语言,以创建函数钩子,我需要澄清一个相对的jmp是如何工作的。假设我有一个位于0x 7 FFFFFF 01000的函数,我将在0x 7 FFFFFF 00016上写入一个相对jmp,这两个地址之间的差异是0xFEA(4074)然而,我还没有写相对的jmp,所以是地址之间的相对差异,从地址im即将写入函数的开始,还是从函数的结束,我将要写的相对jmp
使用差异
0xFEA(4074)

00007FFFFFF0000C mov     [rsp+10h], rbx
00007FFFFFF00011 mov     [rsp+20h], rsi
00007FFFFFF00016 jmp     [rip+FEA]
00007FFFFFF0001C 0

使用**0xFE 4(4068)**的差值

00007FFFFFF0000C mov     [rsp+10h], rbx
00007FFFFFF00011 mov     [rsp+20h], rsi
00007FFFFFF00016 jmp     [rip+FE4]
00007FFFFFF0001C 0
fhg3lkii

fhg3lkii1#

GCC似乎接受了这个看似合理的语法:jmp . + 0x12。(NASM的等效值是jmp $ + 0x12。NASM的$与GAS的.工作原理相同)
对我来说,这会产生EB 10,这可能不是你所期望的。这是因为0x 12的偏移量被添加到指令的 start,而在这个“短跳转”中编码的偏移量是从其本身的末尾开始的,因此有两个字节的差异。
而且,正如福兹提到的,间接跳跃是不同的;其绝对目标地址来自寄存器或存储器。jmp .+something则在汇编时计算偏移量,以到达使用点表示“当前位置”(当前行的开始)的指定地址。

相关问题