普通使用者程序無法 OpenProcess(PROCESS_ALL_ACCESS, ...) 系統服務進程 (低 PID)。需啟用 SeDebugPrivilege 特權才能對系統進程進行完整操作 (偵錯器必備)。
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LUID luid;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); // "SeDebugPrivilege"
TOKEN_PRIVILEGES tp = {1, {{luid, SE_PRIVILEGE_ENABLED}}};
AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
CloseHandle(hToken);
BOOL EnableDebugPrivilege() {
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE;
TOKEN_PRIVILEGES tp = {1, {{0, SE_PRIVILEGE_ENABLED}}};
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) {
CloseHandle(hToken); return FALSE;
}
BOOL ok = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
CloseHandle(hToken);
return ok && GetLastError() != ERROR_NOT_ALL_ASSIGNED;
}
| 符號名稱 | 字串值 | 用途 |
|---|---|---|
SE_DEBUG_NAME | SeDebugPrivilege | 偵錯/存取任意進程 |
SE_BACKUP_NAME | SeBackupPrivilege | 備份檔案/目錄 |
SE_RESTORE_NAME | SeRestorePrivilege | 還原檔案/目錄 |
SE_SHUTDOWN_NAME | SeShutdownPrivilege | 關機系統 |
SE_TAKE_OWNERSHIP_NAME | SeTakeOwnershipPrivilege | 取得物件擁有權 |
w2k_dbg.dll 提供 dbgPrivilegeSet() (通用) 與 dbgPrivilegeDebug() (專針偵錯特權) 封裝