【发布时间】:2021-02-05 22:46:12
【问题描述】:
我目前正在学习逆向工程,因此我需要学习汇编。代码运行良好,但在JE 和JNE 指令上出现错误。更具体地说:我正在做一个绕道钩子作为练习,程序崩溃了,因为它跳转到了错误的地址。
我想写这个,但是编译器给了我一个错误(LNK2016):
JE 0x123 (0x123 example address)
我通过写作解决了这个问题:
JE short 0x123
完整功能代码:
my_hook:
push rbp
mov rbp, rsp
mov dword [rcx + 0x18], 99
test rcx, rcx
je 0x7FF7847902EE
lock dec dword [rcx + 0x08]
jne 0x7FF7847902EE
mov rcx, [rsp + 0x30]
leave
ret
但现在的问题是,在我们的例子中,它跳转到了函数的开头而不是 0x123。
【问题讨论】:
-
你能发一个minimal reproducible example吗?
-
你知道条件跳转指令,就像 x86 上的所有直接近跳转一样,采用相对位移吗?所以如果你不知道你的代码将被定位在哪里,你就不能用它来跳转到一个绝对地址。相反,您可以反转条件并跳过绝对间接跳转,使用寄存器或内存中的绝对地址。
-
反之,如果你知道你的代码在哪里,你可以用
ORG告诉汇编器,它可以计算出合适的位移。 -
@NateEldredge 首先感谢您的回复!我现在把完整的功能代码贴在上面了。
-
0x7FF7847902EE在哪里?跳出你的功能是个坏主意。如果它在您的函数内,只需使用标签。然后汇编器可以生成正确的偏移量。
标签: visual-studio assembly 64-bit x86-64 nasm