所以我试图找到一些澄清这一点,不能工作出来/不正确的谷歌给给予我正确的结果,所以我希望有人可以理解我在这里。
我正试图了解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
1条答案
按热度按时间fhg3lkii1#
GCC似乎接受了这个看似合理的语法:
jmp . + 0x12
。(NASM的等效值是jmp $ + 0x12
。NASM的$
与GAS的.
工作原理相同)对我来说,这会产生EB 10,这可能不是你所期望的。这是因为0x 12的偏移量被添加到指令的 start,而在这个“短跳转”中编码的偏移量是从其本身的末尾开始的,因此有两个字节的差异。
而且,正如福兹提到的,间接跳跃是不同的;其绝对目标地址来自寄存器或存储器。
jmp .+something
则在汇编时计算偏移量,以到达使用点表示“当前位置”(当前行的开始)的指定地址。