0244、Windows 逆向攻防:断点类反调试
返回:Windows 逆向攻防篇 · 网络安全学习主页
这一节对应 16.0 - 16.3。断点是调试器的核心能力,反调试自然也会围绕断点做检测。学习重点是区分软件断点、硬件断点、内存断点的痕迹分别在哪里,以及样本如何通过异常或状态差异感知它们。
1、内容范围
| 小节 | 主题 | 复盘重点 |
|---|---|---|
| 16.0 | 硬件断点反调试检测 | 调试寄存器、线程上下文和异常事件 |
| 16.1 | 软件断点反调试检测 | INT 3 字节、代码完整性和断点恢复 |
| 16.2 | 内存断点反调试检测 | 页保护、访问异常和内存监控 |
| 16.3 | 动态监测与反调试 | 运行时状态变化、时间窗口和事件关联 |
2、逐节复盘
16.0 硬件断点反调试检测
硬件断点依赖 CPU 调试寄存器。它不一定修改目标代码字节,但会改变线程上下文。复盘时要关注当前线程和相关线程的调试寄存器状态。
| 项目 | 说明 |
|---|---|
DR0-DR3 |
记录断点地址 |
DR6 |
记录断点命中状态 |
DR7 |
控制断点启用和类型 |
| 线程上下文 | 断点通常与具体线程有关 |
16.1 软件断点反调试检测
软件断点常通过替换目标地址处的指令字节来触发异常。典型表现是代码区域出现断点指令。样本可能校验关键函数的首字节或整段哈希来发现断点。
| 观察点 | 复盘重点 |
|---|---|
| 代码字节 | 是否出现断点指令或异常补丁 |
| 文件对比 | 内存代码与磁盘文件是否一致 |
| 恢复行为 | 命中断点后调试器是否临时恢复指令 |
| 误判 | 热补丁、合法 Hook 也可能导致字节差异 |
16.2 内存断点反调试检测
内存断点通常依靠页保护或访问异常来观察某段内存是否被访问。它的痕迹更偏向内存页属性和异常事件,而不是函数入口字节。
| 项目 | 说明 |
|---|---|
| 页保护 | 关注 PAGE_GUARD、只读、不可访问等属性变化 |
| 异常事件 | 访问触发异常后由调试器或异常处理器接管 |
| 粒度 | 内存断点常以页为粒度,可能影响同页其他数据 |
| 复盘 | 记录页地址、保护属性、触发访问和处理路径 |
16.3 动态监测与反调试
断点类检测常常是动态的:程序运行到某个阶段才检查,检查完又恢复。只做静态快照容易漏掉,最好结合时间线、异常日志和调试器事件。
| 方法 | 复盘价值 |
|---|---|
| 前后快照 | 比较代码段、页属性、上下文变化 |
| 异常日志 | 记录断点、单步、访问异常 |
| 时间线 | 看检测发生在初始化、解密前还是关键分支前 |
| 调用栈 | 判断异常来自哪里、被谁处理 |
3、断点类型对比
| 类型 | 主要痕迹 | 检测侧重点 |
|---|---|---|
| 硬件断点 | 调试寄存器、线程上下文 | DRx、异常事件 |
| 软件断点 | 代码字节变化 | INT 3、哈希、文件对比 |
| 内存断点 | 页保护和访问异常 | 页属性、异常链、访问位置 |
| 动态检测 | 短时间变化 | 时间线和事件关联 |
4、学习检查清单
| 检查项 | 状态 |
|---|---|
| 能区分硬件、软件、内存断点的主要痕迹 | 待复盘 |
| 能说明为什么软件断点会改变代码字节 | 待复盘 |
| 能理解页保护异常和内存断点的关系 | 待复盘 |
| 能用时间线记录一次断点类反调试触发过程 | 待复盘 |
本节只用于识别断点类反调试和复盘调试现象,不整理反调试绕过步骤。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Ruiqy~!








