萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

防禦 Windows 全域鉤子注入:Hook LoadLibraryExW 阻惡意 DLL 載入

全域鉤子原理與風險

Windows 訊息鉤子(Hook)廣泛用於鍵盤記錄、密碼竊取等惡意行為。核心流程:系統透過 NtUserSetWindowsHookEx 註冊全域鉤子,事件觸發時若目標進程未載入對應 DLL,即呼叫 LoadLibraryExW 強制載入,進而注入惡意代碼。

防禦思路:攔截 LoadLibraryExW 讓惡意 DLL 載入失敗

在載入鉤子 DLL 前,Hook LoadLibraryExW 並判斷呼叫來源;若來自 user32.dll 區塊(鉤子機制典型呼叫者),直接回傳 0 導致載入失敗。系統會重試,但性能影響極微。

核心程式碼範例(使用 Microsoft Detours 庫)

typedef HMODULE (__stdcall *LOADLIB)(LPCWSTR, HANDLE, DWORD);
extern "C" {
    DETOUR_TRAMPOLINE(HMODULE __stdcall Real_LoadLibraryExW(LPCWSTR, HANDLE, DWORD), LoadLibraryExW);
}
ULONG user32 = 0;

HMODULE __stdcall Mine_LoadLibraryExW(LPCWSTR lpwLibFileName, HANDLE hFile, DWORD dwFlags) {
    ULONG addr;
    _asm mov eax, [ebp+4]
    _asm mov addr, eax
    if ((user32 & 0xFFFF0000) == (addr & 0xFFFF0000)) return 0; // 來自 user32 區塊則阻擋
    return ((LOADLIB)Real_LoadLibraryExW)(lpwLibFileName, hFile, dwFlags);
}

BOOL ProcessAttach() {
    DetourFunctionWithTrampoline((PBYTE)Real_LoadLibraryExW, (PBYTE)Mine_LoadLibraryExW);
    return TRUE;
}
BOOL ProcessDetach() {
    DetourRemove((PBYTE)Real_LoadLibraryExW, (PBYTE)Mine_LoadLibraryExW);
    return TRUE;
}

CAnti_HookApp::CAnti_HookApp() {
    user32 = (ULONG)GetModuleHandle(L"User32.dll");
    ProcessAttach();
}

優化建議

  • 加入白名單機制,允許合法鉤子(如輸入法、輔助工具)載入。
  • 結合行為分析(如檢測鍵盤訊息異常頻率)提升準確度。
  • 部署於關鍵進程(瀏覽器、郵件用戶端、VPN 用戶端)以保護敏感輸入。

結語

全域鉤子是雙面刃,合法應用與惡意監控同樣依賴此機制。透過 Hook 關鍵 API(LoadLibraryExW)並判斷呼叫上下文,可有效阻擋惡意 DLL 注入,保護使用者輸入隱私。實務部署時需平衡相容性與安全性,建議搭配白名單與行為分析。

copyright © 萬盛學電腦網 all rights reserved