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