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

Windows 2000 修改受保護註冊表鍵權限:ACL 編程實戰

     編輯:關於C++

問題場景

Win2K 部分註冊表鍵(如 HKLM\SYSTEM\ControlSet001\Enum\Root)默認拒絕寫入,提權也難繞過。需編程修改 DACL(自主訪問控制列表)賦予權限,操作完成後恢復原狀。

核心 API 流程

  1. GetNamedSecurityInfo 獲取目標鍵現有安全描述符與 Old DACL。
  2. BuildExplicitAccessWithName 構建 EXPLICIT_ACCESS 結構,指定 Everyone 擁有 GENERIC_ALL 並可繼承 (SUB_CONTAINERS_AND_OBJECTS_INHERIT)。
  3. SetEntriesInAcl 合併新舊 ACE 生成 New DACL。
  4. SetNamedSecurityInfo 寫入新 DACL,獲得完全控制權。
  5. 執行註冊表讀寫操作。
  6. 反向操作:構建只讀 ACE,合併回 Old DACL,寫入恢復原權限。
  7. LocalFree 釋放所有分配的安全描述符與 ACL 緩衝區。

完整 C++ 代碼片段


LPTSTR lpObjectName = "MACHINE\\SYSTEM\\ControlSet001\\Enum\\Root";
SE_OBJECT_TYPE ObjectType = SE_REGISTRY_KEY;
PACL OldDACL = NULL, NewDACL = NULL;
PSECURITY_DESCRIPTOR SD = NULL;
EXPLICIT_ACCESS ea;

// 初始化空 ACL
SetEntriesInAcl(0, NULL, NULL, &OldDACL);
SetEntriesInAcl(0, NULL, NULL, &NewDACL);

// 獲取現有 DACL
if (GetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION,
    NULL, NULL, &OldDACL, NULL, &SD) != ERROR_SUCCESS) return;

// 構建完全控制 ACE
ZeroMemory(&ea, sizeof(ea));
BuildExplicitAccessWithName(&ea, "Everyone", GENERIC_ALL, SET_ACCESS,
    SUB_CONTAINERS_AND_OBJECTS_INHERIT);

// 合併生成新 DACL
if (SetEntriesInAcl(1, &ea, OldDACL, &NewDACL) == ERROR_SUCCESS) {
    SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION,
        NULL, NULL, NewDACL, NULL);
}

// ... 此處執行註冊表操作 ...

// 恢復原權限:構建只讀 ACE 覆蓋回 OldDACL
BuildExplicitAccessWithName(&ea, "Everyone", GENERIC_READ, SET_ACCESS, NO_INHERITANCE);
SetEntriesInAcl(1, &ea, NULL, &OldDACL);
SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION,
    NULL, NULL, OldDACL, NULL);

// 清理資源
if (SD) LocalFree((HLOCAL)SD);
if (NewDACL) LocalFree((HLOCAL)NewDACL);
if (OldDACL) LocalFree((HLOCAL)OldDACL);

關鍵提示

  • 需包含 <aclapi.h> 並鏈接 Advapi32.lib。
  • 操作需管理員權限進程上下文。
  • 務必在 finally 或 goto Cleanup 確保權限回滾與資源釋放,避免留下安全隱患。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved