【发布时间】:2011-09-30 11:15:02
【问题描述】:
我正在尝试通过将函数的开头替换为应该导致我的函数的 JMP 指令来挂钩函数。但问题是我不知道如何计算 JMP 偏移来定位我的函数的地址。好吧,如果你在内存中向前跳转,我知道该怎么做(目标地址 - 当前地址),但我不知道当你在内存中跳转时如何确定它。
有人可以帮忙吗?
【问题讨论】:
标签: assembly x86 memory-address
我正在尝试通过将函数的开头替换为应该导致我的函数的 JMP 指令来挂钩函数。但问题是我不知道如何计算 JMP 偏移来定位我的函数的地址。好吧,如果你在内存中向前跳转,我知道该怎么做(目标地址 - 当前地址),但我不知道当你在内存中跳转时如何确定它。
有人可以帮忙吗?
【问题讨论】:
标签: assembly x86 memory-address
只需使用负偏移量向后跳转。
记住要考虑JMP 指令的大小。偏移量是相对于JMP 指令的结尾而不是开头。如果当前地址是您要写入 JMP 的位置,那么您需要 5+dest-current 的偏移量,因为 JMP 指令的大小加上偏移量(如果为 5 个字节)。
【讨论】:
这是您应该能够弄清楚的基本数学。 :)
如果 JMP 前向是 Destination - Origin,那么 JMP 后向就是 Origin - Destination
用简单的数字想一想:如果您想将 JMP 从 100 转发到 110,您的 JMP 将是 110 - 100 = 10。如果你想向后JMP 相同的数量,那就是100 - 110 = -10。
【讨论】:
100改成0x100,把110改成0x110,数学是一样的。
相对跳转是有符号的,即使用符号位进行正负位移。绝对跳跃是绝对的,所以没关系。请参阅英特尔指令指南的第 2A 和 2B 卷。
【讨论】:
偷偷摸摸
对函数上方的位置进行虚拟调用
call location1
.location1
call location2
.location2
pop ax
ret
.yourfunction
你现在在 ax 中有 location2 的地址
将 3 加到 ax 上,你就有了函数的内存地址
【讨论】: