我所理解的一般情况下,在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 的变化量,然后减去这个变化再取对应位置的内容就可以了。