天天看點

反調試 - OpenProcess 權限

原理

在沒有調試器的情況下,程式預設沒有 “調試權限” 的,在預設權限下使用 OpenProcess 已 PROCESS_QUERY_LIMITED_INFORMATION 作為第一個參數是無法打開類似與 Csrss.exe 這種系統程序的。但如果程式處于被調試狀态,就會被賦予一個 “調試權限”,這時 OpenProcess 就會成功。

代碼示例

// Test_Console_1.cpp : 此檔案包含 "main" 函數。程式執行将在此處開始并結束。
//

#include <iostream>
#include <Windows.h>
#include <intrin.h>

using namespace std;

typedef NTSTATUS(WINAPI* pCsrGetProcessId)();

int main()
{
    // 擷取 csrss.exe 程序 ID
    HANDLE h_csrss = NULL;
    pCsrGetProcessId CsrGetProcessId = (pCsrGetProcessId)GetProcAddress(LoadLibrary(L"ntdll.dll"), "CsrGetProcessId");
    if (CsrGetProcessId == NULL) {
        goto main_end;
    }

    // 使用 PROCESS_QUERY_LIMITED_INFORMATION 權限打開 csrss.exe
    h_csrss = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, CsrGetProcessId());
    if (h_csrss) {
        cout << "發現調試器!" << endl;
    }
    else {
        cout << "沒有調試器" << endl;
    }

main_end:
    getchar();
    return 0;
}      

效果圖

vs調試:

反調試 - OpenProcess 權限

正常啟動:

下一篇: 崩潰恢複