当以艺术眼光看程序,寻找程序后面的原理,做到化而不忘
全部博文(57)
分类: Windows平台
2014-06-18 22:41:12
在Windows下,DLL注入其实是个结果,不是个原因。没有直接哪个函数可以实现DLL注入,唯一相关的可能就是LoadLibrary了。常见的DLL注入的三个方式如下:
1:CreateRemoteThread()
2:AppInit_DLLs注册表
3:SetWindowsHookEx()
其中方法1和方法3,都有点歪打正着的感觉,建立远程线程是在其它进程中建立线程,要建立线程自然要线程入口函数,如果将线程入口函数设置成LoadLibrary,就呆以间接实现DLL注入了。设置钩子更甚,你设置钩子函数以后,如果是对其它远程线程下钩子,那么系统会自动替你加载DLL。你都不用自己动力,这个福利太好了。
方法2则是你设置好DLL的路径,只要进程加载了User32.dll,那么这个DLL就会调用LoadLibrary函数将AppInit_DLLs键值下的DLL都加载进来。
对比以上三个方法,感觉微软本身就没有想到过提供DLL注入的功能,所谓的DLL注入其实都是我们想干坏事而自己发明的新用法。
其实这也是没办法,Windows虽然进程空间是隔离的,但是也允许跨进程操作,那样的话,那代码如何写到另外的进程里的?DLL注入算是一个比较简单的方式,你也可以使用Read/WriteProcessMemory实现,但是个太原始了,且关系到重定位的问题。
再来说说SetWindowsHookEx这个函数,它是的本质是钩住Windows的消息。我们都知道,Windows是个事件系统,由消息来驱动,做什么事都要发送消息实现,就连最简单的SetWindowText也只是WM_SETTEXT消息的一个快捷方式而已。那么钩住了消息,就可以为所欲为了。出发点是好的,但是经是好书,就是让和尚念歪了。用这个函数可以做不少坏事。