我试图通过用JMP指令替换它的开头来挂钩一个函数,这个指令应该导致我的函数。但问题是我不知道如何计算JMP偏移量来定位我的函数地址。好吧,我知道如果你在内存中跳转(目的地地址 - 当前地址),该怎么做,但我没有任何想法,当你跳回内存时如何确定它。
有人可以帮忙吗?
答案 0 :(得分:5)
只需使用负偏移即可向后跳跃。
请记住考虑JMP
指令的大小。偏移量相对于JMP
指令的结尾而不是开头。如果当前地址是您要写入JMP
的地方,则需要5 + dest-current的offet,因为JMP
指令的大小加上5个字节的偏移量。
答案 1 :(得分:3)
这是你应该弄清楚的基本数学。 :)
如果JMP转发为Destination - Origin
,那么向后JMP
将是Origin - Destination
用简单的数字来思考:如果你想要JMP
从100转到110,你的JMP
将是110 - 100 = 10
。如果您希望JMP
向后移动相同数量,则为100 - 110 = -10
。
答案 2 :(得分:1)
相对跳转是有符号的,也就是说,它们使用符号位有正负位移。绝对跳跃是绝对的,所以无所谓。见卷2A&英特尔指导指南2B。
答案 3 :(得分:-4)
偷偷摸摸
对函数上方的位置进行虚拟调用
call location1
.location1
call location2
.location2
pop ax
ret
.yourfunction
您现在在ax
中拥有location2的地址向ax添加3并且您拥有函数的内存地址