原理
在没有调试器的情况下,程序默认没有 “调试权限” 的,在默认权限下使用 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调试:
正常启动: