Windows 訊息鉤子(Hook)廣泛用於鍵盤記錄、密碼竊取等惡意行為。核心流程:系統透過 NtUserSetWindowsHookEx 註冊全域鉤子,事件觸發時若目標進程未載入對應 DLL,即呼叫 LoadLibraryExW 強制載入,進而注入惡意代碼。
在載入鉤子 DLL 前,Hook LoadLibraryExW 並判斷呼叫來源;若來自 user32.dll 區塊(鉤子機制典型呼叫者),直接回傳 0 導致載入失敗。系統會重試,但性能影響極微。
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();
}
全域鉤子是雙面刃,合法應用與惡意監控同樣依賴此機制。透過 Hook 關鍵 API(LoadLibraryExW)並判斷呼叫上下文,可有效阻擋惡意 DLL 注入,保護使用者輸入隱私。實務部署時需平衡相容性與安全性,建議搭配白名單與行為分析。