| 关键词: 进程 函数 远程 线程 路径 DLL 地址 LoadLibraryW LoadLibrary 目标 |
进程注入是一种广泛应用于恶意软件或无文件攻击中的躲避检测的技术。其需要在另一个进程的地址空间内运行特制代码,进程注入改善了不可见性、同时一些技术也实现了持久化。 而所谓的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 防御方法
|
| 本文出处: https://www.toutiao.com/a6739797717570028035/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|