当前位置: 代码迷 >> 汇编语言 >> 怎么在CALL中的任意位置获取该CALL的返回地址呢
  详细解决方案

怎么在CALL中的任意位置获取该CALL的返回地址呢

热度:105   发布时间:2016-05-02 04:24:26.0
如何在CALL中的任意位置获取该CALL的返回地址呢?
我所理解的一般情况下,在CALL头部返回地址可通过ESP获取,如果在sub esp,xx 之前有mov ebp,esp,那么在CALL头部以后一般可通过ebp取得返回地址!有没有一个可以在CALL任意位置都可以准确获取该CALL返回地址的呢?
求各路大神指点!
------解决思路----------------------
一般情况下如果ebp的值保持不变的化,可以通过ebp来取得返回地址。

你可以在函数开头将ebp手动保存,然后在函数任意位置使用即可。
------解决思路----------------------
在堆栈中,从当前esp处开始,逐DWORD往地址大的方向取其值,然后检查该值是否落在当前代码段范围内,且该处之前是一条call汇编指令。
------解决思路----------------------
1. 通过 PDB 文件应该是可以获得精确的调用堆栈的。
2. 从 ESP 扫描堆栈中的内容,如果代码中没有在参数或局部变量中使用函数指针,里面的内容一般不会有指向程序代码段地址的。所以可以认为指向代码段地址的内容就是 call 放进来的返回值,为了准确可以再查看这个值的前 5 个字节,是否真的是指向这个函数的 call 指令。
3. 嵌入一个反汇编引擎,追踪从函数开头到现在 esp 的变化量,然后减去这个变化再取对应位置的内容就可以了。
  相关解决方案