10.2.7 断点检测
2025年09月21日
10.2.7 断点检测
断点检测功能根据调试器设置断点的技术原理来检测软件代码中是否设置了断点,其实也是一种行为检测。由于调试器设置断点时有明显的特征,因此这里单独讨论。
在调试器中,一般使用两种方式设置代码断点:一种是通过修改代码指令为int3触发软件异常;另外一种是通过硬件调试寄存器设定硬件断点。针对不同的断点设置类型有不同的侦测办法,一般针对软件断点,保护系统会试图分析比较重要的代码区域,然后检测指令是否存在设计之外的int3指令。一般的程序中除了异常捕获外很少使用int3,如果这些int3在函数入口处,则不太可能是编译器生成的,如图10.41所示。
图10.41 断点检测汇编代码
图10.41中的代码不可能由编译器编译生成。在函数入口处一般都是跨模块处理的,根据异常处理机制,在设置异常处理程序之前,模块外的异常处理程序很难处理其他模块的异常,因此这段代码一旦执行必定引起程序异常。而调试程序时,在函数入口设定断点是非常正常的,所以,如果保护系统侦测到类似这样的代码,就可以判定存在调试器。
硬件断点的侦测要复杂一些。由于程序工作在保护模式下,无法访问硬件调试断点,因此在保护系统中,如果要侦测硬件断点,一般需要构建异常程序来获取dr系列寄存器的值。
断点侦测是一个非常有用的侦测手段,但是其应用非常困难,这主要是由其效率低,确定关键代码比较困难造成的。