标签:
参考:http://andylin02.iteye.com/blog/459483
进程注入的方法分类如下:
带DLL的注入
利用注册表注入
利用Windows Hooks注入
利用远程线程注入
利用特洛伊DLL注入
不带DLL的注入
直接将代码写入目标进程,并启动远程线程
1. 利用注册表注入(appinit_dll 注入)
在Windows NT/2000/XP/2003中,有一个注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft \WindowsHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs。
User32.dll被加载到进程时,会获取AppInit_DLLs注册表项,若有值,则调用LoadLibrary() API加载用户DLL。所有,DLL注册表注入,并不会影响所有进程,只会影响加载了user32.dll的进程.我们可以把自己的代码放在一个DLL中,并加入该键值,这样就可以注入到所有使 用User32.dll的进程中了。
2. 利用Windows Hooks注入
Windows系统给我们提供了一些挂钩函数,使得被挂钩的进程可以在自己处理接收到的消息之前,先执行我们的消息处理函数,而这个消息处理函数一般会放在DLL中,这实际上已经达到了注入代码的效果。即,Hook住一个进程,在这个进程接收消息执行之前,抢先于它去执行。
3. 利用远程线程注入DLL
1)、取得远程进程的进程ID;
2)、在远程进程空间中分配一段内存用来存放要注入的DLL完整路径;
3)、将要注入的DLL的路径写到刚才分配的远程进程空间;
4 )、从Kernel32.dll中取得LoadLibray的地址;
5)、调用CreateRemoteThread函数以从Kernel32.dll中取得的LoadLibrary函数的地址为线程函数的地址,以我们要注入的DLL文件名为参数,创建远程线程;
在第二三步中,为什么要把我们要注入的DLL的文件名写到远程进程的地址空间进行操作,《WINDOWS核心编程》中是这样描述的:
“(要注入的 DLL文件名)字符串是在调用进程的地址空间中。该字符串的地址已经被赋予新创建的远程线程,该线程将它传递给L o a d L i b r a r y A。但是,当L o a d L i b r a r y A取消对内存地址的引用时, D L L路径名字符串将不再存在,远程进程的线程就可能引发访问违规”;
至于第四步中为什么不直接对LoadLibrary进行调用,《WINDOWS核心编程》中是这样描述的:
“如果在对C r e a t e R e m o t e T h r e a d的调用中使用一个对L o a d L i b r a r y A的直接引用,这将在你的模块的输入节中转换成L o a d L i b r a r y A的形实
替换程序的地址。将形实替换程序的地址作为远程线程的起始地址来传递,会导致远程线程开始执行一些令人莫名其妙的东西。其结果很可能造成访问违规。”
我在DLL中只是做一些简单的处理以显示注入成功。
标签:
原文地址:http://www.cnblogs.com/predator-wang/p/4792976.html