原理
在沒有調試器的情況下,程式預設沒有 “調試權限” 的,在預設權限下使用 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調試:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM2EDN1MTM5UTOlNWZiRDZyYzX2QDMwATM4EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
正常啟動: