晚上好!我根据文章http://rsdn.org/article/baseserv/IntercetionAPI.xml使用第一种方法拦截了你。而且……一切都解决了。但我就是看不懂原理,我引用:
实践证明,与其使用通常的jmp,不如使用push xxxx ret组合,其中xxxx是替换函数的地址
那么push命令如何替代jmp呢?我也会理解 call ... 但是 push,它只是在堆栈上放一个值(在这种情况下,是函数的地址),但是它是如何启动这个函数的呢?
晚上好!我根据文章http://rsdn.org/article/baseserv/IntercetionAPI.xml使用第一种方法拦截了你。而且……一切都解决了。但我就是看不懂原理,我引用:
实践证明,与其使用通常的jmp,不如使用push xxxx ret组合,其中xxxx是替换函数的地址
那么push命令如何替代jmp呢?我也会理解 call ... 但是 push,它只是在堆栈上放一个值(在这种情况下,是函数的地址),但是它是如何启动这个函数的呢?
那么它有什么作用呢
ret
?将控制权返回到存储在堆栈中的地址。并且push
这个地址被保存了。“我想是的”(c)维尼
当被调用时
call
,会执行两个操作:将返回地址压入堆栈,并转换到过程。那些。本质上push
和jmp
。返回 (
ret
) 时,执行相反的操作:从堆栈中删除返回地址,并进行跳转。那些。pop
和jmp
。如果你这样做
push
,那么ret
,那么它将等同于push
,那么pop
,那么jmp
。那些。从堆栈的角度来看push
并pop
相互取消(放入堆栈,然后再次删除),只剩下一个过渡。from的好处可以简单
push
的说是因为你需要指定相对跳转地址(还是需要计算的),它从栈中取出绝对地址并跳转到它。ret
jmp
jmp
ret
当然,您可以间接跳转到寄存器中的地址(例如,
jmp [eax]
),但如果无法更改寄存器,这可能不起作用。一般来说,有很多细微差别,在不同的情况下,不同的过渡选项会很方便。