第 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 特征表)
动手练习
- 写一个 Shellcode 注入 Demo(注入一个无害 shellcode 到测试进程),用 pe-sieve/Volatility 观察检测信号。
- 用 API Monitor 观察一次注入调用的完整 API 序列(对照 44.2 流程)。
- 分析一个公开的 loader 样本(GitHub 有源码对照),指出它用的注入技术栈。
- 练习 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 与注入案例)