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
|
#include "pch.h"
#include "iatHookDll.h"
DWORD* g_iatAddr = NULL;
DWORD* g_unHookAddr = NULL;
int WINAPI hookMessageBoxW(
_In_opt_ HWND hWnd,
_In_opt_ LPCWSTR lpText,
_In_opt_ LPCWSTR lpCaption,
_In_ UINT uType) {
int result = MessageBoxA(0, "hook MessageBoxW", "提示", MB_OK);
return result;
}
BOOL InstallHook() {
DWORD dwOldProtect = 0;
VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
*g_iatAddr = (DWORD)hookMessageBoxW;
VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
return TRUE;
}
BOOL UninstallHook() {
DWORD dwOldProtect = 0;
VirtualProtect(g_iatAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
*g_iatAddr = (DWORD)g_unHookAddr;
VirtualProtect(g_iatAddr, 4, dwOldProtect, &dwOldProtect);
return TRUE;
}
DWORD* GetIatAddr(const char* dllName, const char* dllFunName) {
//获取当前进程exe文件模块句柄
HMODULE hModule = GetModuleHandleA(0);
DWORD dwhModule = (DWORD)hModule;
PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)dwhModule;
PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)(pDosHeader->e_lfanew + dwhModule);
PIMAGE_OPTIONAL_HEADER pOptionHeader = &pNtHeader->OptionalHeader;
IMAGE_DATA_DIRECTORY dataDirectory = pOptionHeader->DataDirectory[1];
//获取导入表
PIMAGE_IMPORT_DESCRIPTOR pImageIT = (PIMAGE_IMPORT_DESCRIPTOR)(dataDirectory.VirtualAddress + dwhModule);
//遍历导入表获取符合条件的函数
while (pImageIT->Name) {
char* iatDllName = (char*)(pImageIT->Name + dwhModule);
if (!_stricmp(iatDllName, dllName)) { //不区分大小写
PIMAGE_THUNK_DATA pINT = (PIMAGE_THUNK_DATA)(pImageIT->OriginalFirstThunk + dwhModule);
PIMAGE_THUNK_DATA pIAT = (PIMAGE_THUNK_DATA)(pImageIT->FirstThunk + dwhModule);
while (pINT->u1.Function) {
if ((pINT->u1.Ordinal & 0x80000000) == 0) {
PIMAGE_IMPORT_BY_NAME pImportName = (PIMAGE_IMPORT_BY_NAME)(pINT->u1.Function + dwhModule);
if (!strcmp(pImportName->Name, dllFunName)) {
return (DWORD*)pIAT;
}
}
pINT++;
pIAT++;
}
}
pImageIT++;
}
}
BOOL WINAPI DllMain(HMODULE hInstance, DWORD callReason, LPVOID lpReserved) {
if (callReason == DLL_PROCESS_ATTACH) {
MessageBoxA(0, "dll加载中", "提示", MB_OK);
//获取iat表
g_iatAddr = GetIatAddr("user32.dll", "MessageBoxW");
//保存要Hook的函数地址
g_unHookAddr = (DWORD*)*g_iatAddr;
InstallHook();
}
else if (callReason == DLL_PROCESS_DETACH) {
UninstallHook();
}
return TRUE;
}
|