首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 調整程序權限啟用偵錯特權 (SeDebugPrivilege)

     編輯:關於C++

提升程序權限以存取系統進程:四步驟啟用 SeDebugPrivilege

普通使用者程序無法 OpenProcess(PROCESS_ALL_ACCESS, ...) 系統服務進程 (低 PID)。需啟用 SeDebugPrivilege 特權才能對系統進程進行完整操作 (偵錯器必備)。

四步驟 API 流程

  1. 開啟程序存取權杖
    HANDLE hToken;
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
  2. 查詢特權 LUID
    LUID luid;
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);  // "SeDebugPrivilege"
  3. 調整權杖特權
    TOKEN_PRIVILEGES tp = {1, {{luid, SE_PRIVILEGE_ENABLED}}};
    AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
  4. 關閉權杖句柄
    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;
}

常見特權常數 (winnt.h)

符號名稱字串值用途
SE_DEBUG_NAMESeDebugPrivilege偵錯/存取任意進程
SE_BACKUP_NAMESeBackupPrivilege備份檔案/目錄
SE_RESTORE_NAMESeRestorePrivilege還原檔案/目錄
SE_SHUTDOWN_NAMESeShutdownPrivilege關機系統
SE_TAKE_OWNERSHIP_NAMESeTakeOwnershipPrivilege取得物件擁有權

現成工具庫

  • w2k_dbg.dll 提供 dbgPrivilegeSet() (通用) 與 dbgPrivilegeDebug() (專針偵錯特權) 封裝

注意事項

  • 需管理員權限執行 (UAC 提升)
  • 特權調整僅影響當前程序,不影響系統全域
  • 濫用偵錯特權可能導致系統不穩定,僅在必要時啟用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved