码迷,mamicode.com
首页 > 其他好文 > 详细

DLL注入的学习(未完)

时间:2015-09-08 22:05:10      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

参考: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中只是做一些简单的处理以显示注入成功。

 

DLL注入的学习(未完)

标签:

原文地址:http://www.cnblogs.com/predator-wang/p/4792976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!