调试技术的现状与未来
调试技术的现状与未来
我们的目标和团队
我们的目标和团队
Place Holder
Place Holder
Place Holder
Place Holder
Symbol Viewer
Symbol Viewer
KD Talker
KD Talker
博客专栏
博客专栏
交流论坛
交流论坛
相册
相册
留言
留言
写Email
写Email
欢迎光临 高端调试
登录
|
注册
|
FAQ
搜索论坛
内核调试
ACPI调试
Linux内核调试
Windows内核调试
调试方法学
调试战役
调试原理
新工具观察
操作系统
Linux
Windows Vista
Windows
驱动开发
Linux驱动
WDF
WDM
总线
PCI Express
PCI/PCI-X
USB
无线通信协议
中央处理器
64位CPU
ARM
IA-32
CPU Info Center
计算机机系统
ACPI标准
系统认证
Desktop
服务器
嵌入式系统
Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
特别链接
格蠹调试套件(GDK)
格蠹学院
小朱书店
老雷的微博
《软件调试》
《格蠹汇编》
《软件调试(第二版)》
沪ICP备11027180号-1
WinDbg
帖子发起人:
guozf
发起时间:
2009-08-06 16:17 下午
回复:
5
高端调试
»
软件调试
»
WinDbg
»
Re: 如何得到函数的返回地址?
搜索论坛
帖子排序:
Oldest to newest
Newest to oldest
2009-08-06, 16:17 下午
guozf
注册: 2008-12-06
HK
发 贴: 68
如何得到函数的返回地址?
想实现一个功能:不执行一个函数的代码而直接返回。我想的办法如下:
1。 函数的入口处设置断点
2。找到函数的return address
3。设置EIP为这个address
4。恢复程序运行
难点在于如何得到函数的return address.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
注这个return address是该函数的的最后一个汇编语句
ret
或者
ret 18h (清除调用参数的栈)
而不是调用者在该函数返回后的地址,因为将EIP直接设置为这个地址,会因为没有清除函数调用参数导致 栈空间的错误。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
不知道是不是描述得很清楚,请指教或者给一些建议!
Thanks in advance!!
IP 地址: 已记录
报告
2009-08-06, 21:54 下午
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
Re: 如何得到函数的返回地址?
如果依赖调试符号,那么可以根据函数长度来找。否则没有什么通用的好方法,通常是反汇编分析。
IP 地址: 已记录
报告
2009-08-07, 09:02 上午
guozf
注册: 2008-12-06
HK
发 贴: 68
Re: 如何得到函数的返回地址?
嗯,或者可以试验一下通过调试符号得到函数长度的方法
IP 地址: 已记录
报告
2009-08-07, 10:26 上午
Thomson
注册: 2008-07-03
发 贴: 211
Re: 如何得到函数的返回地址?
可以参考windbg的uf命令来做..
IP 地址: 已记录
报告
2009-08-07, 10:53 上午
guozf
注册: 2008-12-06
HK
发 贴: 68
Re: 如何得到函数的返回地址?
如何参考uf呢?有啥资料么?
IP 地址: 已记录
报告
2009-08-19, 19:07 下午
dos
注册: 2008-08-05
发 贴: 17
Re: 如何得到函数的返回地址?
如果知道被调函数的调用类型,应该可以将EIP直接设为“调用者在该函数返回后的地址”。当然除了设好EIP,在恢复执行前,还要将ESP和EBP的值设成调函数之前的状态,方法是:
如果是调用者清栈(cdecl ),那就不用改ESP,因为函数返回后,EIP就是call 函数的下一句,也就是清栈的那句,这样直接设置EIP然后恢复程序运行应该是没问题的,不过,前提是EBP也是调用函数前的状态;
如果是被调函数清栈(stdcall),这时候如果知道被调函数的参数个数,可以根据参数个数恢复ESP,这一点应该不难;如果不知道参数个数,那就要找到被调函数的ret语句,根据ret后面的值,设置ESP,然后恢复程序运行。同样,要保证EBP是调用前状态。
不知道我是不是理解了楼主的问题,呵呵~
IP 地址: 已记录
报告
高端调试
»
软件调试
»
WinDbg
»
Re: 如何得到函数的返回地址?
请选择
论坛首页
|- 论坛搜索
|- 热门主题
|- 未回复的主题
用户选项
|- 登录
|- 注册
|- 找回密码
软件调试
|- Windows内核调试
|- C/C++本地代码调试
|- .Net程序调试
|- 脚本程序调试
|- Java程序调试
|- Linux内核调试
|- 《程序员》杂志调试专栏
|- WinDbg
|- GDB
|- 远程调试
|- 调试ACPI和BIOS
|- 特殊的调试任务
|- 转储分析
|- GDK7
内核探秘
|- Windows内核
|- Linux内核
系统架构
|- CPU架构
|- PCI/PCI Express架构
程序人生
|- 软件物语
|- 社区活动
|- 名人逸事
联盟论坛
|- 欢迎使用CnForums
没有银弹
|- BUG也精彩
|- 豆腐工程
|- 软件圈里十大怪
Windows Vista
|- 用调试利剑剖析VISTA内幕
|- 老专家如何破解新问题
|- 我的电脑谁说了算?
|- 资源
Office开发
|- Visio
驱动程序开发
|- Windows驱动开发
|- Linux驱动开发
|- Windows CE驱动开发
用户态开发
|- Windows本地代码(native)高级开发
|- Web应用开发
|- WinFX和.Net
|- Office开发
本站建设
|- 高端调试团队
|- 版面布局
|- 活动建议
|- 网站维护
64位计算
|- 64-bit Windows
|- 64-bit CPU
图书
|- 《软件调试》的示例程序
|- 《软件调试》的工具
|- 《软件调试》书友
|- 《软件调试》答疑
|- 《软件调试》勘误和意见
|- 《格蠹汇编》
|- 《软件调试》第二版卷1
|- 《软件调试》第二版卷2
云计算
|- IaaS
|- 云存储
|- 大数据
|- PaaS和SaaS
GPU
|- CUDA
|- OpenCL
|- HSA
|- 游戏开发与调试
(C)2004-2020 ADVDBG.ORG All Rights Reserved.