计算JMP指令的地址

时间:2011-09-30 11:15:02

标签: assembly x86 memory-address

我试图通过用JMP指令替换它的开头来挂钩一个函数,这个指令应该导致我的函数。但问题是我不知道如何计算JMP偏移量来定位我的函数地址。好吧,我知道如果你在内存中跳转(目的地地址 - 当前地址),该怎么做,但我没有任何想法,当你跳回内存时如何确定它。

有人可以帮忙吗?

4 个答案:

答案 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并且您拥有函数的内存地址