assembly 正在计算JMP指令的地址

tkqqtvp1  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(165)

我试图通过用JMP指令替换函数的开头来挂钩函数,但问题是我不知道如何计算指向函数地址的JMP偏移量。如果你在内存中向前跳转(Destination addr - Current addr),我知道该如何做,但当你在内存中向后跳转时,我不知道如何确定它。
有人能帮忙吗?

n1bvdmb6

n1bvdmb61#

只需使用负偏移量向后跳。
请记住要考虑JMP指令的大小。偏移量是相对于JMP指令的结尾而不是开头的。如果当前地址是要写入JMP的位置,则需要偏移量为5+dest-current,因为JMP指令的大小加上偏移量为5个字节。

bttbmeg0

bttbmeg02#

这是基本的数学,你应该能弄清楚。:)
如果JMP正向为Destination - Origin,则反向为JMP
用简单的数字来想一想:如果你想把JMP从100向前推到110,你的JMP就是110 - 100 = 10,如果你想把JMP向后推同样的量,它就是100 - 110 = -10

f4t66c6m

f4t66c6m3#

相对跳转是带符号的,也就是说,它们具有使用符号位的正位移和负位移。绝对跳转是绝对跳转,因此无关紧要。请参阅英特尔指令指南的第2A和2B卷。

50pmv0ei

50pmv0ei4#

你好,我建议你使用'call'语句。'call'语句将负责把返回指针放到堆栈上。
计算你需要做的跳跃的公式是:收件人地址-发件人地址- 5
这是因为这是“call”+ offset指令在存储器中占用的空间
内存中的指针写反了。如果你想指向内存0x 857830,在内存中这个值写为307885
指令操作码jmp = 0xE 9调用= 0xE 8

3ks5zfa0

3ks5zfa05#

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

call location1

 .location1
 call location2
 .location2
 pop ax
 ret
 .yourfunction

现在,您在ax中拥有location2的地址
把3加到ax上,就得到了函数的内存地址

相关问题