Hook的多种方式
inlineHook
原理:
在入口点加一段jmp指令,跳转到hook的函数
hook自定义函数
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
| #include <iostream> #include <stdio.h> #include <Windows.h>
void sayHello() { printf("hello"); }
void bye() { printf("bye"); }
void installHook() { unsigned char jmpcode[10] = {0};
jmpcode[0] = 0xE9; int offset = (int)bye - ((int)sayHello + 5);
*(int*)&jmpcode[1] = offset;
DWORD oldProtect = 0;
VirtualProtect(sayHello, 4096, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(sayHello, jmpcode, 5);
}
int main() { installHook(); sayHello(); }
|
结果:

hook系统函数
hook MessageBoxA
正常的MessageBoxA函数调用
1 2 3 4
| int main() { MessageBoxA(NULL, "MSB Title", "MSB Msg", MB_OK); }
|

对MessageBoxA函数进行HOOK在调用时输出其他内容
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
| #include <iostream> #include <Windows.h> #include <stdint.h>
int WINAPI MessageBoxHook( _In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType) { printf("%s:%s\n",lpText,lpCaption); return 0; };
void installHook() { unsigned char jmpcode[10] = { 0 }; jmpcode[0] = 0xE9;
int offset = (int)MessageBoxHook - ((int)MessageBoxA + 5);
*(int*)&jmpcode[1] = offset;
DWORD oldProtect = 0;
VirtualProtect(MessageBoxA, 4096, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(MessageBoxA, jmpcode, 5);
}
int main() { installHook();
MessageBoxA(NULL, "MSB Title", "MSB Msg", MB_OK); }
|

hook通用函数
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
| #include <iostream> #include <Windows.h> #include <stdint.h>
int WINAPI MessageBoxHook( _In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType) { printf("%s:%s\n",lpText,lpCaption); return 0; };
void installHook(void* target, void* old) { unsigned char jmpcode[10] = { 0 }; jmpcode[0] = 0xE9;
int offset = (int)target - ((int)old + 5);
*(int*)&jmpcode[1] = offset;
DWORD oldProtect = 0;
VirtualProtect(MessageBoxA, 4096, PAGE_EXECUTE_READWRITE, &oldProtect);
memcpy(MessageBoxA, jmpcode, 5);
}
int main() { installHook(MessageBoxHook,MessageBoxA);
MessageBoxA(NULL, "MSB Title", "MSB Msg", MB_OK); }
|
出现问题:Hook原函数会无限循环,需新建中间表进行转换
有点难写,参考现成的Hook项目

IATHook
__END__