Win32汇编注入:APIHook

本文详细介绍了API Hook技术,特别是针对Win32汇编的注入过程。内容包括理解API的A和W版本、钩子代码如何定位在API的前5字节、递归hook的解决方案、内存属性修改以及重定位问题。通过示例,阐述了APIHook的完整流程,从获取API地址、创建目标进程、申请内存到编写和注入代码,最终展示Hook的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,APIHook

概述:概述:注入windows画图工具(32位),让画图工具启动后,只要画图工具调用要hook的api,就能弹出一个对话框;以上关键使用APIHook;
APIHook也是杀软主动防御的一个基础;

2,提前搞清楚几个问题

2.1 A和W版本

WindowsAPI有A和W版本,如果使用A版本,A版本最后还是会调用W版本,所以尽可能hook的是W版本;这里涉及到其他问题:比如安全软件也会apihook,但是它调用的是更加底层的0环,即使在现在我们正在关注的3环,它也有可能apihook的地方不是api头5字节,而是后面,或者不是A版本,而是W版本,反正就是要在更后面hook,这样才能准确监控;

2.2,api头5字节

hookApi的地方:api头5字节:
api头5字节
微软有可能自己打热补丁,可以做一些修复的事情;为什么选择:因为,这里5字节所有公开的api都一样,可以做到通用;api头5字节进行hook,使用的jmp XXX,跳转到自己注入的代码里,自己的代码使用Jmp跳转回api;

2.3 递归hook的问题:

比如hook 的api是MessageBoxA,注入的代码是调用MessageBoxA,这样一来就会递归,所以,应该使用标志位来解决,这里有个问题:标志位所在地方是注入进程的code区,需要改可写属性;

2.4 改内存属性的问题:

有几个地方要注意,一个是要注入的代码,在本进程中归属code区,有些时候需要往里面写入计算的数据(本例子是写入g_pfnMessageBox == MessageBoxA的绝对地址7740FDAE),所以这里需要修改这段代码可读可写;
还有这段代码注入到对方进程后,在对方进程中,这段代码有标志位的写入,也得再次改内存属性;
Api的内存属性也需要修改,但是最好用完后还原内存属性;

2.5 重定位的问题:

为什么要重定位, 因为我们在注入工具中写好的代码是要放在目标中运行的, 而我们写入目标的代码如果我们直接调用API或全局变量是当前我们注入工具中的绝对地址值, 放到目标中就不同了;
一般来说,注入的代码直接是否有写入绝对地址值,如果有,就有重定位问题;
重定位模板:

    call CODE
    CODE:
    pop ebx
    sub ebx, offset CODE

这里写图片描述
我们需要动态获取目标代码的API或全局变量的实际地址值, 通过重定位首地址, pop ebx后在ebx中获得, 减去offset NEXT(在自身注入工具中的偏移), 这就得到了个偏差值;我们再通过loadliabrary, getprocA得到方法的调用地址, 或者全局变量的地址, 他们相对于我们pop ebx的位置偏移是个固定值, 在目标进程中相对于pop ebx的位置也是这个固定值;

问题: 这种重定位方法仅适合本地重注入, 所以这种方法我们命名为本地重定位。本地注入指的是 注入进程和目标程序是同一台机器。
wapi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值