在 Win7 64 位系統下,以普通用戶權限透過 CBT Hook (SetWindowsHookEx(WH_CBT, ...)) 將 64 位 DLL 注入任務管理器 (taskmgr.exe) 成功。但點擊「顯示所有用戶進程」按鈕後,任務管理器重啟並提升至 Administrator 權限,原本注入的 DLL 隨即失效,無法再次 Hook。
| 方案 | 原理 | 優點 | 缺點/風險 |
|---|---|---|---|
| 1. 以 Administrator 身分運行 Hook 程式 | 提升安裝者 IL 至 High,匹配目標 | 最簡單,代碼無需改動 | 需用戶手動提權或關閉 UAC,不適合自動化部署 |
| 2. 使用 Windows Service (SYSTEM 權限) 安裝全域 Hook | 服務以 SYSTEM (High+) 運行,可 Hook 任何 IL 進程 | 持久化、無需用戶干預 | 架構複雜,需 IPC 與 UI 進程通訊,安全審計嚴格 |
| 3. 改用「應用程式相容性鏈接」 (AppInit_DLLs / Image File Execution Options) | 系統載入階段強制注入 | 極早介入,不受 IL 限制 | 註冊表修改需高權限,影響範圍過廣,易導致系統不穩,現代 Windows 已限制 |
| 4. 重新設計:避免 Hook 任務管理器 | 改用 WMI、PDH、ETW、Performance Counter 等官方 API 獲取進程資訊 | 合規、穩定、無權限問題 | 可能無法滿足特定 UI 級監控需求 |
優先選擇方案 4:除非極特殊需求(如防毒、EDR、監控軟體),否則不應 Hook 系統關鍵進程。改用 PdhAddEnglishCounter、WTSEnumerateProcesses、GetPerformanceInfo 等公開 API 獲取進程/效能資料,配合 SetWinEventHook (EVENT_OBJECT_CREATE/DESTROY) 監聽進程生命週期,完全避開注入與權限地雷區。
// 需連結 Psapi.lib
#include
#include
void ListAllProcesses() {
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe = { sizeof(pe) };
if (Process32First(hSnap, &pe)) {
do {
HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pe.th32ProcessID);
if (hProc) {
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileNameEx(hProc, NULL, szPath, MAX_PATH);
_tprintf(_T("PID:%5u %s\n"), pe.th32ProcessID, szPath);
CloseHandle(hProc);
}
} while (Process32Next(hSnap, &pe));
}
CloseHandle(hSnap);
}
CBT Hook 失效本質是 Mandatory Integrity Control 阻擋跨 IL 注入。理解 UAC 虛擬化與 IL 機制,避免對抗系統安全架構,轉而使用官方診斷 API,才是長久穩健之道。