逆向工程实战手册 第 44 章

第 44 章 进程注入技术全谱(原理与检测)

进程注入 = 让代码在"别人"的进程里执行。是恶意软件核心技能,也是 EDR 检测的重点。本章系统梳理注入技术族谱:每种技术的原理、代码形态、检测信号、绕过方向

📍 知识点地图 | 主题:进程注入全谱 | 前置:第43章 | 后续:第41章 | 核心概念:DLL/Shellcode/APC/空心化/反射DLL

44.1 注入技术族谱(全景图)

进程注入
├─ 经典 DLL 注入(LoadLibrary 远程线程)
├─ Shellcode 注入(VirtualAllocEx + WriteProcessMemory + CreateRemoteThread)
├─ APC 注入(QueueUserAPC)
├─ 线程劫持(挂起线程改上下文)
├─ 进程空心化(Process Hollowing / RunPE)
├─ 进程双重化(Process Doppelgänging)
├─ 反射式 DLL 注入(Reflective DLL)
├─ 模块踩踏(Module Stomping)
├─ 内存映射注入(MapViewOfSection)
├─ 异常注入(SetThreadContext + 异常)
├─ 驱动注入(内核态,最高权限)
└─ .NET / CLR 注入(AppDomain)

44.2 六大主流技术详解

1. 经典 DLL 注入

流程: OpenProcess → VirtualAllocEx(写 DLL 路径) → CreateRemoteThread(LoadLibraryW)
原理: 让目标进程自己加载恶意 DLL
代码形态:
  OpenProcess(PROCESS_ALL_ACCESS, ...)
  WriteProcessMemory(hProc, buf, "C:\\evil.dll")
  CreateRemoteThread(hProc, LoadLibraryW, buf)

检测信号:
  目标进程出现新模块(Ldr 链表变化)
  CreateRemoteThread 调用(EDR 重点 hook)
  DLL 加载事件(映像加载回调)
  内存写入可执行区域

2. Shellcode 注入

流程: VirtualAllocEx(RWX) → WriteProcessMemory(shellcode) → CreateRemoteThread
变体: 先 RW 写入 → 再保护改 RX(避免常驻 RWX 特征)
原理: 不依赖 DLL(更灵活,配合加密 shellcode)

检测信号:
  远程分配内存 + 远程写入 + 远程执行 三步组合(EDR 的黄金检测模式)
  RWX 页面(旧式写法)
  调用栈异常(返回地址在无模块区域)

3. APC 注入

流程: OpenThread → QueueUserAPC(shellcode, 目标线程, arg)
执行: 目标线程进入可告警等待时执行 APC

检测信号:
  QueueUserAPC 远程调用(跨进程)
  目标线程是系统进程/白名单进程 → 高危信号

优势: 不需要 CreateRemoteThread(绕早期检测)
变体: Early Bird —— 挂起进程创建 → 注入 → 恢复(主线程执行前注入)

4. 进程空心化(Process Hollowing)

流程: CreateProcess(挂起) → NtUnmapViewOfSection(清空目标镜像)
     → VirtualAllocEx(映射恶意镜像) → SetThreadContext(新入口) → ResumeThread
原理: 复用合法进程的外壳(如 svchost.exe),替换内容

检测信号:
  进程映像被卸载(UnmapViewOfSection 可疑)
  映射后镜像与磁盘文件不一致
  入口点不是合法 PE 头
  进程行为与正常身份不符

5. 反射式 DLL 注入(Reflective DLL)

流程: 手工映射 DLL 到目标进程(不通过 LoadLibrary)
     → 自己解析 PE → 重定位 → 导入 → 执行 DllMain
原理: 无 LoadLibrary 调用 → 目标进程看不到模块加载事件(绕模块枚举)

检测信号:
  内存中有 PE 结构但不在模块链表
  EDR 扫描内存发现未知镜像
  VAD 异常区域

6. 模块踩踏(Module Stomping)

流程: 先 LoadLibrary 一个合法 DLL(进模块表)→ 覆写其内容为恶意代码
原理: 复用已加载模块的内存 → 模块列表正常 → 绕模块白名单

检测信号:
  模块内容与磁盘不一致(内存扫描)
  页面保护被修改
  模块哈希变化

44.3 注入技术对比表(选型与检测)

技术 隐蔽性 稳定性 经典检测 适用场景
DLL 注入 模块加载/远程线程 老工具/学习
Shellcode 注入 三步组合/RWX 通用
APC 注入 中高 APC 远程排队 绕远程线程检测
进程空心化 映像卸载/镜像漂移 白进程伪装
反射式 DLL 内存扫描 免模块事件
模块踩踏 内容 vs 磁盘比对 绕白名单
驱动注入 极高 驱动加载 内核对抗

44.4 注入的"三层执行"(理解检测的深度)

第 1 层: 可见的 API 行为(CreateRemoteThread 等)
  → EDR hook 检测(第 41 章)→ 绕: 直接 syscall

第 2 层: 内存状态(RWX/新区域/无模块代码)
  → EDR 内存扫描/内核回调
  → 绕: 分步改权限、加密内存、模块踩踏

第 3 层: 行为模式(跨进程写入+执行组合、执行来源)
  → 行为分析/调用栈检测
  → 绕: 调用栈欺骗、间接调用、内核驱动

44.5 注入的防御视角(蓝队/取证)

检测清单:
  □ 跨进程 VirtualAllocEx + WriteProcessMemory + CreateRemoteThread 组合
  □ 进程被挂起后又恢复(空心化特征)
  □ 模块列表外的可执行内存
  □ 白名单进程(svchost/lsass)异常加载/写入
  □ 页面保护频繁切换 RW↔RX
  □ 调用栈返回地址无模块归属
  □ 映像内存与磁盘文件不一致(哈希比对)

分析工具: pe-sieve(扫描注入)、Process Hacker、Volatility malfind(第 26 章)

44.6 分析注入样本的方法论

1. 定位注入行为: API 监控(跨进程 API 调用序列)
2. 找到注入的目标进程(被写入的进程)
3. 提取被注入的内容(内存 dump 目标进程可疑区域)
4. 还原 shellcode/模块(脱壳/解密,第 25 章)
5. 分析恶意逻辑(前面所有章节的通用流程)
6. 识别注入技术家族(对照 44.2 特征表)

动手练习

  1. 写一个 Shellcode 注入 Demo(注入一个无害 shellcode 到测试进程),用 pe-sieve/Volatility 观察检测信号。
  2. 用 API Monitor 观察一次注入调用的完整 API 序列(对照 44.2 流程)。
  3. 分析一个公开的 loader 样本(GitHub 有源码对照),指出它用的注入技术栈。
  4. 练习 Process Hollowing 的内存分析:空心化后进程的 PEB 镜像路径 vs 实际内容差异。

深入阅读

  • 仓库:skills/edr-bypass-re/(注入绕 EDR 的对抗)
  • 仓库:skills/attack-chain/references/evasion-cheatsheet.md(模块踩踏/注入实战速查)
  • 仓库:skills/malware-analysis/references/anti-analysis-techniques.md(注入对抗分析)
  • 仓库:skills/reverse-engineering/kernel-driver-reverse.md(驱动注入/内核对抗)
  • 仓库:skills/reverse-engineering/field-notes.md(内存 dump 与注入案例)