检查中断处理程序¶
中断是处理器发送以触发 Windows 内核中相应处理程序的信号。中断通常由硬件事件生成,但也可以用 INT 汇编指令在软件中生成。内核允许一些中断——即中断 0x2D 和 0x03——以异常处理程序的形式触发用户模式中断处理程序。你可以利用这些中断检测调试器。
调试器在指令上设置断点时,会用断点指令(如 INT 0x03)替换该指令。中断执行时,调试器通过处理程序收到通知,处理断点、替换原始代码,并让应用程序无缝恢复执行。面对无法识别的中断时,一些调试器甚至会静默跳过该中断,让执行正常继续,不触发任何其他异常处理程序。
你可以通过在代码中的异常处理程序内有目的地生成中断来检测这种行为,如清单 12-1 所示。
inline bool Has2DBreakpointHandler() {
__try { __asm INT 0x2D }
__except (EXCEPTION_EXECUTE_HANDLER){ return
false; }
return true;
}
inline bool Has03BreakpointHandler() {
__try { __asm INT 0x03 }
__except (EXCEPTION_EXECUTE_HANDLER){ return
false; }
return true;
}
清单 12-1:检测中断处理程序
正常执行期间,这些中断会触发代码中包围它们的异常处理程序。调试会话期间,一些调试器可能会拦截这些中断生成的异常并静默忽略,阻止包围的异常处理程序执行。因此,如果中断没有触发你的异常处理程序,就存在调试器。