Detects and analyzes malware process injection techniques like DLL injection, process hollowing, APC injection, thread hijacking using Volatility memory forensics, Sysmon events, and API monitoring.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- EDR 告警显示可疑 API 调用序列(VirtualAllocEx + WriteProcessMemory + CreateRemoteThread)
Detects and analyzes malware process injection techniques like DLL injection, process hollowing, APC injection, thread hijacking via memory forensics (Volatility), Sysmon, and API monitoring. For EDR alerts and in-memory threats.
Detects malware process injection techniques including DLL injection, process hollowing, APC injection, and reflective loading via Volatility memory forensics, Sysmon, and API monitoring. For EDR alerts and suspicious processes.
Detects process injection (MITRE T1055) via Sysmon events 7,8,10,25 for DLL injection, process hollowing, APC, and more. Includes Splunk queries for threat hunting suspicious cross-process activity.
Share bugs, ideas, or general feedback.
不适用于标准 DLL 加载分析;注入意味着在未经目标进程配合的情况下将未授权代码植入该进程。
使用 Volatility 检测进程内存中的注入代码:
# malfind:主要的注入检测插件
vol3 -f memory.dmp windows.malfind
# malfind 检测以下内容:
# - 具有 PAGE_EXECUTE_READWRITE(RWX)保护的内存区域
# - 非镜像 VAD 条目中的 PE 头(MZ 签名)
# - 未被磁盘文件支撑的可执行内存
# 按特定进程过滤
vol3 -f memory.dmp windows.malfind --pid 852
# 转储注入的内存区域以供分析
vol3 -f memory.dmp windows.malfind --dump
# 检查 VAD(虚拟地址描述符)树是否存在异常
vol3 -f memory.dmp windows.vadinfo --pid 852
# 检测空洞化进程(内存中的映像与磁盘不匹配)
vol3 -f memory.dmp windows.hollowfind
根据痕迹识别所使用的注入方法:
进程注入技术与检测痕迹:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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 注入指标
分析 Sysmon 和 Windows 事件日志数据:
# Sysmon 事件 ID 8:CreateRemoteThread
# 检测一个进程在另一个进程中创建线程的行为
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=8]]" /f:text /c:20
# Sysmon 事件 ID 10:ProcessAccess
# 检测对其他进程的可疑访问权限
# DesiredAccess 包含 PROCESS_VM_WRITE(0x0020)+ PROCESS_CREATE_THREAD(0x0002)
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=10]]" /f:text /c:20
# Sysmon 事件 ID 1:进程创建
# 通过可疑的父子关系检测进程空洞化
wevtutil qe "Microsoft-Windows-Sysmon/Operational" \
/q:"*[System[EventID=1]]" /f:text /c:20
# 解析 Sysmon 事件中的注入指标
import xml.etree.ElementTree as ET
import subprocess
# 查询 CreateRemoteThread 事件
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 in ["csrss.exe", "services.exe", "lsass.exe"]):
print(f"[!] Suspicious injection: {source} -> {target}")
suspicious_injections.append(data)
except:
pass
检查注入的载荷以了解其目的:
# 从 Volatility malfind 转储注入代码
vol3 -f memory.dmp windows.malfind --pid 852 --dump
# 分析转储的区域
file malfind.*.dmp
# 如果包含 PE(MZ 头),作为独立可执行文件分析
python3 << 'PYEOF'
import pefile
# 尝试作为 PE 解析
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")
# 作为 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
# 反汇编 Shellcode
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}')
"
# 使用 YARA 扫描已知载荷
vol3 -f memory.dmp yarascan.YaraScan --pid 852 --yara-file malware_rules.yar
在 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
为已识别的技术构建检测规则:
# CreateRemoteThread 注入的 Sigma 规则
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 | 允许读、写和执行的内存保护标志;合法应用程序极少使用,是注入代码的常见指标 |
背景:EDR 告警显示 svchost.exe 向外部 IP 发起 HTTPS 连接。svchost.exe 通常只与 Microsoft 服务通信,需要进行内存分析以确认进程空洞化。
方法:
malfind 检测进程内存中注入的 PEnetscan 确认空洞化进程的网络连接注意事项:
进程注入分析报告
====================================
转储文件: 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)