上传者: sn50129805
|
上传时间: 2021-10-10 07:50:37
|
文件大小: 102KB
|
文件类型: -
Ring3下注入DLL的另类方法,能过杀软和游戏NP(源码)
注入DLL是做全局钩子或者拦截类软件都有可能用到的技术,如果做外挂的话我们也有
可能需要注入一个DLL到游戏进程中去干点什么“坏事”。 但我们知道现在要注入DLL是越
来越难了。场景1:制作火星文输入法外挂,原理是利用API HOOK拦截并修改输入法相关函
数,需要注入一个DLL到所有进程中,但是后来发现,在开启了瑞星的帐号保险箱后,用户
将不能在QQ中输入火星文。原因是瑞星保护了QQ进程,禁止对其注入DLL,解决方法是提示
用户关闭帐号保险箱 -_-| 确实是很降低用户体验的一个不是办法的办法。场景2:制作某
游戏外挂,需要注入一个DLL到游戏进程中去直接调用游戏函数完成某一功能。结果发现该
游戏有NP保护,OpenProcess打不开,创建远程线程也不行,试用其它方法也一一失败。遇
到上面的情况,高手们自然是转到Ring0下面去,使用驱动之类的办法来对付啦,不过吾等
菜鸟可就是酒井没法子了 -_-|
不过也别太灰心,凡事总会有办法的。我想我们需要一种持久的、稳定的、不容易被安
全软件屏蔽的DLL注入方法,后来发现,输入法程序就是能完成这一任务的理想人选。输入
法程序程序到底是什么?它没有自己的进程,并且在系统还没有登录时就已被加载(在欢迎
界面你也可以调出输入法),它可以在游戏中打开,也可以在控制台程序中打开,还可以在
瑞星保护下的QQ中打开,在杀软中也可以打开,这不就是我们要找的特性吗。那么,输入法
到底是什么呢?根据Windows的规定,输入法其实就是一个DLL,不过它是一个特殊的DLL,
它必须具有标准输入法程序所规定的那些接口,输入法是由输入法管理器(imm32.dll)控
制的,输入法管理器又是由user32.dll控制的。输入法在系统目录是以IME为扩展名的文件
,当在应用程序中激活某个输入法时,输入法管理器就会在那个应用程序的进程中加载对应
的IME文件,注意,加载IME文件跟加载普通的DLL并没有本质区别,所以,可以认为,输入
法其实就是注入到应用程序中的一个DLL文件,并且,这种“注入”是不会被杀软和游戏NP
拦截的(至少目前是)。现在,我们已经有了一个注入DLL的另类方法,那就是利用输入法
。具体流程是这样,首先制作一个标准输入法文件,但是这个输入法并不完成文字输入工作
,它的唯一任务就是用来注入DLL,所以称为“服务输入法”,然后,制作一个控制程序,
来控制服务输入法,当然最后还需要一个用于注入的目标DLL,这样一共就有3个文件。开始
工作后,控制程序首先将服务输入法安装到系统中,然后传递几个参数给服务输入法,参数
中包括了需要注入的DLL文件的名称和路径,然后,控制程序将服务输入法设置为系统的默
认输入法,这样新的程序一打开,服务输入法就会注入那个程序。当然,在服务输入法安装
之前打开的程序不会被注入,这时需要向系统中的所有窗口POST一条
WM_INPUTLANGCHANGEREQUEST消息,该消息可以在指定窗口中后台激活服务输入法,这样,
系统中所有拥有窗口的进程就都被我们的服务输入法注入了。服务输入法注入程序之后,就
会根据控制程序传递过来的参数加载目标DLL,这样目标DLL也就随着服务输入法一同注入到
目标程序中了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口
中自动激活的,如果某个窗口自动激活失败,你就需要在那个窗口中手工切换到服务输入法
,这样才能注入进去了。至于注入以后,你就可以在窗口中切换到别的输入法,这并不会影
响已经注入进去的DLL。我将这一套功能制作成一个完整的示例,你可以在以下地址下载:
http://www.pen88.com/download/imehook.rar 压缩包中的第6个和第8个文件夹演示了此
功能并包含所有源代码。其中文件imedllhost09.dll就是服务输入法,运行时会被安装到系
统中,控制程序退出时会自动卸载该输入法,这样用户就不太容易察觉,你还可以重新编译
该输入法,将名称改为“中文(中国)”,这样隐蔽性更好。文件hxwdllwx.dll是演示用的
目标DLL,你可以替换成自己的DLL,然后那个exe文件就是控制程序了。输入法
imedllhost09.dll在运行时会被复制到系统目录并更名为imedllhost09.ime,它导出了2个
函数用于控制。在VB中的声明为:
Public Declare Function IMESetPubString Lib "imedllhost09.ime" (ByVal RunDLLStr