进程注入技术总结
字数 3694 2025-09-01 11:26:11

进程注入技术深度解析

1. Process Ghosting 技术

1.1 Windows 创建进程基本流程

  1. 使用 CreateFile API 打开可执行文件,获取文件句柄
  2. 创建文件映像,通过 NtCreateSection 将文件内容映射到内存中
  3. 使用内存映像创建进程对象
  4. 设置进程环境(配置进程所需的环境变量和参数)
  5. 创建主线程(通过 NtCreateThreadEx 创建进程的主线程,启动执行)

1.2 Process Ghosting 核心原理

利用文件删除标志实现无实体文件的进程执行。

文件删除机制(非传统 Del 命令)

  • 方式一:在 CreateFile/NtOpenFile 时设置以下标志:
    • FILE_DELETE_ON_CLOSE
    • FILE_SUPERSEDE
    • FILE_FLAG_DELETE_ON_CLOSE
  • 方式二:通过 NtSetInformationFile 设置 FILE_DISPOSITION_INFORMATION 结构的 DeleteFile 字段为 TRUE

关键条件:需在文件内容被映射到进程内存(Section)后关闭句柄,删除标志才会生效。

1.3 Process Ghosting 攻击流程

  1. 创建临时文件:创建一个用于存储恶意载荷的临时文件
  2. 设置删除挂起状态:通过 NtSetInformationFile 设置 FileDispositionInformation,将文件标记为"删除挂起"
    • 注意:单独使用 FILE_DELETE_ON_CLOSE 无法完成此操作
  3. 写入恶意载荷:将恶意代码写入临时文件,但由于文件已处于删除挂起状态,内容不会持久化,且外部无法再次打开该文件
  4. 创建内存映像:使用 NtCreateSection 将文件内容映射到内存中
  5. 删除物理文件:关闭文件句柄,触发删除标志,删除物理文件
  6. 创建幽灵进程:使用内存中的映像(Section)创建进程
  7. 配置进程环境:设置进程参数和环境变量
  8. 执行恶意代码:通过 NtCreateThreadEx 创建线程,在新进程中执行恶意载荷

1.4 代码实现分析(hasherezade/process_ghosting)

核心函数 process_ghost 实现流程:

  1. 生成随机文件名 dummy_name
  2. 调用 make_section_from_delete_pending_file 函数:
    • 创建文件
    • 设置文件属性的删除标志为 TRUE(告诉系统在文件句柄关闭时删除文件)
    • 将完整的带有 shellcode 的 PE 写入带有删除标记的文件
    • 创建内存节,将文件内容写入到内存节中
    • 关闭文件句柄(触发文件删除)
  3. 创建线程执行内存中的 PE:
    • 获取 PEB 信息
    • 计算 shellcode 的入口点
    • 创建线程执行

2. Process Reimaging(进程重塑)

2.1 技术原理

基于操作系统对文件和进程的管理方式:

  • Windows 系统启动可执行文件为进程时,会创建一个到该文件的活动引用
  • 文件系统允许在不影响已打开文件引用的情况下修改或替换磁盘上的文件
  • 利用这一点,可以在不终止进程的情况下替换或修改正在运行的程序的代码
  • 欺骗安全产品在错误的路径上查找加载的映像

2.2 实现效果

内存中的内容和磁盘文件不一样。

2.3 代码实现示例

  1. 获取当前进程的文件位置
  2. 创建两个文件夹:
    • 用于存储要伪造的文件
    • 用于存储恶意文件
  3. 启动黑程序
  4. 将黑程序移动到 hidden 文件夹中
  5. 用白程序的目录以和黑程序相同的名字创建,覆盖掉原位置
  6. 最终实现隐藏效果

3. Process Doppelgänging(进程重影)

3.1 技术背景

  • 微软为安全产品供应商提供了注册系统回调的功能
  • 安全产品可调用 PsSetCreateProcessNotifyRoutineEx 等 API 感知系统创建进程的事件
  • 但这些回调函数在创建进程时不会被立即调用,而是在该进程中创建第一个线程之后才会被感知
  • 在创建进程和系统通知安全产品之间产生时间差,可在安全产品扫描磁盘可执行文件之前篡改它

3.2 技术本质

利用 TxF(事务文件)的回滚特性:

  • 将恶意载荷通过 Section 创建
  • 根据回滚特性恢复原样
  • 关键 API:NtCreateProcessEx 的第6个参数(SectionHandle 句柄,来自 transacted file)

3.3 代码实现分析(hasherezade/transacted_hollowing)

核心函数 transacted_hollowing 实现流程:

  1. 根据 GHOSTING 状态选择不同方式:
    • GHOSTING 模式:调用 make_transacted_section(事务文件方式)
    • GHOSTING 模式:调用 make_section_from_delete_pending_file(待删除文件方式)

事务文件方式 (make_transacted_section)

  1. 创建事务对象
  2. 通过原生 API 将内存中的 payload 写入创建的事务文件
  3. 基于事务文件创建只读、可执行的内存节(section)
  4. 关闭不再需要的文件句柄
  5. 通过 RollbackTransaction 回滚事务文件(磁盘文件恢复原样,内存中保留 payload)
  6. 释放资源文件

后续流程:

  1. 创建挂起的进程
  2. 将内存中的 shellcode 映射到进程中
  3. 安全软件扫描时只能看到回滚后的磁盘文件,无法发现 shellcode(需通过内存扫描检测)

4. Process Hollowing(进程空洞)

4.1 技术原理

  1. 以挂起状态(suspended state)创建一个看似无害的进程
  2. 取消映射(unmapped)该合法镜像
  3. 替换为需要隐藏的镜像
  4. 如果需要,对新镜像进行基址重定位(rebased)
  5. 将挂起线程的 EAX 寄存器设置为新镜像的入口点
  6. 恢复进程运行,执行新镜像的入口点

4.2 代码实现分析(KageHayashi/HollowWhisper)

核心流程:

  1. 进程创建准备

    • 获取顶级父进程 ID (GetTopParentProcessId)
      • 创建进程快照 (CreateToolhelp32Snapshot)
      • 遍历进程树找到目标进程的最高级父进程
    • 读取 shellcode (ReadBinaryFile)
  2. 进程空洞化实现

    • 打开父进程获取句柄 (OpenProcessPROCESS_ALL_ACCESS 权限)
    • 设置父进程 (UpdateProcThreadAttribute)
    • 创建挂起的进程 (CreateProcessCREATE_SUSPENDED | EXTENDED_STARTUPINFO_PRESENT 标志)
    • 分配内存 (NtAllocateVirtualMemoryPAGE_READWRITE 权限)
    • 写入 shellcode (NtWriteVirtualMemory,分块写入,每10次后随机 sleep 增加隐蔽性)
    • 设置内存权限为可读可执行
    • 获取并修改线程上下文,设置寄存器指向 shellcode
    • 恢复线程执行

5. 技术对比

技术名称 核心机制 隐蔽性特点 关键API
Process Ghosting 文件删除标志 无实体文件执行 NtSetInformationFile, NtCreateSection
Process Reimaging 文件引用替换 内存与磁盘内容不一致 文件操作API
Process Doppelgänging 事务文件回滚 利用回调时间差 NtCreateProcessEx, 事务API
Process Hollowing 进程镜像替换 合法进程外壳 CreateProcess, 内存操作API

6. 防御建议

  1. 监控关键API调用

    • NtCreateSection
    • NtSetInformationFile (特别是 FileDispositionInformation)
    • 事务文件相关API
    • CreateProcess 带挂起标志
  2. 行为检测

    • 进程创建后立即修改内存
    • 内存与磁盘可执行文件不一致
    • 进程父进程异常
  3. 增强扫描

    • 不仅扫描磁盘文件,还需扫描进程内存
    • 检测基址重定位等异常行为
  4. 权限控制

    • 限制进程创建权限
    • 监控高权限进程行为

这些进程注入技术展示了现代恶意软件如何利用操作系统特性绕过传统安全检测,防御需要结合多层次的检测手段和行为分析。

进程注入技术深度解析 1. Process Ghosting 技术 1.1 Windows 创建进程基本流程 使用 CreateFile API 打开可执行文件,获取文件句柄 创建文件映像,通过 NtCreateSection 将文件内容映射到内存中 使用内存映像创建进程对象 设置进程环境(配置进程所需的环境变量和参数) 创建主线程(通过 NtCreateThreadEx 创建进程的主线程,启动执行) 1.2 Process Ghosting 核心原理 利用文件删除标志实现无实体文件的进程执行。 文件删除机制(非传统 Del 命令) : 方式一:在 CreateFile/NtOpenFile 时设置以下标志: FILE_DELETE_ON_CLOSE FILE_SUPERSEDE FILE_FLAG_DELETE_ON_CLOSE 方式二:通过 NtSetInformationFile 设置 FILE_DISPOSITION_INFORMATION 结构的 DeleteFile 字段为 TRUE 关键条件 :需在文件内容被映射到进程内存(Section)后关闭句柄,删除标志才会生效。 1.3 Process Ghosting 攻击流程 创建临时文件 :创建一个用于存储恶意载荷的临时文件 设置删除挂起状态 :通过 NtSetInformationFile 设置 FileDispositionInformation ,将文件标记为"删除挂起" 注意:单独使用 FILE_DELETE_ON_CLOSE 无法完成此操作 写入恶意载荷 :将恶意代码写入临时文件,但由于文件已处于删除挂起状态,内容不会持久化,且外部无法再次打开该文件 创建内存映像 :使用 NtCreateSection 将文件内容映射到内存中 删除物理文件 :关闭文件句柄,触发删除标志,删除物理文件 创建幽灵进程 :使用内存中的映像(Section)创建进程 配置进程环境 :设置进程参数和环境变量 执行恶意代码 :通过 NtCreateThreadEx 创建线程,在新进程中执行恶意载荷 1.4 代码实现分析(hasherezade/process_ ghosting) 核心函数 process_ghost 实现流程: 生成随机文件名 dummy_name 调用 make_section_from_delete_pending_file 函数: 创建文件 设置文件属性的删除标志为 TRUE (告诉系统在文件句柄关闭时删除文件) 将完整的带有 shellcode 的 PE 写入带有删除标记的文件 创建内存节,将文件内容写入到内存节中 关闭文件句柄(触发文件删除) 创建线程执行内存中的 PE: 获取 PEB 信息 计算 shellcode 的入口点 创建线程执行 2. Process Reimaging(进程重塑) 2.1 技术原理 基于操作系统对文件和进程的管理方式: Windows 系统启动可执行文件为进程时,会创建一个到该文件的活动引用 文件系统允许在不影响已打开文件引用的情况下修改或替换磁盘上的文件 利用这一点,可以在不终止进程的情况下替换或修改正在运行的程序的代码 欺骗安全产品在错误的路径上查找加载的映像 2.2 实现效果 内存中的内容和磁盘文件不一样。 2.3 代码实现示例 获取当前进程的文件位置 创建两个文件夹: 用于存储要伪造的文件 用于存储恶意文件 启动黑程序 将黑程序移动到 hidden 文件夹中 用白程序的目录以和黑程序相同的名字创建,覆盖掉原位置 最终实现隐藏效果 3. Process Doppelgänging(进程重影) 3.1 技术背景 微软为安全产品供应商提供了注册系统回调的功能 安全产品可调用 PsSetCreateProcessNotifyRoutineEx 等 API 感知系统创建进程的事件 但这些回调函数在创建进程时不会被立即调用,而是在该进程中创建第一个线程之后才会被感知 在创建进程和系统通知安全产品之间产生时间差,可在安全产品扫描磁盘可执行文件之前篡改它 3.2 技术本质 利用 TxF(事务文件)的回滚特性: 将恶意载荷通过 Section 创建 根据回滚特性恢复原样 关键 API: NtCreateProcessEx 的第6个参数( SectionHandle 句柄,来自 transacted file) 3.3 代码实现分析(hasherezade/transacted_ hollowing) 核心函数 transacted_hollowing 实现流程: 根据 GHOSTING 状态选择不同方式: 非 GHOSTING 模式:调用 make_transacted_section (事务文件方式) GHOSTING 模式:调用 make_section_from_delete_pending_file (待删除文件方式) 事务文件方式 ( make_transacted_section ) : 创建事务对象 通过原生 API 将内存中的 payload 写入创建的事务文件 基于事务文件创建只读、可执行的内存节(section) 关闭不再需要的文件句柄 通过 RollbackTransaction 回滚事务文件(磁盘文件恢复原样,内存中保留 payload) 释放资源文件 后续流程: 创建挂起的进程 将内存中的 shellcode 映射到进程中 安全软件扫描时只能看到回滚后的磁盘文件,无法发现 shellcode(需通过内存扫描检测) 4. Process Hollowing(进程空洞) 4.1 技术原理 以挂起状态(suspended state)创建一个看似无害的进程 取消映射(unmapped)该合法镜像 替换为需要隐藏的镜像 如果需要,对新镜像进行基址重定位(rebased) 将挂起线程的 EAX 寄存器设置为新镜像的入口点 恢复进程运行,执行新镜像的入口点 4.2 代码实现分析(KageHayashi/HollowWhisper) 核心流程: 进程创建准备 : 获取顶级父进程 ID ( GetTopParentProcessId ) 创建进程快照 ( CreateToolhelp32Snapshot ) 遍历进程树找到目标进程的最高级父进程 读取 shellcode ( ReadBinaryFile ) 进程空洞化实现 : 打开父进程获取句柄 ( OpenProcess 带 PROCESS_ALL_ACCESS 权限) 设置父进程 ( UpdateProcThreadAttribute ) 创建挂起的进程 ( CreateProcess 带 CREATE_SUSPENDED | EXTENDED_STARTUPINFO_PRESENT 标志) 分配内存 ( NtAllocateVirtualMemory 带 PAGE_READWRITE 权限) 写入 shellcode ( NtWriteVirtualMemory ,分块写入,每10次后随机 sleep 增加隐蔽性) 设置内存权限为可读可执行 获取并修改线程上下文,设置寄存器指向 shellcode 恢复线程执行 5. 技术对比 | 技术名称 | 核心机制 | 隐蔽性特点 | 关键API | |---------|---------|-----------|---------| | Process Ghosting | 文件删除标志 | 无实体文件执行 | NtSetInformationFile , NtCreateSection | | Process Reimaging | 文件引用替换 | 内存与磁盘内容不一致 | 文件操作API | | Process Doppelgänging | 事务文件回滚 | 利用回调时间差 | NtCreateProcessEx , 事务API | | Process Hollowing | 进程镜像替换 | 合法进程外壳 | CreateProcess , 内存操作API | 6. 防御建议 监控关键API调用 : NtCreateSection NtSetInformationFile (特别是 FileDispositionInformation ) 事务文件相关API CreateProcess 带挂起标志 行为检测 : 进程创建后立即修改内存 内存与磁盘可执行文件不一致 进程父进程异常 增强扫描 : 不仅扫描磁盘文件,还需扫描进程内存 检测基址重定位等异常行为 权限控制 : 限制进程创建权限 监控高权限进程行为 这些进程注入技术展示了现代恶意软件如何利用操作系统特性绕过传统安全检测,防御需要结合多层次的检测手段和行为分析。