3

如官方文档(closehandle API description)所述。

如果应用程序在调试器下运行,如果函数接收到无效的句柄值或伪句柄值,它将抛出异常。

因此,以下代码可用于检测程序是否正在调试(因为句柄 0x1 始终无效)。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string>

int _tmain(int argc, _TCHAR* argv[]){
    bool flag = false;
    __try {
        CloseHandle((HANDLE)0x1);
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        flag = true;
    }
    if (flag == false){
        printf("Not debugged\n");
    }else{
        printf("Debugged\n");
    }
}

我使用 Visual Studio 2008 编译了这段代码,创建了一个 32 位二进制文​​件。

它在 Windows XP 和 Windows 7 32 位上正常工作,但在 Windows 7 64 位上不能工作,因为它总是返回“未调试”。

你知道为什么会这样吗?谢谢你。

4

0 回答 0