0215、Windows 逆向入门:调试器项目
这一部分是入门篇项目:做一个简化调试器。目标不是替代成熟调试器,而是理解 Windows 调试事件如何流转,进程、线程、模块、异常、断点和日志如何组织。
1、内容范围
| 小节 | 内容 | 复盘点 |
|---|---|---|
| 26.4 - 26.9 | 调试器框架 | 打开/附加进程、调试事件、用户交互 |
| 27.0 - 27.9 | 调试事件处理 | 创建进程、退出、异常、日志、转储 |
| 28.0 - 28.9 | 线程信息 | 线程上下文、TEB、栈、时间、模块定位 |
| 29.0 - 29.9 | 模块信息 | 模块结构、文件映射、导入导出、卸载、异常派发 |
| 30.0 - 31.1 | 异常与断点 | SEH/VEH、断点设置/移除、单步执行 |
| 31.2 - 31.5 | 路线收尾 | 开发篇、逆向篇、调试篇和提升方向 |
2、调试器基本循环
简化模型:
1 | 启动/附加目标进程 |
3、常见调试事件
| 事件 | 复盘内容 |
|---|---|
| 创建进程 | 目标路径、入口点、主线程 |
| 创建线程 | 线程 ID、入口地址 |
| 加载 DLL | 模块基址、路径、大小 |
| 卸载 DLL | 模块移除 |
| 异常 | 异常码、地址、一/二次机会 |
| 输出调试字符串 | 程序主动输出的信息 |
| 退出进程/线程 | 返回码和生命周期 |
4、进程与线程数据
调试器要维护目标进程状态:
| 数据 | 用途 |
|---|---|
| PID/TID | 关联事件 |
| 线程上下文 | 寄存器、指令指针、栈指针 |
| TEB/PEB | 线程/进程环境 |
| 栈范围 | 回溯和异常分析 |
| 模块列表 | 判断地址属于哪个模块 |
5、模块信息
模块加载事件能帮助判断某个地址属于主程序、系统 DLL 还是第三方模块。
| 字段 | 说明 |
|---|---|
| BaseAddress | 模块基址 |
| SizeOfImage | 模块内存大小 |
| Path | 模块路径 |
| Version | 版本信息 |
| Sections | 节区属性 |
6、异常处理
调试器会先看到很多异常。要记录异常码、异常地址、线程 ID 和是否继续执行。
| 异常 | 常见含义 |
|---|---|
| 断点异常 | 软件断点或系统初始断点 |
| 单步异常 | Trap Flag |
| 访问违规 | 非法读写执行 |
| 除零 | 整数除零 |
7、断点管理
断点管理需要保存原始字节、断点地址、所属线程/模块和启用状态。学习项目只做授权样本,不对第三方程序做未授权修改。
8、单步执行
单步依赖 Trap Flag。复盘时观察 RFLAGS/EFLAGS、异常事件和下一条指令地址。
9、日志与交互框架
一个可复盘的调试器项目至少要有结构化日志。
| 字段 | 说明 |
|---|---|
| 时间 | 事件发生时间 |
| 事件类型 | 进程、线程、模块、异常 |
| PID/TID | 关联对象 |
| 地址 | 事件位置 |
| 说明 | 人类可读摘要 |
10、学习检查清单
| 检查项 | 状态 |
|---|---|
| 能说明调试器事件循环 | 待复盘 |
| 能列出常见调试事件 | 待复盘 |
| 能记录线程上下文和模块信息 | 待复盘 |
| 能区分断点异常和访问违规异常 | 待复盘 |
| 能设计一份调试器日志字段表 | 待复盘 |
调试器项目只用于自写程序、课程样本和授权环境。涉及断点、内存修改、异常控制时,只做学习和防护复盘。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!










