能力值:
( LV1,RANK:0 )
|
-
-
2 楼
在 Ring3 层监控 IAT Hook 需要用到一些 Windows Native API 库,例如 Psapi 和 Dbghelp 库等。以下是一份 C 语言的示例代码:
#include <stdio.h> #include <stdint.h> #include <Windows.h> #include <Psapi.h> #include <Dbghelp.h>
// 扫描模块内是否存在 IAT Hook void ScanForIATHook(HMODULE hModule) { DWORD dwSize; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = NULL; PIMAGE_THUNK_DATA pThunk = NULL; PIMAGE_IMPORT_BY_NAME pImportByName = NULL; PSTR szImportName = NULL;
// 获取模块基址(Base Address) DWORD_PTR dwModuleBase = (DWORD_PTR)hModule;
// 获取模块名称 CHAR szModuleFileName[MAX_PATH]; GetModuleFileNameA(hModule, szModuleFileName, MAX_PATH);
// 获取模块导入表信息 pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(hModule, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &dwSize); if (pImportDesc == NULL) { printf("[-] %s - ImageDirectoryEntryToData() failed (%d)\n", szModuleFileName, GetLastError()); return; }
// 遍历每个导入的 DLL while (pImportDesc->Name) { // 获取导入表项名 szImportName = (PSTR)((PBYTE)hModule + pImportDesc->Name);
// 获取 thunk 数据 pThunk = (PIMAGE_THUNK_DATA)((PBYTE)hModule + pImportDesc->FirstThunk);
// 遍历每一项 thunk 数据 while (pThunk->u1.AddressOfData) { // 判断是否为 IMAGE_ORDINAL_FLAG if ((IMAGE_ORDINAL_FLAG & pThunk->u1.Ordinal) == 0) { // 获取函数名所在位置 pImportByName = (PIMAGE_IMPORT_BY_NAME)((PBYTE)hModule + pThunk->u1.AddressOfData);
// 判断是否存在 IAT Hook if (_stricmp((PCHAR)pImportByName->Name, "hooked_function") == 0) { printf("[+] %s - IAT Hook detected (%s)\n", szModuleFileName, szImportName); } }
pThunk++; }
pImportDesc++; } }
int main() { // 获取当前进程内所有模块 HMODULE hModuleList[1024]; DWORD dwSizeNeeded; if (!EnumProcessModules(GetCurrentProcess(), hModuleList, sizeof(hModuleList), &dwSizeNeeded)) { printf("[-] EnumProcessModules() failed (%d)\n", GetLastError()); return 1; }
// 遍历每个模块并扫描是否存在 IAT Hook for (DWORD i = 0; i < (dwSizeNeeded / sizeof(HMODULE)); i++) { ScanForIATHook(hModuleList[i]); }
return 0; } 在以上的代码中,我们使用了 Psapi 库的 EnumProcessModules 和 GetModuleFileNameA 函数来遍历当前进程内的所有模块,以进行扫描。使用 Dbghelp 库的 ImageDirectoryEntryToData、IMAGE_IMPORT_DESCRIPTOR、IMAGE_THUNK_DATA 和 IMAGE_IMPORT_BY_NAME 来获取 DLL 的导入表信息,以判断是否存在 IAT Hook。您可以根据具体情况优化代码。
|
|
|