网上没有找到多少关于inline hook的文章,感觉这方面资料不是很完整,所以决定自己写一份存档,重点讲述inline hook的实现。
inline hook的核心思想是:通过替换目标函数头部指令实现在函数执行之前跳转到其他的指令区域,执行完毕跳转回到原来的函数,跳转到的指令区域通常是我们自己编写的函数。inline hook技术对于编写外挂和外挂式补丁意义重大。
步骤:
1.使用VirtualAllocEx函数在目标进程创建一块内存区域,用于保存我们将要执行的指令。
VirtualAllocEx申请指令空间的一般用法如下:VirtualAllocEx(hProcess, NULL,len, MEM_COMMIT, PAGE_EXECUTE);
2.使用WriteProcessMemory函数将指令写入步骤一申请的内存区域。例如:WriteProcessMemory(hProcess,(void*)addr,(void*)val,len,NULL);
3.在目标函数头部替换指令,保存原来的指令,并且获取下一个完整指令的地址。这里我们必须说明要损坏的指令长度,因为jmp指令占用5个字节,假设目标函数头部第一条指令长度不足5字节,那么就需要破坏第二条指令,下一条完整的指令就是第三条指令。反之如果目标函数头部第一条指令长度大于5字节,下一条完整的指令就是第二条指令。
4.等待函数执行完毕。
5.回复目标函数头部被损坏的指令,使用VirtualFreeEx清理申请的内存区域。
具体实现如下:
typedef struct
{
byte* HOOK_CODE;//指令数组指针
DWORD HOOK_CODE_LENGTH;//指令占的字节数
void* HOOK_