x64 中的相对 JMP

问题描述 投票:0回答:1

所以我试图找到一些对此的澄清,但无法解决/没有正确地表达谷歌给我正确的结果,所以我希望有人能在这里理解我。

我正在尝试了解 x64 的程序集以创建函数挂钩,并且我需要澄清相对 jmp 的工作原理。假设我在 0x7FFFFFF01000 有一个函数,我要在 0x7FFFFFF00016 处编写一个相对 jmp,这两个地址之间的差异是 0xFEA(4074) 但是我还没有写相对 jmp,所以从我要写入的地址到函数开头的地址之间的相对差异,还是从我要写入的相对 jmp 的末尾开始?

使用差异 0xFEA(4074)

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

使用差异0xFE4(4068)

00007FFFFFF0000C mov     [rsp+10h], rbx
00007FFFFFF00011 mov     [rsp+20h], rsi
00007FFFFFF00016 jmp     [rip+FE4]
00007FFFFFF0001C 0
assembly x86-64
1个回答
0
投票

GCC 似乎接受了这种看似合理的语法:

jmp . + 0x12

对我来说会产生EB 10,这可能不是你所期望的。这是因为偏移量是从指令的start开始计算的,而这个“短跳转”中编码的偏移量是从它本身的末尾开始计算的,因此有两个字节的差异。

而且,正如 fuz 提到的,间接跳转是不同的;它的偏移量是在运行时计算的。此代码在汇编时计算偏移量,使用点表示“当前位置”。

© www.soinside.com 2019 - 2024. All rights reserved.