安全研究 >> 安全研究详情

十大进程注入(一) DLL远程线程劫持注入技术解析

作者: 美创科技安全实验室发布日期: 09月20日

进程注入是一种广泛应用于恶意软件或无文件攻击中的躲避检测的技术。其需要在另一个进程的地址空间内运行特制代码,进程注入改善了不可见性、同时一些技术也实现了持久化。


而所谓的DLL注入是诸多进程注入方法中最常用的技术。恶意软件将恶意的动态链接库的路径写入另一个进程的虚拟地址空间内,通过在目标进程中创建远程线程来确保远程进程加载它。而因为DLL本身是由感染后的进程加载的同时PE文件也并没有对系统进行过多的敏感操作,所以这种技术具有相当强的一种隐蔽性。

01

注入原理

关键函数:CreateRemoteThread()


利用Windows远程线程机制,需要在本地进程中通过CreateRemoteThread函数在其他进程中开启并运行一个线程。因此,把LoadLibrary 函数作为 CreateRemoteThread开启的线程函数,把要加载的DLL路径作为线程函数的参数即可。


为了使远程进程执行LoadLibrary函数加载DLL文件,却面临着两个棘手的问题:


如何向远程进程传递需要加载的DLL路径?  ------①

如何获得远程进程中LoadLibrary函数的地址?----②


为了解决这些问题,我们在后面会一一给出解决方案

02

注入过程

为了解决问题①,我们可以通过Windows API函数把路径写入远程进程中,主要包括:OpenProcess(),VirtualAllowEx(),WriteProcessMemory(),VirtualFreeEx()等把DLL路径加载到远程进程中。具体流程如下


1、获取目标进程句柄

使用OpenProcess()函数打开远程进程的句柄。


2、在目标进程分配内存空间

使用VirtualAllowEx()函数在目标进程中分配足够的内存空间,用于保存要加载DLL的路径。


3、写入DLL路径至目标进程

使用WriteProcessMemory()函数把需要加载的DLL路径写入到远程进程分配的内存空间。


4、获取LoadLibraryW地址

为了解决问题②,我们需要明确Kernel32.dll是系统基本库,且Windows系统中,所有进程加载Kernel32.dll模块基址是固定且一致的,所以只需获取本地进程中LoadLibrary地址。同理LoadLibraryW函数位于kernel32.dll中,并且系统核心DLL会加载到固定地址,所以系统中所有进程的LoadLibraryW函数地址是相通的。用GetProcAddress函数获取本地进程LoadLibraryW地址即可。


5、在目标进程中运行远程线程

用 CreateRemoteThread 函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrary函数并在参数中传入第2步分配的内存地址。这时,DLL已经被注入到远程进程的地址空间中,DLL的DllMain函数会收到DLL_PROCESS_ATTACH 通知并且可以执行我们想要执行的代码。当DllMain返回的时候,远程线程会从LoadLibraryW/A调用返回到BaseThreadStart函数。BaseThreadStart函数然后调用ExitThread,使远程线程终止。

03

防御方法

  1. 加固本身程序,遍历路径下的dll文件,确定MD5和数字签名安全后再进行后续加载。

  2. 安装木马查杀工具,实时监控远程线程调用情况

  3. 查看是否有不明端口开放以及对端口通信进行监控。

  4. 拦截自身LoadLibraryExW函数,防止远程线程在自身程序加载DLL


服务热线:400-711-8011
Copyright ©2005-2018 杭州美创科技有限公司. All Rights Reserved. 浙ICP备 09009762号-1