DLL远程注入实践

来源:互联网 发布:迅龙数据恢复官方下载 编辑:程序博客网 时间:2024/04/28 15:00

最近在网上找到一篇介绍DLL远程注入的文章《DLL远程注入技术》,通过DLL注入,可以让你的进程不独立运行,而是隐藏到一个普通的已经运行的进程中,很多木马好像就是这么实现的。感觉挺有趣的,所以就自己实践了下。主要用到的相关函数有:

1.       CreateToolhelp32Snapshot  进程快照,找出想要注入的进程

2.       OpenProcess  获得进程句柄

3.       VirtualAllocEx  在远程进程中分配虚拟空间

4.       WriteProcessMemory   写远程进程内存空间

5.       CreateRemoteThread 在远程进程中创建线程

6.       LoadLibrary       装载DLL

7.       FreeLibrary        卸载DLL

8.       GetModuleHandle   获得DLL的句柄

9.       GetExitCodeThread  获得线程退出代码

特别注意这个函数,当以线程里面就只有一个函数时,线程的退出代码,就是函数的返回值。

 

 

   DLL注入的思想方法:

1.       调用CreateToolhelp32Snapshot ,获得想要注入的目标进程ID

2.       调用OpenProcess获得目标进程句柄

3.       VirtualAllocEx中,为目标进程分配保存DLL名称的大小虚拟空间

4.       调用WriteProcessMemory DLL 名称 写入到新申请的虚拟空间中,因为本线程的空间不能被目标进程使用。这也是要调用VirturalAllocEx分配空间的原因。

5.       调用CreateRemoteThread函数,为目标进程创建一个新的线程,线程函数为LoadLibrary ,参数为 新申请的虚拟内存地址,这样这个函数就可以执行了。

 

      DLL卸载的思想方法:

         4步跟DLL注入式一样的,接下来不同的是:

5.调用CreateRemoteThread函数,为目标进程创建的新线程,但是调用的函数为

   GetModuleHandle,目的是去的要卸载的DLL的模块句柄。

6.       调用WaitForSingleObject等待刚才新建线程退出,然后调用GetExitCodeThread函数,获得刚才线程的推出代码。即函数GetModuleHandle的返回值。

7.       再调用CreteRemoteThread函数,调用FreeLibrary函数,参数为刚才的GetModuleHandle的返回值。

8.       这样,卸载DLL的任务已经完成。

 

在编程过程中遇到的一些小问题,当时发现当目标进程就是本进程时没有问题,当要注入到一些其他的进程时,发现可以正确在目标进程中创建线程,但是没有注入DLL。后来发现是目标进程找不到目标DLL,当把目标DLL拷贝到C盘下面的Windows系统目录下面时,就可以正确注入目标进程了。

 

下面是我为了实现注入与注销的一个简单封装的DllManager类:

 

 

DllManager.h文件

 

DllManger.cpp文件: