我试图通过用JMP指令替换函数的开头来挂钩函数,但问题是我不知道如何计算指向函数地址的JMP偏移量。如果你在内存中向前跳转(Destination addr - Current addr),我知道该如何做,但当你在内存中向后跳转时,我不知道如何确定它。有人能帮忙吗?
n1bvdmb61#
只需使用负偏移量向后跳。请记住要考虑JMP指令的大小。偏移量是相对于JMP指令的结尾而不是开头的。如果当前地址是要写入JMP的位置,则需要偏移量为5+dest-current,因为JMP指令的大小加上偏移量为5个字节。
JMP
bttbmeg02#
这是基本的数学,你应该能弄清楚。:)如果JMP正向为Destination - Origin,则反向为JMP用简单的数字来想一想:如果你想把JMP从100向前推到110,你的JMP就是110 - 100 = 10,如果你想把JMP向后推同样的量,它就是100 - 110 = -10。
Destination - Origin
110 - 100 = 10
100 - 110 = -10
f4t66c6m3#
相对跳转是带符号的,也就是说,它们具有使用符号位的正位移和负位移。绝对跳转是绝对跳转,因此无关紧要。请参阅英特尔指令指南的第2A和2B卷。
50pmv0ei4#
你好,我建议你使用'call'语句。'call'语句将负责把返回指针放到堆栈上。计算你需要做的跳跃的公式是:收件人地址-发件人地址- 5这是因为这是“call”+ offset指令在存储器中占用的空间内存中的指针写反了。如果你想指向内存0x 857830,在内存中这个值写为307885指令操作码jmp = 0xE 9调用= 0xE 8
3ks5zfa05#
鬼鬼祟祟的对函数上方的位置进行虚拟调用
call location1 .location1 call location2 .location2 pop ax ret .yourfunction
现在,您在ax中拥有location2的地址把3加到ax上,就得到了函数的内存地址
5条答案
按热度按时间n1bvdmb61#
只需使用负偏移量向后跳。
请记住要考虑
JMP
指令的大小。偏移量是相对于JMP
指令的结尾而不是开头的。如果当前地址是要写入JMP
的位置,则需要偏移量为5+dest-current,因为JMP
指令的大小加上偏移量为5个字节。bttbmeg02#
这是基本的数学,你应该能弄清楚。:)
如果JMP正向为
Destination - Origin
,则反向为JMP
用简单的数字来想一想:如果你想把
JMP
从100向前推到110,你的JMP
就是110 - 100 = 10
,如果你想把JMP
向后推同样的量,它就是100 - 110 = -10
。f4t66c6m3#
相对跳转是带符号的,也就是说,它们具有使用符号位的正位移和负位移。绝对跳转是绝对跳转,因此无关紧要。请参阅英特尔指令指南的第2A和2B卷。
50pmv0ei4#
你好,我建议你使用'call'语句。'call'语句将负责把返回指针放到堆栈上。
计算你需要做的跳跃的公式是:收件人地址-发件人地址- 5
这是因为这是“call”+ offset指令在存储器中占用的空间
内存中的指针写反了。如果你想指向内存0x 857830,在内存中这个值写为307885
指令操作码jmp = 0xE 9调用= 0xE 8
3ks5zfa05#
鬼鬼祟祟的
对函数上方的位置进行虚拟调用
现在,您在ax中拥有location2的地址
把3加到ax上,就得到了函数的内存地址