| name | detecting-process-injection-techniques |
| description | 检测和分析恶意软件使用的进程注入技术,包括经典 DLL 注入、进程空洞化、APC 注入、线程劫持 和反射式加载。使用内存取证、API 监控和行为分析来识别注入痕迹。适用于进程注入检测、 代码注入分析、空洞化进程调查或内存威胁检测等请求场景。
|
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["malware","process-injection","detection","memory-forensics","defense-evasion"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
检测进程注入技术
适用场景
- EDR 告警显示可疑 API 调用序列(VirtualAllocEx + WriteProcessMemory + CreateRemoteThread)
- 合法进程(explorer.exe、svchost.exe)出现意外的网络连接或文件操作
- 内存取证发现本不应含有可执行代码的内存区域中存在可执行代码
- 调查恶意软件藏匿在可信进程内部的就地取材(LOL)攻击
- 为 EDR 或 SIEM 规则中的特定注入技术构建检测逻辑
不适用于标准 DLL 加载分析;注入意味着在未经目标进程配合的情况下将未授权代码植入该进程。
前置条件
- Volatility 3,用于注入痕迹的内存取证分析
- 配置了事件 ID 8(CreateRemoteThread)和 10(ProcessAccess)的 Sysmon
- API Monitor 或 x64dbg,用于实时观察注入 API 调用
- Process Hacker 或 Process Explorer,用于检查进程内存区域
- 理解 Windows 内存管理(VirtualAlloc、VAD、页面保护)
- 用于安全执行和监控恶意软件的隔离分析环境
工作流程
步骤 1:通过内存取证识别注入
使用 Volatility 检测进程内存中的注入代码:
vol3 -f memory.dmp windows.malfind
vol3 -f memory.dmp windows.malfind --pid 852
vol3 -f memory.dmp windows.malfind --dump
vol3 -f memory.dmp windows.vadinfo --pid 852
vol3 -f memory.dmp windows.hollowfind
步骤 2:对注入技术进行分类
根据痕迹识别所使用的注入方法:
进程注入技术与检测痕迹:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 经典 DLL 注入
API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
痕迹:目标进程中已加载的 DLL 在已知基线中不存在
检测:dlllist 中的新 DLL 与磁盘哈希不符、CreateRemoteThread 事件
2. 进程空洞化(RunPE)
API:CreateProcess(SUSPENDED) -> NtUnmapViewOfSection -> VirtualAllocEx ->
WriteProcessMemory -> SetThreadContext -> ResumeThread
痕迹:内存中的进程映像与磁盘文件不匹配
检测:hollowfind 插件、PE 头与磁盘文件不一致
3. APC 注入
API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> QueueUserAPC
痕迹:可警觉线程中已排队的 APC 指向注入代码
检测:线程起始地址超出已知模块范围
4. 线程劫持
API:OpenProcess -> VirtualAllocEx -> WriteProcessMemory ->
SuspendThread -> GetThreadContext -> SetThreadContext -> ResumeThread
痕迹:线程指令指针被修改为指向注入代码
检测:线程上下文被修改,EIP/RIP 超出模块边界
5. 反射式 DLL 注入
API:VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread(指向反射式加载器)
痕迹:DLL 已加载到内存但不在已加载模块列表中
检测:malfind(非镜像内存中的 PE)、模块不在 ldrmodules 中
6. 进程幻影化(Process Doppelganging)
API:NtCreateTransaction -> NtCreateFile(事务性)-> NtWriteFile ->
NtCreateSection -> NtRollbackTransaction -> NtCreateProcessEx
痕迹:进程由已回滚的事务性文件创建
检测:磁盘上无对应文件的进程
7. AtomBombing
API:GlobalAddAtom -> NtQueueApcThread(配合 GlobalGetAtomName)
痕迹:代码存储在全局原子表中,APC 触发将其复制到目标进程
检测:异常的原子表条目、APC 注入指标
步骤 3:通过 Sysmon 事件检测注入
分析 Sysmon 和 Windows 事件日志数据:
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=8]]" /f:text /c:20
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=10]]" /f:text /c:20
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=1]]" /f:text /c:20
import xml.etree.ElementTree as ET
import subprocess
result = subprocess.run(
["wevtutil", "qe", "Microsoft-Windows-Sysmon/Operational",
"/q:*[System[EventID=8]]", "/f:xml", "/c:100"],
capture_output=True, text=True
)
suspicious_injections = []
for event_xml in result.stdout.split("</Event>"):
if not event_xml.strip():
continue
try:
root = ET.fromstring(event_xml + "</Event>")
ns = {"e": "http://schemas.microsoft.com/win/2004/08/events/event"}
data = {}
for d in root.findall(".//e:EventData/e:Data", ns):
data[d.get("Name")] = d.text
source = data.get("SourceImage", "")
target = data.get("TargetImage", "")
system_procs = ["svchost.exe", "explorer.exe", "lsass.exe", "winlogon.exe"]
if any(p in target.lower() for p in system_procs):
if not any(p in source.lower() for p [, , ]):
()
suspicious_injections.append(data)
:
步骤 4:分析注入代码
检查注入的载荷以了解其目的:
vol3 -f memory.dmp windows.malfind --pid 852 --dump
file malfind.*.dmp
python3 << 'PYEOF'
import pefile
try:
pe = pefile.PE("malfind.852.0x400000.dmp")
print("Injected PE detected!")
print(f" Architecture: {'x64' if pe.FILE_HEADER.Machine == 0x8664 else 'x86'}")
print(f" Imports:")
if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
for entry in pe.DIRECTORY_ENTRY_IMPORT:
print(f" {entry.dll.decode()}: {len(entry.imports)} functions")
except:
print("Not a valid PE - likely shellcode")
with open("malfind.852.0x400000.dmp", "rb") as f:
shellcode = f.read()
print(f" Size: {len(shellcode)} bytes")
print(f" First bytes: {shellcode[:32].hex()}")
PYEOF
python3 -c "
from capstone import Cs, CS_ARCH_X86, CS_MODE_64
with open('malfind.852.0x400000.dmp', 'rb') as f:
code = f.read()[:256]
md = Cs(CS_ARCH_X86, CS_MODE_64)
for insn in md.disasm(code, 0x400000):
print(f' 0x{insn.address:X}: {insn.mnemonic} {insn.op_str}')
"
vol3 -f memory.dmp yarascan.YaraScan --pid 852 --yara-file malware_rules.yar
步骤 5:映射到 MITRE ATT&CK
在 ATT&CK 框架中对检测到的技术进行分类:
MITRE ATT&CK 进程注入子技术(T1055):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
T1055.001 动态链接库注入
T1055.002 可移植可执行文件注入
T1055.003 线程执行劫持
T1055.004 异步过程调用(APC)
T1055.005 线程本地存储
T1055.008 Ptrace 系统调用(Linux)
T1055.009 Proc 内存(/proc/pid/mem - Linux)
T1055.011 额外窗口内存注入
T1055.012 进程空洞化
T1055.013 进程幻影化
T1055.014 VDSO 劫持(Linux)
T1055.015 ListPlanting
步骤 6:创建检测签名
为已识别的技术构建检测规则:
title: Suspicious CreateRemoteThread into System Process
logsource:
product: windows
service: sysmon
detection:
selection:
EventID: 8
TargetImage|endswith:
- '\svchost.exe'
- '\explorer.exe'
- '\lsass.exe'
filter:
SourceImage|endswith:
- '\csrss.exe'
- '\services.exe'
- '\svchost.exe'
condition: selection and not filter
level: high
核心概念
| 术语 | 定义 |
|---|
| 进程注入 | 在另一个进程的地址空间中执行代码的技术,通常用于规避检测并继承目标进程的信任级别 |
| 进程空洞化 | 以挂起状态创建合法进程、取消映射其内存、写入恶意代码并恢复执行,以伪装成合法进程 |
| 反射式 DLL 注入 | 在不使用 Windows 加载器的情况下将 DLL 加载到进程内存中,使 DLL 不出现在已加载模块列表中 |
| APC 注入 | 向目标进程中的线程排队异步过程调用,使其在线程进入可警觉状态时执行注入代码 |
| VAD(虚拟地址描述符) | 描述进程内存区域的 Windows 内核结构;异常的 VAD 条目(RWX 权限、非镜像 PE)表明存在注入 |
| CreateRemoteThread | 在另一个进程中创建线程的 Windows API;是经典 DLL 注入及许多其他注入技术的主要机制 |
| PAGE_EXECUTE_READWRITE | 允许读、写和执行的内存保护标志;合法应用程序极少使用,是注入代码的常见指标 |
工具与系统
- Volatility(malfind):内存取证插件,通过 VAD 分析和扫描非镜像内存中的 PE 头来检测注入代码
- Sysmon:系统监控工具,提供详细的 Windows 事件日志,包括 CreateRemoteThread(EID 8)和 ProcessAccess(EID 10)
- Process Hacker:高级进程管理工具,显示详细的内存区域、线程栈和注入模块
- API Monitor:Windows 工具,用于监控和记录进程的 API 调用,便于实时观察注入序列
- pe-sieve:扫描运行中进程以发现代码注入、钩挂和空洞化迹象的工具
常见场景
场景:调查空洞化的 svchost.exe 进程
背景:EDR 告警显示 svchost.exe 向外部 IP 发起 HTTPS 连接。svchost.exe 通常只与 Microsoft 服务通信,需要进行内存分析以确认进程空洞化。
方法:
- 捕获可疑 svchost.exe 进程的内存转储
- 运行 Volatility
malfind 检测进程内存中注入的 PE
- 将内存中的映像基地址与磁盘上 svchost.exe 文件的哈希进行对比
- 检查进程父进程(应为 services.exe)和创建参数
- 从内存中转储空洞化的可执行文件并使用 Ghidra 分析
- 运行
netscan 确认空洞化进程的网络连接
- 使用 YARA 扫描转储代码以识别恶意软件家族
注意事项:
- 不要假设所有 svchost.exe 实例完全相同(每个实例加载不同的服务 DLL)
- 不要忘记检查父进程(空洞化进程通常父进程有误)
- 不要仅依赖进程名称匹配(攻击者特意针对 svchost.exe,因为系统中预期存在多个实例)
- 注意注入源进程可能已经终止
输出格式
进程注入分析报告
====================================
转储文件: memory.dmp
分析工具: Volatility 3.2 + Sysmon
检测到注入
目标进程: svchost.exe(PID:852)
源进程: malware.exe(PID:2184)[已终止]
技术: 进程空洞化(T1055.012)
证据
malfind 结果:
PID 852(svchost.exe):
地址:0x00400000
大小:184,320 字节
保护:PAGE_EXECUTE_READWRITE
头:MZ(PE32 可执行文件)
未被磁盘文件支撑
进程验证:
预期映像:C:\Windows\System32\svchost.exe(SHA-256:aaa...)
内存映像:未知 PE(SHA-256:bbb...)
结果:不匹配 - 进程已被空洞化
Sysmon 事件:
[4688] malware.exe(PID 2184)以挂起状态创建 svchost.exe(PID 852)
[10] malware.exe 以 PROCESS_VM_WRITE 权限访问 svchost.exe
[8] malware.exe 在 svchost.exe 中创建了远程线程
注入载荷分析
SHA-256: bbb123def456...
YARA 匹配: CobaltStrike_Beacon_x64
类型: Cobalt Strike Beacon(HTTP)
C2: hxxps://185.220.101[.]42/updates
MITRE ATT&CK
T1055.012 进程空洞化
T1071.001 Web 协议(HTTPS C2)
T1036.005 匹配合法名称(svchost.exe)