IAT_Hook
LkaiIAT HOOK
原理是通过替换IAT表中的函数的原始地址从而实现HOOK的,IAT Hook 需要充分理解PE文件的结构才能完成Hook,这里就简单讲一下代码实现了
[IAT_HOOK]: https://www.cnblogs.com/LyShark/p/11766620.html “ IAT_Hook”
[代码实现]: https://github.com/SHangwendada/CodeRepo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| #include <windows.h> #include <iostream> typedef int(__cdecl* PMemcmp)(const void* buf1, const void* buf2, size_t count); DWORD GetMemcmpAddressFromIAT() { HMODULE hModule = GetModuleHandle(NULL); if (!hModule) { printf("Failed to get handle of current module\n"); return 0; }
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)hModule;
PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)hModule + pDosHeader->e_lfanew);
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = (PIMAGE_OPTIONAL_HEADER32) & (pNTHeader->OptionalHeader);
PIMAGE_IMPORT_DESCRIPTOR pIMPORT_DESCRIPTOR = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hModule + pOptionHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while (pIMPORT_DESCRIPTOR->FirstThunk) { PDWORD FirstThunk = (PDWORD)((DWORD)hModule + pIMPORT_DESCRIPTOR->FirstThunk);
PDWORD OriginalFirstThunk = (PDWORD)((DWORD)hModule + pIMPORT_DESCRIPTOR->OriginalFirstThunk);
while (*FirstThunk) { char* functionName = (char*)((*OriginalFirstThunk) + (DWORD)hModule + 2);
if (strcmp(functionName, "memcmp") == 0) { return (DWORD)FirstThunk; } FirstThunk++; OriginalFirstThunk++; } pIMPORT_DESCRIPTOR++; } printf("Failed to find memcmp in IAT.\n"); return 0; }
int __cdecl MyMemcmp(const void* buf1, const void* buf2, size_t count) { printf("Hooked memcmp Param: buf1: %p, buf2: %p, count: %zu\n", buf1, buf2, count);
PMemcmp OriginalMemcmp = (PMemcmp)GetProcAddress(GetModuleHandleA("ntdll.dll"), "memcmp");
if (!OriginalMemcmp) { printf("Failed to call original memcmp.\n"); return -1; } printf("oh babg girl 终于成功啦.\n"); printf("接下来将会是一个加密flag的地方.\n"); return 0; }
void InstallIatHook(DWORD* pdwOldFunction, DWORD dwNewFunction) { DWORD dwOldProtect; if (VirtualProtect(pdwOldFunction, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect)) { *pdwOldFunction = dwNewFunction;
VirtualProtect(pdwOldFunction, sizeof(DWORD), dwOldProtect, &dwOldProtect); printf("Function hooked successfully"); } else { printf("Failed to change protection of IAT.\n"); } } int main() { DWORD* dwMemcmp = (DWORD*)GetMemcmpAddressFromIAT(); if (dwMemcmp == 0) { printf("Failed to get memcmp address from IAT.\n"); return -1; } printf("memcmp address in IAT: %p\n", (void*)*dwMemcmp);
InstallIatHook(dwMemcmp, (DWORD)MyMemcmp); char buf1[] = "test1"; char buf2[] = "test2"; memcmp(buf1, buf1, sizeof(buf1)); memcmp(buf1, buf2, sizeof(buf1));
return 0; }
|