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