Windows 訊息驅動架構中,Hook 是插入訊息處理流程的「鉤子」,允許攔截、監控、修改系統或應用程式的訊息/函數調用。分類:
WH_KEYBOARD, WH_MOUSE, WH_GETMESSAGE 等),注入目標進程。IMAGE_IMPORT_DESCRIPTOR 陣列,每個 DLL 對應一項。OriginalFirstThunk (INT) → IMAGE_THUNK_DATA[] → IMAGE_IMPORT_BY_NAME (函數名/序號) FirstThunk (IAT) → IMAGE_THUNK_DATA[] → **運行時填入實際函數地址**
**關鍵洞察**:載入完成後,**IAT (FirstThunk) 存放真實函數地址**,修改 IAT 中目標函數對應項即可重導調用。
// 簡化邏輯:遍歷模組 Import Directory
PIMAGE_IMPORT_DESCRIPTOR pImport = ...;
while (pImport->Name) {
char *dllName = (char*)RVA2VA(pImport->Name);
if (_stricmp(dllName, "user32.dll") == 0) {
PIMAGE_THUNK_DATA pINT = (PIMAGE_THUNK_DATA)RVA2VA(pImport->OriginalFirstThunk);
PIMAGE_THUNK_DATA pIAT = (PIMAGE_THUNK_DATA)RVA2VA(pImport->FirstThunk);
while (pINT->u1.AddressOfData) {
PIMAGE_IMPORT_BY_NAME pName = (PIMAGE_IMPORT_BY_NAME)RVA2VA(pINT->u1.AddressOfData);
if (strcmp((char*)pName->Name, "MessageBoxW") == 0) {
// 找到目標:pIAT 指向的位置即為 IAT 條目
// 修改 *pIAT = (ULONG_PTR)MyMessageBoxW;
}
++pINT; ++pIAT;
}
}
++pImport;
}
// HookDll.cpp
#pragma data_seg("SHARE")
HINSTANCE g_hDll = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/SECTION:SHARE,RWS") // 讀寫共享
// HookDll.def
LIBRARY HookDll
EXPORTS
SetHook
Unhook
SECTIONS
SHARE READ WRITE SHARED
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
// 在目標進程上下文執行
if (!g_hooked) {
HookIAT("user32.dll", "MessageBoxW", (PROC)MyMessageBoxW);
g_hooked = TRUE;
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) {
// 修改參數、記錄日誌、攔截調用
return RealMessageBoxW(hWnd, lpText, L"Hooked!", uType);
}
// Client.exe
DWORD tid = GetWindowThreadProcessId(hTargetWnd, NULL);
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hDll, tid);
// ...
UnhookWindowsHookEx(g_hHook);
MessageBox 實際導出為 MessageBoxA / MessageBoxW。目標程式呼叫哪個就 Hook 哪個,否則不生效。
WriteProcessMemory 跨進程寫入,權限複雜且易被殺毒攔截。void UnhookIAT() {
*pIAT_Entry = (ULONG_PTR)RealMessageBoxW; // 還原原地址
}
| 攻擊手法 | 防禦對策 |
|---|---|
| IAT Hook 竊取密碼/攔截加密 | 關鍵 API 內聯檢查、IAT 完整性校驗 (CFG/CET) |
| Inline Hook (修改函數開頭指令) | 代碼完整性簽名、硬體斷點監控 |
| DLL 注入 (SetWindowsHookEx / 遠程線程) | 簽名強制、PPL 保護進程、EDR 行為分析 |