10.2.1 函数检测
函数检测就是通过Windows自带的公开或未公开的函数直接检测程序是否处于调试状态。最简单的调试器检测函数是IsDebugger Present(),该函数的原型为“BOOL WINAPI IsDebuggerPresent(VOID)”,当检测到程序处于调试状态时返回“TRUE”。IsDebugger Present()函数的汇编代码如图10.32所示:

图10.32 IsDebuggerPresent()函数的汇编代码
不难发现,该函数实际上是从程序的PEB信息中取出PEB的第三个字节。PEB的数据结构如图10.33所示。

图10.33 PEB数据结构
可以看到,在PEB结构中,第三个字节正是成员BeingDebugged,也就是说,当进程处于调试状态时,系统会将该字节设定为1,实例代码如图10.34所示。

图10.34 调试PEB示例代码