这一部分是入门篇项目:做一个简化调试器。目标不是替代成熟调试器,而是理解 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
2
3
4
5
启动/附加目标进程
等待调试事件
识别事件类型
记录日志或处理事件
继续目标进程

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、学习检查清单

检查项 状态
能说明调试器事件循环 待复盘
能列出常见调试事件 待复盘
能记录线程上下文和模块信息 待复盘
能区分断点异常和访问违规异常 待复盘
能设计一份调试器日志字段表 待复盘

调试器项目只用于自写程序、课程样本和授权环境。涉及断点、内存修改、异常控制时,只做学习和防护复盘。