inline hook的原理及实现

网上没有找到多少关于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_
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值