1

ZwQuerySystemInformation 関数呼び出しを使用して、プログラムがシステム モード デバッガーで実行されているかどうかを判断しようとしています。

これまでのところ、ntdll.dll ライブラリをロードして ZwQuerySystemInformation のアドレスを取得する次のコードがあります。次に、返されたハンドルを適切な引数で呼び出して、SystemKernelDebuggerInformation 情報を取得する必要があります。

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


int _tmain(int argc, _TCHAR* argv[])
{
    /* load the ntdll.dll */
    HMODULE lib = LoadLibrary(_T("ntdll.dll"));
    FARPROC fun = GetProcAddress(lib, "ZwQuerySystemInformation");
    if(fun == NULL) {
        printf("Error: could not find the function ZwQuerySystemInformation in library ntdll.dll.");
        exit(-1);
    }
    printf("ZwQuerySystemInformation is located at 0x%08x in ntdll.dll.\n", (unsigned int)fun);


    SYSTEM_INFORMATION_CLASS sic = SystemKernelDebuggerInformation;
    SYSTEM_BASIC_INFORMATION sbi;

    NTSTATUS WINAPI temp = NtQuerySystemInformation(sic, &sbi, sizeof(sbi), NULL);


    /* wait */
    getchar();

    return 0;
}

その関数を呼び出して SystemKernelDebuggerInformation 情報を含むシステム情報を取得する方法を教えてください。それで十分だろう、あとは俺がやろう。

ありがとうございました

4

1 に答える 1

1

CheckDebugger_Method3を見てください

     int main(){
    typedef long NTSTATUS; 
    #define STATUS_SUCCESS    ((NTSTATUS)0L) 
    HANDLE hProcess = GetCurrentProcess();
    typedef struct _SYSTEM_KERNEL_DEBUGGER_INFORMATION { 
                 BOOLEAN DebuggerEnabled; 
                 BOOLEAN DebuggerNotPresent; 
    } SYSTEM_KERNEL_DEBUGGER_INFORMATION, *PSYSTEM_KERNEL_DEBUGGER_INFORMATION; 
    enum SYSTEM_INFORMATION_CLASS { SystemKernelDebuggerInformation = 35 }; 
    typedef NTSTATUS  (__stdcall *ZW_QUERY_SYSTEM_INFORMATION)(IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength); 
    ZW_QUERY_SYSTEM_INFORMATION ZwQuerySystemInformation;
    SYSTEM_KERNEL_DEBUGGER_INFORMATION Info;
    HMODULE hModule = GetModuleHandle("ntdll.dll");
    if (!hModule) {
        return FALSE;
    }
    ZwQuerySystemInformation = (ZW_QUERY_SYSTEM_INFORMATION)GetProcAddress(hModule, "ZwQuerySystemInformation");
    if (ZwQuerySystemInformation) {
        if (STATUS_SUCCESS == ZwQuerySystemInformation(SystemKernelDebuggerInformation, &Info, sizeof(Info), NULL)) {
            if (Info.DebuggerEnabled&&!Info.DebuggerNotPresent) {
                return TRUE;
            }
        }
    }
    return FALSE;
}

ZwQuerySystemInformationは、Windows 8 の時点で使用できなくなりました

于 2013-02-10T07:06:40.083 に答える