6-DLL镂空注入(DLL Hollowing Injection)
一、前言
参考文章:
1、 总结加载Shellcode的各种方式 - 亨利其实很坏 - 博客园
2、 Module Stomping for Shellcode Injection | Red Team Notes
DLL镂空注入(DLL Hollowing Injection)是一种Shellcode注入技术,它借鉴了进程镂空(Process Hollowing)的原理和思路。dll镂空注入并非传统的dll注入,因为传统的dll注入是将恶意dll文件、dll注入的启动器exe一同放目标主机上,这大大增加了被杀的风险。
相比之下,DLL镂空注入不具备这样的风险,因为它是在带有微软签名的DLL中镂空一个区域。为了避免进程出错,不能直接在进程空间中已存在的DLL上进行镂空。取而代之的方法是先向目标进程远程注入一个合法的系统DLL,然后再镂空它。
二 、流程
确定要注入的目标进程:根据进程ID,使用使用
OpenProcess打开目标进程,获取其句柄。官方文档:OpenProcess 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn将合法的DLL(如amsi.dll)注入目标进程:使用
VirtualAllocEx+WriteProcessMemory将DLL名称写入远程进程的内存空间。然后,获取LoadLibraryW函数的地址,并在远程进程中创建一个新线程以调用该函数,实现DLL的加载。第1、2步参考创建远程线程注入(CreateRemoteThread Injection)VirtualAllocEx官方文档:VirtualAllocEx 函数 (memoryapi.h) - Win32 apps | Microsoft LearnWriteProcessMemory官方文档:WriteProcessMemory 函数 (memoryapi.h) - Win32 apps | Microsoft LearnLoadLibraryW官方文档:LoadLibraryW 函数 (libloaderapi.h) - Win32 apps | Microsoft Learn
找到在远程进程中注入的DLL的基地址:
EnumProcessModules+GetModuleBaseNameA通过在远程进程中枚举并定位特定模块(amsi.dll)的基地址EnumProcessModules官方文档:enumProcessModules 函数 (psapi.h) - Win32 apps | Microsoft LearnGetModuleBaseNameA官方文档:GetModuleBaseNameA 函数 (psapi.h) - Win32 apps | Microsoft Learn
获取DLL的入口点:读取括DOS头部和NT头部,从中获取DLL的入口点(AddressOfEntryPoint)。一个进程不能直接读取另一个进程的内容(在本例中要读取的是远程进程的asmi.dll的头部),只能通过
ReadProcessMemory读到本进程的地址空间中。官方文档:ReadProcessMemory 函数 (memoryapi.h) - Win32 apps | Microsoft Learn向DLL的入口点写入Shellcode:同样的,我们也不能直接向远程进程写入内容,而应该使用
WriteProcessMemory从DLL的入口点写入shellcode。官方文档:WriteProcessMemory 函数 (memoryapi.h) - Win32 apps | Microsoft Learn执行Shellcode:使用
CreateRemoteThread创建一个远程线程指向shellcode,以DLL的入口点作为线程的起始地址官方文档:CreateRemoteThread 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learn
三、代码实现
完整代码


Last updated