利用Win32 Debug API打造自己的Debugger

本文详细介绍了如何利用Win32 Debug API创建Debugger,涵盖了CreateProcess、WaitForDebugEvent、ContinueDebugEvent等关键函数的使用,以及DEBUG_EVENT结构的解析。文章通过示例代码展示了基本的调试框架,并探讨了如何处理异常事件,如EXCEPTION_BREAKPOINT和EXCEPTION_SINGLE_STEP。文章结尾鼓励读者深入学习和应用Debug API以开发更强大的调试工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原理篇: http://blog.csdn.net/hackwaly/archive/2007/03/26/1542075.aspx 很多朋友都梦想有自己的Debugger程序,今天我们就来自己制作一个。作为一个Debugger程序,其最基本的功能框架其实就是完成2件事情:
 启动目标程序。
 实时监控目标程序的运行,并做出相应的应对。
我们要打造自己的Debugger程序,实际上也只需要完成这两个功能就可以了。当然,要完成这两个特定的功能,我们不可能从头开始造轮子,要首先看看操作系统给我们提供了什么样的基础设施:
由于我们是在Windows平台上工作,自然离不开微软公司提供的文档大全——MSDN。翻开MSDN,定位到“Debugging and Error Handling”,一些最基本的Windows Debug信息都在这里面。不过与其他栏目相比,这个栏目的信息明显显得单薄许多——也许越是底层、强大的技术,微软越不想公开吧。
初步浏览之后,我们可以确定,对于我们的Debugger而言,最重要的Debug API有如下几个:
 CreateProcess —— 用于创建被调试进程
 WaitForDebugEvent —— Debug Loop(调试循环)的主要构成函数
 ContinueDebugEvent —— 用于构成Debug Loop
 GetThreadContext —— 得到被调试进程的寄存器信息
 SetThreadContext —— 设置被调试进程的寄存器信息
 ReadProcessMemory —— 得到被调试进程的内存内容
 WriteProcessMemory —— 设置被调试进程的内存内容
最重要的数据结构有如下几个:
 CONTEXT —— 寄存器结构
 STARTUPINFO —— Start信息
 PROCESS_INFORMATION —— 进程相关信息
 DEBUG_EVENT —— Debug Event(调试事件)结构
可以说,我们的Debugger程序就是利用这几个API函数结合下面的几个数据结构,完成我们指定的功能。那么下面就让我们先来看看这几个API和数据结构的具体含义:

 

Debug API解析
在这里,我们将对上面所述的几个Debug调试API做一个检阅式的考察,大概介绍一下每个API的应用领域。而将这些API应用到具体实践中去,将会在下一部分“实例解析”中,给出详细的说明。
1.CreateProcess。
函数原型:BOOL CreateProcess(
LPCTSTR lpApplicationName, // 要创建的进程模块名
LPTSTR lpCommandLine, // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性
BOOL bInheritHandles, // 句柄继承选项
DWORD dwCreationFlags, // 进程创建选项
LPVOID lpEnvironment, // 进程环境块数据指针
LPCTSTR lpCurrentDirectory, // 当前目录名
LPSTARTUPINFO lpStartupInfo, // 启动信息
LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);
函数解析:该函数是Windows平台提供的最基本的创建进程的函数。每当我们双击一个EXE可执行文件,Windows内核就会自动调用该函数创建我们双击的文件所对应的进程。该函数中,最重要的参数有三个:一个是进程模块名,指明了要创建哪个进程;一个是进程创建选项,指明了要如何创建目标进程;对于Debugger程序而言,最常用的创建选项就是:DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS。最后还有一个就是进程信息,我们调用CreateProcess创建了进程以后,Windows会将新创建的进程的相关信息全部放到ProcessInfo信息块中,我们在Debug Loop调试循环中使用进程信息块中的数据与目标进程交互,监视和控制目标进程的动作。
2.WaitForDebugEvent。
函数原型:BOOL WaitForDebugEvent(
LPDEBUG_EVENT lpDebugEvent, // Debug Event(调试事件指针)
DWORD dwMilliseconds // 超时设置
);
函数解析:该函数构成了Debug Loop调试循环的主体,一个Debugger程序在创建出目标进程后,一般都会紧接着循环调用该函数等待目标进程的各种调试信息,这个循环调用WaitForDebugEvent的过程,我们就称之为Debug Loop调试循环。调试循环是所有Debugger程序的主

当今最强32位系统级调试器! Syser Debugger 是基于X86平台专门为 Windows NT 架构的系统开发的内核级和应用级全图形界面的调试器.支持二进制汇编级调试和原代码级调试. Syser Debugger 支持 Windows 应用程序和 Windows 驱动程序的调试. Syser Debugger 完美的把 IDA Pro 和 Softice 以及 Ollydbg 的功能相结合,使操作 更加方便快捷.功能更加强大. 系统需求: 1.586/100 以上处理器(586/300+ 建议) 2.操作系统需求 Windows 2000,Window XP,Windows 2003或更新的版本。 3.至少256MB 物理内存 4.至少 5MB 的空闲磁盘空间 5.VGA 显卡。(分辨率 640*480 至少 16bit (65536)色) 6.鼠标或兼容的点设备.(PS2 Mouse,USB Mouse,TouchPad,TrackPoint) 程序特性: 1. 彩色反汇编支持. 2. 原代码级调试支持语法配色. 3. 原代码级调试支持原代码与汇编指令折叠式对映. 4. 支持动态加载与卸载. 5. 全键盘操作支持.(如果在没有鼠标设备的情况所有操作都可以用键盘来操作) 6. 全鼠标操作支持.(在没有键盘设备的情况可以用鼠标控制所有操作) 7. 命令兼容Softice 8. 多语言支持,底层全 unicode 实现. 9. 插件机制支持. 10. 多 CPU 的支持,支持 Intel Hyper-Threaded processors. 11. 支持启动脚本.(类似于批处理文件) 12. 支持剪切板功能,在3环拷贝数据到 0 环调试器中. 13. 可以和Softice和平共处.Softice 在 Syser 之后启动.Syser 也可以卸载. 甚至可以调试 softice. 14. PDB 调试符号文件的全面支持. 15. 自动装载驱动程序调试. 16. 支持调试时增加注释. 17. 支持书签功能. 18. 在反汇编窗口支持地址导航功能,通过鼠标双击快速浏览不同函数. 19. 原代码调试支持快速变量查看,通过移动鼠标到变量名上可以查看变量类型以及变量值. 20. Syser 实现了 IDA 和 Softice 以及 ollydbg 功能的完美结合. 21. 支持地址交叉引用列表. 22. 支持数据引用列表. 23. 支持 TouchPad,TrackPoint 点设备的高级处理模式. 24. 支持多数据窗口. 25. 支持多代码窗口方便汇编代码的浏览. 26. 支持 ollydbg 的 run trace 跟踪方式. 27. 调试符号文件的自动生成和自动加载机智。省去了 softice 原代码调试的   烦琐步骤.如果你开发和调试使用同一台机器.在你不改变原代码存放目   录的情况下,你只要在你编译出的可执行文件上点鼠标右键,在右键弹出菜单   中选择用 Debug with Syser 菜单项就可以进入我们的调试器进行原代码级   或汇编级调试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值