这一节对应 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、学习检查清单

检查项 状态
能区分硬件、软件、内存断点的主要痕迹 待复盘
能说明为什么软件断点会改变代码字节 待复盘
能理解页保护异常和内存断点的关系 待复盘
能用时间线记录一次断点类反调试触发过程 待复盘

本节只用于识别断点类反调试和复盘调试现象,不整理反调试绕过步骤。