Windows开发者看过来!教你去除Win32系统API调用中的无用消息
为了在Windows系统之中针对其他程序的行为开展监控或者施以改变,API钩子技术乃是一种普遍会被运用到的办法,不过,其得以实现的背后关键所在——DLL注入,却有着不少的讲究之处了。
钩子技术的实现基础
于Windows系统里,各个程序运行于独立的虚拟地址空间之中,这意味着,一个程序无法直接去读取或者修改另一个程序内存中的代码以及数据。因而,若要拦截目标程序对系统API的调用,首先需让我们的拦截代码“进入”到目标程序的范围。这如同要在他人家里安装一颗监听器,首先得找寻办法把设备送进去。
利用系统消息钩子注入
一种经典且被广泛运用的注入方法,是借助Windows的消息钩子机制,开发者能调用SetWindowsHookEx函数,去安装一个全局或者线程特定的钩子,当目标窗口预备处理特定类型的消息,比如键盘按键、鼠标移动时,会自动把指定的钩子DLL加载到目标进程的地址空间中,这种方法自Windows 95时代就已存在,且一直沿用至今。
共享数据的处理挑战
要是在安装了钩子DLL之后,就会出现数据共享方面的问题,举个例子来讲,当安装钩子的时候返回的那个钩子句柄,在已经安排好的安装进程以及会使用到钩子的处于目标状态进程当中,都一定得拥有有效性才行,由于地址空间是存在着隔离状况的,所以这个看起来特殊的句柄在另外的一个进程内部直接进行运用的话,那是完全既没有任何意义可言的,怎么解决的这个这个问题,可以采用内存映射文件技术来搞定,通过运用CreateFileMapping以及MapViewOfFile函数,去创造出这么一块在所有进程间足以能够共享的内存区域,这样一来,就能够让关键数据在所有与之相关的进程里面都指向同一个物理地址。
注入过程的控制与局限
一旦通过消息钩子把 DLL 载入目标进程,在目标进程调用 UnhookWindowsHookEx 函数之前,这样的 DLL 通常很难被主动卸载掉,除非目标进程结束点处。在这类情形之下存在其优势方面:它拥有良好兼容性,从古老系统一直到新型系统都处于适用范围之内;并且还允许在不需要之时主动卸载钩子,与修改注册表等持久化方式相比,进而显得更加灵活可控句号。
性能影响与应用场景限制
然而,基于消息钩子当作依据的注入方式呈现出明显的欠缺之处。首先,它会使得系统在处理消息方面的负担得以加重,特别是在安装全局钩子的时候,有可能会对整个系统的性能产生能够被察觉到的影响。其次,它的生效有着特定条件,也就是只有目标进程开始着手处理被监控的那类消息时,钩子DLL才会被加载并且开始发挥作用。这对于不处理或者不经常处理消息的后台服务程序来讲或许没有作用。
远程线程创建注入法
还有一种更为直接的注入方式,这就是运用CreateRemoteThread函数,此函数可以在一个进程里,于另一个进程的地址空间中创建出一个远程线程,该线程的入口点能够被设置成LoadLibrary函数,而其参数被设置为需要进行注入的DLL路径,由于LoadLibrary在所有用户进程里功能是相同的,如此便巧妙地实现了让目标进程自行加载我们所指定的DLL。
远程线程方法的优势与风险
CreateRemoteThread方法具备更强的通用性,它不依赖消息循环 ,故而能够针对任意进程,这其中包括后台服务 。然而它的使用门槛更高 ,通常需要先依靠足够的权限 ,比如PROCESS_ALL_ACCESS ,来打开目标进程 ,取得其句柄 ,并且要完成在目标进程里分配内存 、写入DLL路径字符串等复杂操作 。若操作不当就容易导致进程崩溃 ,而且更容易被安全软件检测为恶意行为 。
进行实际开发之际,挑选某一种DLL注入技术时,往往要对兼容性、隐蔽性、稳定性以及实现的复杂度加以权衡。对于安全软件开发者而言,这是一项需慎重思考的技术决策。对于调试工具开发者而言,这同样是一项需慎重思考的技术决策。你更倾向于采用哪种方法呢?是基于消息钩子的传统方式吗?还是功能更为强大的远程线程创建呢?请分享你的看法以及理由。
同类文章排行
- 三聚磷酸钠与减水剂、解胶王等产品的区别?
- 「亚马逊人脸识别噩梦」贝索斯将AI武器化遭大规模抗议
- 星巴克的中年劫
- 腾讯游戏营收比重连续两个季度下降,支付、云计算等业务营收涨3
- 三聚磷酸钠在陶瓷行业中的作用是什么?
- 工业三聚磷酸钠实验室鉴别假冒伪劣产品的方法?
- 传滴滴即将接入ofo,共享单车大战格局或生变
- 工业三聚磷酸钠在洗涤行业中的作用是什么?
- 获 3800 万元 A+ 轮投资,乐摇摇科技利用抓娃娃机做线
- 点击在线求助,应答的却都是机器人,这样真的好吗?




