什么是 IAT Hook?
IAT(Import Address Table)Hook 是一種 通過修改導入表中的函數地址來實現 API 劫持 的技術,適合針對當前進程的 API 替換,不依賴于 DLL 注入或系統級鉤子。
本例目標
劫持 CreateFileW(或 CreateFileA)函數:
?? 步驟 1:聲明 CreateFile 函數指針
點擊查看代碼
#include <windows.h>
#include <iostream>
typedef HANDLE(WINAPI* PFN_CreateFileW)(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
PFN_CreateFileW OriginalCreateFileW = nullptr;
點擊查看代碼
HANDLE WINAPI HookedCreateFileW(
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
) {
std::wcout << L"[IAT-HOOK] 攔截到 CreateFileW:" << lpFileName << std::endl;
// 可以替換文件路徑示例
// lpFileName = L"C:\\Hooked.txt";
return OriginalCreateFileW(
lpFileName,
dwDesiredAccess,
dwShareMode,
lpSecurityAttributes,
dwCreationDisposition,
dwFlagsAndAttributes,
hTemplateFile
);
}
點擊查看代碼
void HookIAT_CreateFileW() {
// 獲取模塊基址(當前 exe)
HMODULE hModule = GetModuleHandle(NULL);
if (!hModule) return;
// 獲取 DOS 和 PE 頭
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS ntHeader = (PIMAGE_NT_HEADERS)((BYTE*)hModule + dosHeader->e_lfanew);
// 獲取 Import Directory 表
IMAGE_DATA_DIRECTORY importDir = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
if (!importDir.VirtualAddress) return;
PIMAGE_IMPORT_DESCRIPTOR importDesc = (PIMAGE_IMPORT_DESCRIPTOR)((BYTE*)hModule + importDir.VirtualAddress);
// 遍歷導入表
for (; importDesc->Name != 0; importDesc++) {
LPCSTR moduleName = (LPCSTR)((BYTE*)hModule + importDesc->Name);
if (_stricmp(moduleName, "KERNEL32.dll") != 0)
continue;
// 找到 FirstThunk(IAT 表)
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)((BYTE*)hModule + importDesc->FirstThunk);
for (; pThunk->u1.Function != 0; pThunk++) {
FARPROC* ppFunc = (FARPROC*)&pThunk->u1.Function;
if (*ppFunc == (FARPROC)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CreateFileW")) {
// 保存原始函數
OriginalCreateFileW = (PFN_CreateFileW)*ppFunc;
// 修改內存保護屬性為可寫
DWORD oldProtect;
VirtualProtect(ppFunc, sizeof(FARPROC), PAGE_EXECUTE_READWRITE, &oldProtect);
// 替換函數指針
*ppFunc = (FARPROC)HookedCreateFileW;
// 恢復保護
VirtualProtect(ppFunc, sizeof(FARPROC), oldProtect, &oldProtect);
std::cout << "[OK] CreateFileW IAT Hook 成功" << std::endl;
return;
}
}
}
}
點擊查看代碼
void TestCreateFile() {
HANDLE hFile = CreateFileW(
L"C:\\Windows\\System32\\notepad.exe",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if (hFile != INVALID_HANDLE_VALUE) {
std::cout << "[Test] CreateFile 成功打開文件" << std::endl;
CloseHandle(hFile);
} else {
std::cout << "[Test] CreateFile 打開失敗,錯誤碼: " << GetLastError() << std::endl;
}
}
點擊查看代碼
int main() {
HookIAT_CreateFileW(); // 執行 Hook
TestCreateFile(); // 測試調用
return 0;
}
| 應用場景 | 舉例說明 |
|---|---|
| ??? 安全防護 / 防作弊 | 攔截游戲中的 CreateFile、ReadProcessMemory,防止外掛注入 |
| ?? 軟件注入 / 插件系統 | 替換 LoadLibrary、CreateFile,控制哪些 DLL/文件能被加載/訪問 |
| ?? 逆向分析 / 惡意軟件行為監控 | Hook CreateProcess、WriteFile,觀察病毒行為 |
| ?? 動態調試 / 熱更新模塊 | 把原本導入的函數指向你自己的函數,做動態替換 |
| ??? 日志審計 / 文件訪問記錄 | 攔截 CreateFileW,打印訪問的文件名到日志中 |
| ?? 程序透明代理 / 沙箱隔離 | 攔截網絡類 API(如 connect、send),做透明代理 |
原來調用系統 API:
CreateFileW(L"c:\\secret.txt", ...);
Hook 后:
點擊查看代碼
HookedCreateFileW() {
std::wcout << "有人試圖訪問 secret.txt!攔截!" << std::endl;
return INVALID_HANDLE_VALUE;
}

浙公網安備 33010602011771號