计算JMP指令的地址

问题描述 投票:2回答:4

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

有人可以帮忙吗?

assembly x86 memory-address
4个回答
5
投票

只需使用负偏移量即可向后跳跃。

并记住要考虑JMP指令的大小。偏移量相对于JMP指令的结尾而不是开头。如果当前地址是你要编写JMP的地方,那么你需要一个5 + dest-current的offet,因为JMP指令的大小加上5个字节的偏移量。


3
投票

这是你应该弄清楚的基本数学。 :)

如果一个JMP前锋是Destination - Origin,那么JMP落后将是Origin - Destination

用普通的数字来思考:如果你想将JMP从100提升到110,你的JMP将是110 - 100 = 10。如果你想向后JMP相同的数量,它将是100 - 110 = -10


1
投票

相对跳跃是有符号的,也就是说,它们使用符号位进行正负位移。绝对跳跃是绝对的,所以无所谓。请参阅英特尔指令指南的第2A和2B卷。


-4
投票

偷偷摸摸

对函数上方的位置进行虚拟调用

 call location1


 .location1
 call location2
 .location2
 pop ax
 ret
 .yourfunction

您现在在ax中拥有location2的地址

添加3到ax,你有你的功能的内存地址

© www.soinside.com 2019 - 2024. All rights reserved.