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

程式執行監視器:基於鉤子的應用程式啟動記錄與禁用程式攔截系統

     編輯:VC 教學

系統架構概覽

本系統由三大核心組件構成,實現全域程式執行監控、記錄審計與禁用程式攔截:

  • hwhpapp.exe:主控制程式,負責 UI、設定管理、日誌檢視、啟動項註冊
  • hwhpdrv.dll:全域鉤子 DLL,注入所有進程,攔截進程建立事件
  • 登錄啟動項:`HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run` 確保開機自動啟動

核心技術實現

1. 進程建立攔截鉤子

採用 WH_CBT (Computer-Based Training) 鉤子攔截 `HCBT_CREATEWND` 事件,或使用 **Windows 內核回呼** `PsSetCreateProcessNotifyRoutine` (需驅動程式簽章)。用戶模式下常見方案:

  • AppInit_DLLs 登錄機制 (已棄用/受限)
  • WH_SHELL + HSHELL_WINDOWCREATED 攔截視窗建立
  • WMI 事件訂閱 `Win32_ProcessStartTrace` (無需注入)
  • ETW (Event Tracing for Windows) 核心級追蹤 `Microsoft-Windows-Kernel-Process`

2. 禁用程式攔截邏輯


// 伪代码:鉤子回呼中檢查進程名稱
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HCBT_CREATEWND) {
        CBT_CREATEWND* cbt = (CBT_CREATEWND*)lParam;
        HWND hWnd = (HWND)wParam;
        
        // 取得進程映像名稱
        DWORD pid = 0; GetWindowThreadProcessId(hWnd, &pid);
        HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
        if (hProc) {
            char path[MAX_PATH];
            if (GetProcessImageFileName(hProc, path, MAX_PATH)) {
                // 比對禁用清單 (支援萬用字元、路徑、雜湊)
                if (IsInBlockList(path)) {
                    // 終止進程
                    HANDLE hTerm = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
                    if (hTerm) { TerminateProcess(hTerm, 0); CloseHandle(hTerm); }
                    
                    // 記錄日誌
                    LogEvent("BLOCKED", path, pid);
                    return -1; // 阻止視窗建立
                }
            }
            CloseHandle(hProc);
        }
    }
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

3. 日誌格式規格


// 系統啟動/關機
2003-02-03 17:31:25 - [System Startup - Windows XP 5.01.2600]
2003-02-03 17:32:50 - [System Shutdown - 0 days, 0 hrs, 1 mins, 25 secs]

// 一般程式啟動
2003-02-03 17:31:29 "CabinetWClass" -> "我的電腦"

// 禁用程式攔截
2003-02-03 17:31:59 "Red Alert" -> "Red Alert" (關閉禁用程式)
2003-02-03 17:32:19 "掃雷" -> "掃雷" (關閉禁用程式)

部署與持久化

1. 開機自動啟動註冊


// 安裝時寫入登錄
HKEY hKey;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, 
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 
    0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
RegSetValueEx(hKey, "HWHPMonitor", 0, REG_SZ, 
    (BYTE*)"C:\\Program Files\\HWHP\\hwhpapp.exe", strlen(...));
RegCloseKey(hKey);

2. 服務化部署 (推薦現代做法)

  • 將監控邏輯封裝為 **Windows Service** (使用 `SERVICE_AUTO_START`)
  • 服務在 Session 0 執行,不受使用者登入/登出影響
  • 使用 `CreateProcessAsUser` 或 `WTSQueryUserToken` 在使用者 Session 啟動 UI 代理程式
  • 避免 `Run` 登錄項易被禁用/刪除、受 UAC 限制

進階功能擴展

功能實現技術應用場景
命令列參數記錄WMI `CommandLine` 屬性 / ETW惡意腳本偵測、合規審計
父進程追蹤工具幫助庫 `th32ParentProcessID` / ETW攻擊鏈重建、異常啟動鏈識別
檔案雜湊驗證SHA-256 計算 + 白名單資料庫防範檔案替換攻擊、供應鏈安全
網路連線關聯WFP (Windows Filtering Platform) / ETW惡意軟體 C2 通訊偵測
使用者行為分析時間序列聚類、異常檢測演算法內部威脅識別、影子 IT 發現

安全性與合規考量

⚠ 法律與道德邊界:
  • **企業環境**:需符合勞動法規、隱私權法 (GDPR Art. 88、個資法)、勞動契約約定,通常需書面告知並取得同意
  • **個人裝置**:嚴禁未經授權部署,構成監控軟體/間諜軟體
  • **資料保護**:日誌屬個人資料,需加密儲存、存取控制、保留期限管理、資料主體存取權保障
  • **透明度**:提供使用者查看記錄、匯出資料、要求刪除機制

現代替代架構

  • Sysmon (System Monitor):Microsoft 官方免費工具,ETW 為基礎,事件 ID 1 (Process Create)、3 (Network Connect)、11 (File Create) 等,配合 SIEM 分析
  • Windows Defender Application Control (WDAC):簽章式應用程式控制,核心層級攔截未授權執行檔
  • AppLocker:規則式應用程式限制 (路徑、發布者、雜湊),企業版功能
  • EDR/XDR 代理程式:CrowdStrike, SentinelOne, Microsoft Defender for Endpoint 等商業解決方案

結語

基於鉤子的程式執行監視器展示了經典的用戶模式監控架構:全域鉤子注入、進程建立攔截、禁用清單比對、日誌審計。然而現代 Windows 安全架構 (VBS/HVCI、PPL、ETW、WDAC) 已提供更強健、相容、合規的原生替代方案。新專案開發**強烈建議**採用 Sysmon + WDAC/AppLocker + EDR 組合,僅在極特殊相容性需求下考慮用戶模式鉤子方案,並嚴格遵守法律合規與隱私保護原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved