什么是 IAT Hook?

IAT(Import Address Table)Hook 是一种 通过修改导入表中的函数地址来实现 API 劫持 的技术,适合针对当前进程的 API 替换,不依赖于 DLL 注入或系统级钩子。

本例目标
劫持 CreateFileW(或 CreateFileA)函数:

  • 拦截调用
  • 输出或修改文件路径
  • 最终调用原函数
  • > 示例代码(静态 IAT Hook 实现)

    🛠 步骤 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;
    
    🛠 步骤 2:定义我们的 Hook 函数
    点击查看代码
    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
        );
    }
    
    🛠 步骤 3:修改 IAT,实现 Hook
    点击查看代码
    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;
                }
            }
        }
    }
    
    
    🛠 步骤 4:测试调用 CreateFile
    点击查看代码
    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;
        }
    }
    
    🛠 步骤 5:在 main() 中调用 Hook 和测试
    点击查看代码
    int main() {
        HookIAT_CreateFileW();   // 执行 Hook
        TestCreateFile();        // 测试调用
        return 0;
    }
    
    结尾:IAT Hook 有什么用?能干嘛?
    应用场景举例说明
    🛡️ 安全防护 / 防作弊拦截游戏中的 CreateFileReadProcessMemory,防止外挂注入
    🪝 软件注入 / 插件系统替换 LoadLibraryCreateFile,控制哪些 DLL/文件能被加载/访问
    🧪 逆向分析 / 恶意软件行为监控Hook CreateProcessWriteFile,观察病毒行为
    🔧 动态调试 / 热更新模块把原本导入的函数指向你自己的函数,做动态替换
    🗃️ 日志审计 / 文件访问记录拦截 CreateFileW,打印访问的文件名到日志中
    🧩 程序透明代理 / 沙箱隔离拦截网络类 API(如 connectsend),做透明代理
    比如你做了一个程序,别人用你的 API 或库时:
    原来调用系统 API:CreateFileW(L"c:\\secret.txt", ...); Hook 后:
    点击查看代码
    HookedCreateFileW() {
      std::wcout << "有人试图访问 secret.txt!拦截!" << std::endl;
      return INVALID_HANDLE_VALUE;
    }
    
    
    posted @ 2025-08-11 22:38  huh&uh  阅读(82)  评论(0)    收藏  举报