5-进程镂空注入(Process Hollowing Injection)

一、前言

参考文章

1、使用进程镂空技术免杀360Defender-CSDN博客arrow-up-right

2、技术讨论 | Windows 10进程镂空技术(木马免杀) - FreeBuf网络安全行业门户arrow-up-right

3、进程注入-PE注入_进程镂空注入-CSDN博客arrow-up-right

4、ProcessHollowing/Process Hollowing.cpp at master · NATsCodes/ProcessHollowing · GitHubarrow-up-right

5、总结加载Shellcode的各种方式 - 亨利其实很坏 - 博客园arrow-up-right

进程镂空注入(Process Hollowing Injection) 是将一个合法的程序挂起,然后修改其内存数据,将进程挖空并替换为恶意木马程序,实现文件层面的注入技术。

前置知识:

  1. 进程映像(Process Image)是操作系统在内存中为一个正在运行的进程分配的内存空间和资源的集合。进程映像包含了进程所需的所有数据和代码,包括可执行文件的代码段、数据段、堆栈段以及与进程相关的系统资源和状态信息。

  2. 远程进程(Remote Process):一般指的是在当前进程之外运行的另一个进程。

  3. PE文件详见 PE的相关数据结构 这一节

二、流程

偷来的实现原理图如下,具体代码有出入,但这个大致步骤是相似的

  1. 使用 CreateProcessA 创建一个进程,并将其设置为挂起状态(CREATE_SUSPENDED)。官方文档:CreateProcessA 函数 (processthreadsapi.h) - Win32 apps | Microsoft Learnarrow-up-right

  2. 使用 CreateFileA+GetFileSize+VirtualAlloc+ReadFile 读取恶意程序的内容到本进程的内存空间中

  3. 获取DOS头和NT头

  4. 使用 GetThreadContext+ReadProcessMemory 获取挂起进程的线程上下文和映像基址

  5. 使用 NtUnmapViewOfSection 卸载挂起进程内存。简单来说,就是在进行进程注入前,确保目标进程的指定内存区域是可用的。官方文档:ZwUnmapViewOfSection 函数 (wdm.h) - Windows drivers | Microsoft Learnarrow-up-right

  6. 使用 VirtualAllocEx+WriteProcessMemory 写入恶意软件代码

  7. 使用SetThreadContext+ResumeThread设置线程上下文与恢复挂起进程

三、分步实现

1. 定义一些变量和结构体

2. 使用 CreateProcessA 创建一个进程,并将其设置为挂起状态(CREATE_SUSPENDED)

创建一个进程,在本例中是cmd进程,被创建的进程可以换其他合法的程序。

3. 使用 CreateFileA+GetFileSize+VirtualAlloc+ReadFile 读取恶意程序的内容到本进程的内存空间中。

开辟一个缓冲区,将恶意程序的内容读到这个缓冲区中,这个缓冲区不需要可执行的权限,所以 VirtualAlloc 可以用关键字new一个缓冲区替代。

4. 获取DOS头和NT头

为什么要获取获取DOS头和NT头?DOS头里有NT的偏移量,而NT头里有着非常丰富的信息,包括进程的 入口点映像基址文件头 等等各种对注入有用的信息。

5. 使用 GetThreadContext+ReadProcessMemory 获取挂起进程的线程上下文和映像基址

GetThreadContext 函数用于检索指定线程的上下文。线程上下文包含寄存器值和其他处理器状态信息,这对于调试和进程控制非常重要。

6. 使用 NtUnmapViewOfSection 卸载挂起进程内存

每一个PE文件都有ImageBase(预期加载基址),如果ImageBase被占用我们就卸载已存在文件

7. 使用 VirtualAllocEx+WriteProcessMemory 写入恶意软件代码

忘记在 PE的相关数据结构 写了,在这里补充节头的定义

恶意软件写入合法进程的空间,先写入文件头后逐段写入。

8. 使用 SetThreadContext+ResumeThread 设置线程上下文与恢复挂起进程

在注入中常用寄存器的调用约定

32 位程序 ImageBase 位于 PEB 结构 +0x8 偏移处

64 位程序 ImageBase 位于 PEB 结构 +0x10 偏移处

  1. 在windows的调用约定中,挂起进程的Eax/Rcx存储着软件的入口点。

  2. Ebx/Rdx存放着PEB的起始地址,而在PEB起始地址的0x8/0x10偏移处存放着Imagebase

四、完整代码

Last updated