http://blog.csdn.net/onevs1/article/details/5692680
百度搜来的。论述比较详细,不过我还没搞懂!就原文贴一下了!
----------------------------------------------------------------------------------------------以下是原文
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。
我将这一套功能制作成一个完整的示例,
你可以在以下地址下载: e&5K]W0{