
Memory Forensics Evasion
- 25 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with ai & agent building tasks during AI-assisted development.
About
memory-forensics-evasion is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- memory-forensics-evasion
- AI & Agent Building
- AI-coding skill
Memory Forensics Evasion by the numbers
- 25 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #9,764 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill memory-forensics-evasionAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 25 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
内存取证与反内存取证
双面视角:理解蓝队如何从内存中找到你 → 设计红队对策让自己不被找到
⛔ 深入参考
- Volatility3 完整插件速查与实战命令 → references/volatility3-cheatsheet.md
- 反内存取证技术实现细节 → references/anti-memory-forensics.md
---
Part A: 蓝队视角 — 内存取证分析流程
Phase 1: 内存获取
# Windows (DumpIt)
DumpIt.exe /OUTPUT memory.raw
# Windows (WinPmem)
winpmem_mini_x64.exe memory.raw
# Linux (LiME)
sudo insmod lime-$(uname -r).ko "path=memory.lime format=lime"
# 远程 (Velociraptor)
# 通过 Velociraptor agent 远程获取内存Phase 2: Volatility3 分析决策树
内存分析目标?
├─ 发现恶意进程 → windows.pslist / windows.psscan / windows.cmdline
├─ 发现注入代码 → windows.malfind / windows.hollowprocesses
├─ 提取网络连接 → windows.netscan / windows.netstat
├─ 提取凭据 → windows.hashdump / windows.lsadump
├─ 发现隐藏进程 → windows.psscan(扫描已释放 EPROCESS)
├─ Rootkit 检测 → windows.ssdt / windows.callbacks
└─ 提取文件 → windows.filescan / windows.dumpfiles核心命令:
# 系统信息
vol -f mem.raw windows.info
# 进程列表(链表遍历 → 已 unlink 的看不到)
vol -f mem.raw windows.pslist
# 进程扫描(池标签扫描 → 能找到隐藏进程)
vol -f mem.raw windows.psscan
# ⛔ 对比 pslist vs psscan → 差异 = 隐藏进程
# pslist 有但 psscan 无 → 异常
# psscan 有但 pslist 无 → 被 unlink 的进程(Rootkit)
# 注入检测(PAGE_EXECUTE_READWRITE 内存区域)
vol -f mem.raw windows.malfind
# 网络连接
vol -f mem.raw windows.netscan
# DLL 列表
vol -f mem.raw windows.dlllist --pid <PID>
# 命令行参数
vol -f mem.raw windows.cmdlinePhase 3: 关键检测指标
| 蓝队检测项 | 含义 |
|---|---|
| RWX 内存页 (malfind) | 进程注入/Shellcode |
| 父进程异常 (svchost→cmd) | 恶意进程创建链 |
| pslist ≠ psscan | 进程隐藏(DKOM) |
| 同名异路径进程 | 进程伪装 |
| 异常 VAD 标签 | 内存区域被篡改 |
| SSDT/IDT hook | Rootkit |
| 网络连接到异常端口 | C2 通信 |
---
Part B: 红队视角 — 反内存取证
策略 1: 避免被 malfind 发现
malfind 原理:扫描 PAGE_EXECUTE_READWRITE 的 VAD 节点
├─ 对策 1: 分配时用 RW,写入 shellcode 后改为 RX(不要 RWX)
├─ 对策 2: 使用 NtMapViewOfSection 映射 → 权限为 SECTION_MAP_EXECUTE
├─ 对策 3: Module Stomping — 覆盖合法 DLL 的 .text 节
└─ 对策 4: 使用回调执行(APC/Timer)→ 不创建远程线程策略 2: 避免进程异常
父子进程关系审计绕过:
├─ Parent PID Spoofing → 伪造正常父进程
├─ 使用合法签名进程执行 → LOLBins
├─ 进程名/路径完全模仿 → svchost.exe 在正确路径
└─ 命令行参数正常化 → 不留异常 cmdline策略 3: 内存加密(Sleep Mask)
Cobalt Strike Sleep Mask 原理:
1. Beacon 进入 Sleep 状态前 → 加密自身在内存中的代码段
2. 加密期间 → malfind 只看到随机数据,无 MZ 头/PE 特征
3. 唤醒时 → 解密执行 → 完成任务 → 再加密
现代 C2 实现:
├─ Havoc: Ekko/Zilean sleep obfuscation(加密 + 更改内存保护)
├─ Sliver: 无需 sleep mask(Go 二进制特征不同)
├─ BRC4: 自带 heap 加密
└─ 自定义: SystemFunction032 (RC4) + VirtualProtect(RW)策略 4: 避免 Credential Dump 暴露
蓝队会检查 LSASS 访问:
├─ 对策: 用 MiniDumpWriteDump 的替代方式(NanoDump/HandleDuplicate)
├─ 对策: SSP 注入代替直接读取
├─ 对策: 使用 comsvcs.dll 的 MiniDump 导出函数
└─ 对策: Kerberos 票据攻击代替直接 dump策略 5: 清除内存痕迹
⛔ 注意:内存获取通常是一次性快照,不像日志可以被删除
最佳策略:从一开始就不留痕迹(预防 > 清除)
有限清除手段:
├─ Unmap 已用内存区域 → VirtualFree
├─ 清除线程调用栈 → 伪造 Call Stack
├─ 结束并清理 worker 线程 → 不留挂起线程
└─ Module 卸载 + 内存置零对照表:取证技术 vs 红队对策
| 取证技术 | 发现什么 | 红队对策 |
|---|---|---|
| pslist/psscan 对比 | 隐藏进程 | 不隐藏进程,伪装合法进程 |
| malfind | 注入代码 | Module Stomping + RW→RX |
| netscan | C2 连接 | 使用合法流量混淆 |
| hashdump | 凭据被提取 | 使用 Kerberos 代替 NTLM |
| handles | 打开的文件/注册表 | 用完即关闭 handle |
| callbacks/SSDT | Rootkit hook | 避免内核操作 |
| YARA scan | 内存中的恶意特征 | Sleep Mask 加密 |
工具速查
| 工具 | 用途 | 方向 |
|---|---|---|
| Volatility3 | 内存取证框架 | 蓝 |
| MemProcFS | 内存文件系统化分析 | 蓝 |
| WinDbg | 内核调试/分析 | 蓝 |
| BeaconEye | 检测 CS Beacon | 蓝 |
| Moneta | 检测内存注入 | 蓝 |
| Sleep Mask Kit | CS sleep 加密 | 红 |
| SysWhispers3 | 直接 syscall(绕 hook) | 红 |
| NanoDump | LSASS 低检测 dump | 红 |
反内存取证技术实现细节
从理解蓝队的内存检测原理出发,设计红队的反检测策略
---
一、内存取证工具检测原理
1.1 Process Listing: PsList vs PsScan
PsList(链表遍历):
├─ 遍历 EPROCESS 结构的 ActiveProcessLinks 双向链表
├─ 从 PsActiveProcessHead 开始
├─ 每个 EPROCESS 通过 Flink/Blink 指针连接
├─ 优点: 快速,只列出"活跃"进程
└─ 弱点: DKOM unlink 后看不到被隐藏的进程
PsScan(池标签扫描):
├─ 扫描整个内存,搜索 EPROCESS 结构的池标签 "Proc"
├─ 不依赖链表 → 能发现被 unlink 的进程
├─ 也能发现已终止但内存未回收的进程
└─ 弱点: 池标签可被修改/覆盖
⛔ 对比两者差异 = 发现隐藏进程:
├─ PsList 有但 PsScan 无 → EPROCESS 结构已损坏
├─ PsScan 有但 PsList 无 → 被 DKOM 隐藏的进程
└─ 这是蓝队的标准检测手法1.2 DLL/Module Listing
检测方法:
├─ windows.dlllist → 遍历 PEB.Ldr 中的 InLoadOrderModuleList
├─ windows.ldrmodules → 交叉对比三个 LDR 列表:
│ InLoadOrder / InMemoryOrder / InInitializationOrder
│ 不在所有列表中 = 可能被隐藏
├─ VAD 扫描 → 检查 VAD 中 mapped 的 PE 文件
│ 与 LDR 列表对比 → 发现 unlisted modules
└─ malfind → 扫描没有对应 mapped file 的可执行内存1.3 Network Connection Enumeration
windows.netscan:
├─ 扫描内核 TCP/IP 栈的连接表
├─ 包含: 本地/远程 IP:Port, 状态, 关联 PID
├─ 能发现 ESTABLISHED, LISTENING, CLOSE_WAIT 等状态
└─ C2 连接最容易在这里暴露
检测点:
├─ ESTABLISHED 到异常外部 IP → C2 通信
├─ LISTENING 在高位随机端口 → 后门
├─ 关联 PID 对应异常进程 → 恶意软件
└─ svchost.exe 的非标准出站连接 → 注入1.4 Malfind(VAD Scanning for Injected Code)
Malfind 原理:
├─ 遍历进程的 VAD (Virtual Address Descriptor) 树
├─ 寻找同时具有以下特征的内存区域:
│ ├─ Protection = PAGE_EXECUTE_READWRITE (RWX)
│ ├─ 不属于任何 mapped file(无磁盘文件映射)
│ └─ 非 Image 类型 VAD
├─ 这些区域高度可疑 → 通常是注入的 shellcode 或 PE
└─ 输出: 内存地址、保护标志、起始字节(用于识别 PE/shellcode)
常见特征:
├─ 0x4D5A (MZ) 开头 → 反射加载的 PE/DLL
├─ 0xFC (CLD) 开头 → Metasploit shellcode 常见前缀
├─ 0xE8 (CALL) 开头 → 位置无关代码常见模式
└─ 随机字节但 RWX → 可能是加密的 payload1.5 SSDT/IDT Hooking Detection
SSDT (System Service Descriptor Table):
├─ 包含系统调用处理函数的地址表
├─ 正常: 所有地址指向 ntoskrnl.exe 范围内
├─ 异常: 某些地址指向非 ntoskrnl 模块 → Rootkit hook
└─ Volatility: windows.ssdt
IDT (Interrupt Descriptor Table):
├─ 中断处理函数地址表
├─ 正常: 指向 ntoskrnl/hal 范围
├─ 异常: 指向其他地址 → Rootkit
└─ Volatility: windows.idt(如果可用)
Callback:
├─ 内核回调机制(进程创建/线程创建/映像加载等)
├─ Rootkit/EDR 注册回调监控系统活动
├─ Volatility: windows.callbacks
└─ 异常回调: 回调地址指向非标准驱动模块---
二、反内存取证技术
2.1 DKOM (Direct Kernel Object Manipulation)
Unlink EPROCESS from ActiveProcessLinks:
原理:
├─ EPROCESS 结构通过 ActiveProcessLinks (LIST_ENTRY) 形成双向链表
├─ 将目标进程的 Flink/Blink 指针修改 → 跳过自身
├─ PsList 遍历链表时看不到该进程
├─ 但 PsScan 通过池标签扫描仍能发现
伪代码:
target->ActiveProcessLinks.Blink->Flink = target->ActiveProcessLinks.Flink
target->ActiveProcessLinks.Flink->Blink = target->ActiveProcessLinks.Blink
效果:
├─ taskmgr.exe, tasklist, Get-Process → 看不到进程
├─ vol windows.pslist → 看不到
├─ vol windows.psscan → 仍能看到 ⛔
└─ 因此 DKOM 不足以对抗专业取证
增强:
├─ 同时修改 PEB 中的 ProcessParameters → 伪造进程信息
├─ 修改 OBJECT_HEADER → 影响句柄枚举
├─ 但池标签扫描几乎无法绕过(除非覆写池标签)
└─ 需要内核级别访问(驱动/漏洞利用)2.2 Pool Tag Manipulation
池标签(Pool Tag):
├─ EPROCESS 分配时使用 "Proc" 标签
├─ ETHREAD 使用 "Thre" 标签
├─ FILE_OBJECT 使用 "File" 标签
├─ PsScan 就是搜索这些标签
操纵方法:
├─ 覆写 EPROCESS 前面的池头部 → 修改 Pool Tag
│ 将 "Proc" 改为 "Xxxx" → PsScan 找不到
├─ ⛔ 风险: 破坏内存管理器的追踪 → 可能蓝屏
├─ 需要精确计算 POOL_HEADER 偏移
└─ 某些版本 Windows 有额外校验2.3 VAD Manipulation
修改 VAD 保护标志:
├─ 将 PAGE_EXECUTE_READWRITE 改为 PAGE_EXECUTE_READ
├─ Malfind 只搜索 RWX → 改为 RX 后不再被标记
├─ 但实际内存保护不变(PTE 层面仍是 RWX)
├─ Volatility 读取 VAD 信息而非实际 PTE → 可以欺骗
具体实现:
├─ 遍历目标进程的 VAD 树
├─ 找到 shellcode 所在的 VAD 节点
├─ 修改 VadFlags.Protection 字段
│ 原值: PAGE_EXECUTE_READWRITE (6)
│ 修改: PAGE_EXECUTE_READ (3) 或 PAGE_READONLY (1)
└─ Malfind 不再报警
更高级: 删除 VAD 节点
├─ 从 VAD 树中完全移除目标节点
├─ 该内存区域对取证工具完全不可见
├─ ⛔ 极高风险 → 可能导致进程崩溃2.4 Sleep Mask / Memory Encryption
Cobalt Strike Sleep Mask:
├─ Beacon 进入 Sleep 前:
│ 1. 加密自身 .text 段和堆数据
│ 2. 将内存保护改为 PAGE_READWRITE(不可执行)
│ 3. 调用 Sleep() / WaitForSingleObject()
│
├─ Beacon 唤醒后:
│ 1. 将内存保护改回 PAGE_EXECUTE_READ
│ 2. 解密代码段
│ 3. 执行任务
│ 4. 再次加密 → Sleep
│
└─ 效果:
├─ Sleep 期间 Malfind 只看到加密数据(非 RWX)
├─ YARA 特征码匹配失败(加密后无可识别特征)
├─ 内存 dump 中只有密文
└─ 但唤醒瞬间仍可被捕获Ekko Sleep Obfuscation:
├─ 使用 CreateTimerQueueTimer 实现异步 sleep
├─ 在 timer callback 中:
│ 1. NtProtectVirtualMemory → RW
│ 2. SystemFunction032 (RC4) 加密代码段
│ 3. 等待下一个 timer 触发
│ 4. SystemFunction032 解密
│ 5. NtProtectVirtualMemory → RX
├─ 优势: timer callback 在线程池执行 → 调用栈更干净
└─ 规避 BeaconEye 等基于内存特征的检测
Foliage Sleep Obfuscation:
├─ 类似 Ekko 但使用 APC (Asynchronous Procedure Call)
├─ 在 APC 回调中执行加密/解密
├─ APC 在 alertable wait 时执行 → 更自然的执行上下文
└─ 配合 NtContinue 修改线程上下文 → 栈帧更隐蔽
Shellcode Position-Independent Sleep Encryption:
├─ 不依赖 C2 框架的通用方案
├─ Shellcode 自行实现:
│ 1. 定位自身在内存中的位置(PIC 技术)
│ 2. XOR/RC4 加密自身代码段
│ 3. 修改内存保护为 RW
│ 4. Sleep
│ 5. 恢复 RX → 解密 → 继续执行
└─ 需要保留解密 stub 未加密 → 仍有小段可检测代码2.5 Module Stomping / Phantom DLL Hollowing
Module Stomping:
├─ 加载合法 DLL(如 amsi.dll, dbghelp.dll)
├─ 将 shellcode 覆写到 DLL 的 .text 段
├─ 执行 shellcode 时:
│ ├─ 内存区域属于合法 DLL → 不被 Malfind 标记
│ ├─ 保护属性为 PAGE_EXECUTE_READ → 正常
│ └─ VAD 中显示为合法 DLL 映射 → 不可疑
├─ 缺陷: 覆写后 DLL 的 .text 与磁盘不一致
│ → Volatility 可通过对比 .text 哈希检测
└─ 对策: 选择不常被检查的 DLL
Phantom DLL Hollowing:
├─ 使用 SEC_IMAGE_NO_EXECUTE 创建 Section
├─ 映射后修改为可执行
├─ 由于是 NO_EXECUTE Section → 某些工具不检查
├─ 但映射的 DLL 路径可能暴露(如果使用已知 DLL 名)
└─ 可使用 Transaction NTFS + Rollback 实现无文件映射2.6 Thread Pool Wait Callback Abuse
原理:
├─ Windows 线程池提供 Timer/Wait/IO callback
├─ 通过 CreateThreadpoolTimer/CreateThreadpoolWait 注册回调
├─ 回调在线程池工作线程中执行
├─ 调用栈看起来像正常的线程池操作:
│ ntdll!TppWorkerThread
│ → ntdll!TppAlpcpCallbackEpilog
│ → 你的代码
├─ 比 CreateRemoteThread 更隐蔽(不产生 Sysmon EID 8)
└─ 比 APC 更隐蔽(不需要 alertable wait)
用途:
├─ 作为 shellcode 的执行机制
├─ 作为 sleep obfuscation 的 timer 源
└─ 替代直接线程创建2.7 Stack Spoofing (Return Address Masking)
原理:
├─ 取证工具分析线程调用栈(call stack)
├─ 异常的返回地址 = 可疑代码执行
│ 例: stack 中出现非模块地址 → 注入代码
├─ Stack Spoofing 修改调用栈中的返回地址
│ 使其看起来像合法的系统调用链
方法 1: Stack Spoofing via synthetic frames
├─ 在调用敏感 API 前
├─ 修改栈帧中的返回地址
├─ 指向合法模块中的 ret gadget
├─ API 返回后恢复真实栈帧
└─ 工具: CallStackMasker
方法 2: Thread Stack Spoofing
├─ 在 Sleep 前修改线程的整个调用栈
├─ 使其看起来像正常的系统等待
│ 例: NtWaitForSingleObject → KernelBase!SleepEx → ntdll!...
├─ 取证分析时看到正常的栈帧
└─ 唤醒后恢复真实栈帧
检测方法(蓝队):
├─ 验证返回地址是否在 call 指令之后
├─ 检查栈帧链的完整性(RBP chain)
├─ 对比多次采样的调用栈一致性
└─ Moneta/Hunt-Sleeping-Beacons 等工具2.8 Anti-Dump Techniques
防止内存 Dump:
├─ Guard Pages
│ 使用 PAGE_GUARD 属性设置关键内存页
│ 任何访问触发异常 → 可以检测 dump 操作
│ 缺点: 也可能影响正常执行
│
├─ NtProtectVirtualMemory Hook
│ Hook 该函数 → 拒绝将内存改为可读
│ 阻止 MiniDumpWriteDump 等 dump 工具
│
├─ Working Set Manipulation
│ 将关键页面移出 Working Set
│ Dump 时这些页面可能不在物理内存中
│ 需要通过 page fault 重新加载
│
├─ VirtualLock/VirtualUnlock
│ 锁定关键页面在物理内存中
│ 防止被 swap 到磁盘(避免 pagefile 泄露)
│
└─ ETW 监控 + 自毁
监控 ETW 事件 → 检测到 dump 工具运行
→ 立即清零内存 + 退出进程---
三、Volatility3 Plugin 对抗
3.1 windows.malfind 规避
规避策略:
├─ 1. 避免 PAGE_EXECUTE_READWRITE
│ 分配时用 PAGE_READWRITE → 写入 shellcode → VirtualProtect 改为 PAGE_EXECUTE_READ
│ 不要保持 RWX 状态
│
├─ 2. 使用 Module Stomping
│ 写入合法 DLL 的 .text 段 → VAD 显示为 Image 类型 → Malfind 跳过
│
├─ 3. 使用 NtMapViewOfSection
│ 映射 Section 而非 VirtualAlloc → 不同的 VAD 类型
│ 某些配置下 Malfind 不检查 mapped sections
│
├─ 4. Sleep Mask
│ Sleep 时内存为 RW(不可执行)+ 内容加密
│ 大部分时间处于"安全"状态
│
└─ 5. VAD Manipulation
直接修改 VAD 保护标志 → 欺骗 Volatility3.2 windows.netscan 规避
规避策略:
├─ 1. 使用 Raw Socket + Direct Syscall
│ 某些 netscan 实现依赖特定内核结构
│ 非标准方式建立的连接可能不在常规连接表中
│
├─ 2. 连接完成后立即关闭
│ 短连接 → 在 dump 时可能已经不存在
│ C2 使用短轮询而非持久连接
│
├─ 3. 利用合法进程的网络连接
│ 通过注入到浏览器进程 → 复用其网络连接
│ netscan 显示的是浏览器的 PID → 不可疑
│
├─ 4. DNS-over-HTTPS
│ 通过 HTTPS 通信 → 看起来像正常 HTTPS 流量
│ 目标 IP 是合法 CDN → 不可疑
│
└─ 5. Named Pipe / COM 中继
不直接建立网络连接 → 通过其他进程中继
netscan 中看不到恶意进程的网络活动3.3 windows.pstree 规避
规避策略:
├─ 1. 不隐藏进程 → 伪装合法进程
│ 进程名设置为常见系统进程
│ 路径设置为正确位置
│ 命令行参数正常化
│ 父进程设置为正确的进程(PPID Spoofing)
│
├─ 2. PPID Spoofing
│ 使用 UpdateProcThreadAttribute 设置父进程
│ svchost.exe → 父进程应为 services.exe
│ chrome.exe → 父进程应为 explorer.exe
│ 如果 svchost 的父进程是 cmd.exe → 异常
│
├─ 3. 使用已有进程(进程注入)
│ 不创建新进程 → 注入到已有合法进程
│ 进程树完全正常
│ 但 Malfind 可能在该进程中发现注入代码
│
└─ 4. 使用合法的 Windows 进程名和路径
C:\Windows\System32\svchost.exe -k netsvcs
而非 C:\Users\Public\svchost.exe---
四、工具速查
| 工具 | 用途 | 类型 |
|---|---|---|
| Ekko | Sleep obfuscation (Timer-based) | 红 |
| Foliage | Sleep obfuscation (APC-based) | 红 |
| Cobalt Strike Sleep Mask Kit | CS beacon 内存加密 | 红 |
| CallStackMasker | 调用栈伪造 | 红 |
| SleepMask BOF | BOF 格式 sleep mask | 红 |
| ThreadStackSpoofer | 线程栈伪造 | 红 |
| ModuleStomping | DLL 覆写注入 | 红 |
| PhantomDllHollower | Phantom DLL 注入 | 红 |
| Volatility3 | 内存取证框架 | 蓝 |
| Moneta | 内存注入检测 | 蓝 |
| BeaconEye | CS Beacon 检测 | 蓝 |
| Hunt-Sleeping-Beacons | 睡眠 Beacon 检测 | 蓝 |
| PE-sieve | 内存中 PE 扫描 | 蓝 |
| MalMemDetect | 恶意内存模式检测 | 蓝 |
---
五、综合规避策略
完整的反内存取证方案:
Phase 1: 初始执行
├─ Module Stomping 或 Phantom DLL → 避免 Malfind
├─ PPID Spoofing → 正常的进程树
├─ 使用 direct syscall → 避免 usermode hook 记录
└─ 命令行参数正常化 → cmdline 不可疑
Phase 2: 运行时
├─ Sleep Mask 加密 → 大部分时间内存无特征
├─ Stack Spoofing → 调用栈正常
├─ 通过合法进程中继网络 → netscan 不可疑
└─ 短连接 C2 → 减少连接存在时间
Phase 3: 如果检测到 Dump
├─ ETW 监控 dump 工具执行
├─ 自动清零内存 + 退出
└─ 或切换到纯加密 sleep 状态
⛔ 没有完美的反取证方案:
├─ 执行瞬间总会在内存中留下痕迹
├─ 硬件辅助 dump(DMA)无法对抗
├─ 内核级监控(PatchGuard/HyperGuard)限制内核操作
└─ 最佳策略: 减少暴露窗口 + 多层防御---
参考链接
Volatility3 完整插件速查手册
适用版本: Volatility 3.x | 基本语法: vol -f <memory_dump> <plugin>---
一、系统信息
# 操作系统识别(自动判断 profile,Vol3 无需手动指定)
vol -f mem.raw windows.info
vol -f mem.raw linux.info
vol -f mem.raw mac.info
# banners.Banners — 扫描内存中的 OS banner 字符串
vol -f mem.raw banners.Banners---
二、进程分析
2.1 进程列出
# pslist — 遍历 EPROCESS 双向链表(Rootkit 可通过 DKOM unlink 隐藏)
vol -f mem.raw windows.pslist
vol -f mem.raw windows.pslist --pid 1234
vol -f mem.raw windows.pslist --dump # 导出进程可执行文件
# psscan — 池标签扫描(能找到已终止/隐藏的进程)
vol -f mem.raw windows.psscan
# pstree — 进程树(父子关系可视化)
vol -f mem.raw windows.pstree
# ⛔ 关键技巧:pslist vs psscan 对比
# pslist 有但 psscan 无 → EPROCESS 结构已损坏
# psscan 有但 pslist 无 → 被 DKOM 隐藏或已退出的进程2.2 进程详情
# 命令行参数 — 发现异常启动参数
vol -f mem.raw windows.cmdline
vol -f mem.raw windows.cmdline --pid 1234
# 环境变量
vol -f mem.raw windows.envars
vol -f mem.raw windows.envars --pid 1234
# DLL 列表 — 检查异常加载的 DLL
vol -f mem.raw windows.dlllist
vol -f mem.raw windows.dlllist --pid 1234
# 句柄 — 进程持有的内核对象(文件/注册表/互斥体)
vol -f mem.raw windows.handles
vol -f mem.raw windows.handles --pid 1234
# SID — 进程运行的安全上下文
vol -f mem.raw windows.getsids
vol -f mem.raw windows.getsids --pid 1234
# 权限 — 进程持有的特权令牌
vol -f mem.raw windows.privileges
vol -f mem.raw windows.privileges --pid 12342.3 Linux 进程
vol -f mem.raw linux.pslist
vol -f mem.raw linux.pstree
vol -f mem.raw linux.psaux # 含命令行参数(类似 ps aux)
vol -f mem.raw linux.elfs # 列出 ELF 映射
vol -f mem.raw linux.proc.Maps --pid 1234 # 进程内存映射---
三、内存注入与恶意代码检测
# malfind — 扫描 PAGE_EXECUTE_READWRITE 的 VAD 节点
# 最重要的恶意代码发现插件
vol -f mem.raw windows.malfind
vol -f mem.raw windows.malfind --pid 1234
vol -f mem.raw windows.malfind --dump # 导出可疑内存区域
# ⛔ malfind 输出解读:
# Protection: PAGE_EXECUTE_READWRITE → 高度可疑(正常代码不应 RWX)
# 开头有 MZ / 4D 5A → 反射加载的 PE
# 开头有 FC E8 → 常见 shellcode 特征(CLD + CALL)
# 无 PE 头但有可执行代码 → 注入的 shellcode
# hollowprocesses — 检测进程镂空(Process Hollowing)
vol -f mem.raw windows.hollowprocesses
# VAD 信息 — 虚拟地址描述符(进程内存布局)
vol -f mem.raw windows.vadinfo --pid 1234
vol -f mem.raw windows.vadwalk --pid 1234
# YARA 扫描 — 自定义规则匹配内存
vol -f mem.raw yarascan.YaraScan --yara-file rules.yar
vol -f mem.raw yarascan.YaraScan --yara-rules "rule test { strings: $a = \"password\" condition: $a }"
vol -f mem.raw windows.vadyarascan --yara-file rules.yar --pid 1234
# 线程检测
vol -f mem.raw windows.threads --pid 1234
# 关注 StartAddress 不在已知模块范围内的线程 → 注入代码---
四、网络分析
# netscan — 扫描网络连接和监听端口(TCP/UDP)
vol -f mem.raw windows.netscan
# netstat — 通过内核结构枚举活动连接
vol -f mem.raw windows.netstat
# ⛔ netscan 输出解读:
# 关注 ESTABLISHED 状态的外部 IP → 可能是 C2
# 关注 LISTENING 的高位端口 → 可能是后门
# 关注 svchost.exe 的异常出站连接
# 对比 PID 与 pslist 中的进程名
# Linux 网络
vol -f mem.raw linux.sockstat # socket 统计---
五、注册表分析
# 列出注册表 hive
vol -f mem.raw windows.registry.hivelist
# 打印指定键值
vol -f mem.raw windows.registry.printkey
vol -f mem.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run"
vol -f mem.raw windows.registry.printkey --key "ControlSet001\Services"
# 导出 hive 文件
vol -f mem.raw windows.registry.hivescan
vol -f mem.raw windows.registry.hivelist --dump
# ⛔ 注册表关键取证位置:
# Run/RunOnce → 自启动项(持久化)
# Services → 恶意服务(持久化)
# UserAssist → 程序执行记录(ROT13 编码)
# ShimCache / AppCompatCache → 程序执行痕迹
# MRU → 最近使用的文件/命令
# TypedURLs → IE/Edge 输入的 URL
# 密码/凭据提取
vol -f mem.raw windows.hashdump # SAM 中的 NTLM 哈希
vol -f mem.raw windows.lsadump # LSA secrets
vol -f mem.raw windows.cachedump # 缓存的域凭据---
六、文件系统
# filescan — 扫描内存中的 FILE_OBJECT
vol -f mem.raw windows.filescan
# 配合 grep 筛选
vol -f mem.raw windows.filescan | grep -i "\.exe$"
vol -f mem.raw windows.filescan | grep -i "\.ps1$"
vol -f mem.raw windows.filescan | grep -i "desktop"
vol -f mem.raw windows.filescan | grep -i "downloads"
# dumpfiles — 从内存提取文件(需要 filescan 的地址)
vol -f mem.raw windows.dumpfiles --virtaddr 0xXXXX
vol -f mem.raw windows.dumpfiles --physaddr 0xXXXX
vol -f mem.raw windows.dumpfiles --pid 1234
# MFT 扫描
vol -f mem.raw windows.mftscan.MFTScan
# Linux 文件
vol -f mem.raw linux.bash # bash 历史记录
vol -f mem.raw linux.check_afinfo # 网络协议处理函数 hook 检测---
七、内核与 Rootkit 检测
# SSDT — 系统服务描述表 hook 检测
vol -f mem.raw windows.ssdt
# 驱动模块
vol -f mem.raw windows.modules # 已加载内核模块
vol -f mem.raw windows.modscan # 池标签扫描(含隐藏模块)
vol -f mem.raw windows.driverscan # 驱动对象扫描
vol -f mem.raw windows.driverirp # IRP hook 检测
# 回调函数 — Rootkit 常注册的内核回调
vol -f mem.raw windows.callbacks
# ⛔ modules vs modscan 对比 → 发现隐藏内核模块
# 类似 pslist vs psscan 的思路
# Linux Rootkit 检测
vol -f mem.raw linux.check_syscall # syscall table 修改检测
vol -f mem.raw linux.check_modules # 隐藏内核模块
vol -f mem.raw linux.hidden_modules # 通过多种方式枚举隐藏模块
vol -f mem.raw linux.check_idt # 中断描述表 hook
vol -f mem.raw linux.tty_check # TTY hook 检测
vol -f mem.raw linux.lsmod # 已加载模块列表---
八、服务与自启动
# 服务列表
vol -f mem.raw windows.svcscan
# ⛔ 服务关注点:
# 异常 BinaryPathName → 指向非系统目录
# ServiceType = Own Process + 非 svchost → 可疑
# Start = Auto + 描述为空 → 可疑持久化---
九、杂项与辅助
# 剪贴板内容
vol -f mem.raw windows.clipboard
# 桌面截图/窗口信息
vol -f mem.raw windows.sessions
vol -f mem.raw windows.deskscan
# 计时器 / DPC
vol -f mem.raw windows.bigpools
vol -f mem.raw windows.poolscanner
# 符号表信息
vol -f mem.raw windows.verinfo # PE 版本信息
vol -f mem.raw windows.symlinkscan # 符号链接
# 字符串提取(配合外部工具)
strings -a -e l mem.raw > strings_unicode.txt
strings -a mem.raw > strings_ascii.txt
# 然后用 vol 的 strings 插件映射到进程---
十、常见调查工作流
工作流 A: 检测进程注入
# Step 1: 列出进程,发现异常
vol -f mem.raw windows.pslist
vol -f mem.raw windows.pstree # 检查父子关系是否合理
# Step 2: 扫描 RWX 内存
vol -f mem.raw windows.malfind # 寻找注入代码
# Step 3: 确认可疑进程的 DLL 和线程
vol -f mem.raw windows.dlllist --pid <SUSPECT_PID>
vol -f mem.raw windows.threads --pid <SUSPECT_PID>
# Step 4: 导出可疑内存区域分析
vol -f mem.raw windows.malfind --pid <SUSPECT_PID> --dump
# 送 VirusTotal / YARA 扫描
# Step 5: 检查进程镂空
vol -f mem.raw windows.hollowprocesses工作流 B: 发现 C2 通信
# Step 1: 列出所有网络连接
vol -f mem.raw windows.netscan
# Step 2: 关注 ESTABLISHED 到外部 IP 的连接,记录 PID
# 将外部 IP 送威胁情报平台查询
# Step 3: 分析连接对应的进程
vol -f mem.raw windows.pslist --pid <C2_PID>
vol -f mem.raw windows.cmdline --pid <C2_PID>
vol -f mem.raw windows.dlllist --pid <C2_PID>
# Step 4: YARA 扫描已知 C2 框架特征
vol -f mem.raw yarascan.YaraScan --yara-rules "rule CobaltStrike { strings: \$a = { 2E 2F 2E 2F 2E 2C } condition: \$a }"
# Step 5: 提取可疑进程的可执行文件
vol -f mem.raw windows.pslist --pid <C2_PID> --dump
vol -f mem.raw windows.dumpfiles --pid <C2_PID>工作流 C: 提取凭据
# Step 1: 导出密码哈希
vol -f mem.raw windows.hashdump
# Step 2: 导出 LSA secrets
vol -f mem.raw windows.lsadump
# Step 3: 导出缓存的域凭据
vol -f mem.raw windows.cachedump
# Step 4: 搜索内存中的明文密码字符串
vol -f mem.raw yarascan.YaraScan --yara-rules "rule creds { strings: \$a = \"password\" nocase \$b = \"Password=\" condition: any of them }"
# Step 5: 查找 LSASS 进程并导出
vol -f mem.raw windows.pslist | grep lsass
vol -f mem.raw windows.dumpfiles --pid <LSASS_PID>
# 离线用 Mimikatz: sekurlsa::minidump lsass.dmp工作流 D: Rootkit 分析
# Step 1: 对比进程列表
vol -f mem.raw windows.pslist > pslist.txt
vol -f mem.raw windows.psscan > psscan.txt
# diff 两个列表,psscan 多出的 = 被隐藏的进程
# Step 2: 对比内核模块
vol -f mem.raw windows.modules > modules.txt
vol -f mem.raw windows.modscan > modscan.txt
# Step 3: 检查内核 hook
vol -f mem.raw windows.ssdt # 系统调用表
vol -f mem.raw windows.callbacks # 内核回调
vol -f mem.raw windows.driverirp # IRP hook
# Step 4: 检查可疑驱动
vol -f mem.raw windows.driverscan
# 关注 DriverName 不在常见列表中的驱动
# 关注 DriverStart 地址不在 ntoskrnl 范围内的驱动工作流 E: 持久化发现
# Step 1: 注册表自启动
vol -f mem.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run"
vol -f mem.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\RunOnce"
# Step 2: 服务
vol -f mem.raw windows.svcscan | grep -i "auto"
# Step 3: 计划任务(从内存文件中查找)
vol -f mem.raw windows.filescan | grep -i "tasks"
# Step 4: WMI 事件订阅(搜索相关对象)
vol -f mem.raw windows.filescan | grep -i "wmi"
vol -f mem.raw windows.registry.printkey --key "SOFTWARE\Microsoft\Wbem"---
十一、输出处理技巧
# 输出为 JSON 格式(便于后续处理)
vol -f mem.raw -r json windows.pslist > pslist.json
# 输出为 CSV
vol -f mem.raw -r csv windows.netscan > netscan.csv
# 管道过滤
vol -f mem.raw windows.netscan | grep ESTABLISHED
vol -f mem.raw windows.filescan | grep -iE "\.(exe|dll|ps1|bat|vbs)$"
vol -f mem.raw windows.pslist | awk '{print $1, $2, $3}'
# 指定输出目录
vol -f mem.raw -o /output/ windows.malfind --dump
vol -f mem.raw -o /output/ windows.dumpfiles --pid 1234---
十二、常见问题与排错
| 问题 | 解决 |
|---|---|
| 无法识别内存格式 | 确认是 raw/lime 格式,尝试 banners.Banners |
| 插件报 Unsatisfied | 缺少符号表,下载对应 OS 的 ISF(volatility3/symbols/) |
| Linux 分析失败 | 需要对应内核版本的符号表(dwarf2json 生成) |
| 输出为空 | 确认 dump 完整性,尝试其他同类插件(如 pslist 无输出用 psscan) |
| 速度极慢 | 用 SSD 存放 dump 文件,增加 --max-size 参数 |
符号表配置
# Windows 符号表 — Vol3 自动从 Microsoft Symbol Server 下载
# 离线环境手动放置:
ls ~/.local/lib/python3.*/site-packages/volatility3/symbols/windows/
# Linux 符号表生成
# 需要目标系统内核的 vmlinux (带 debug info)
dwarf2json linux --elf vmlinux > linux_symbol.json
# 放入 volatility3/symbols/linux/
# macOS 符号表
dwarf2json mac --macho kernel.dSYM > mac_symbol.json---
十三、快速参考表
Windows 插件按用途分类
| 用途 | 插件 | 说明 |
|---|---|---|
| 系统信息 | windows.info | OS 版本/架构 |
| 进程列表 | windows.pslist | 链表遍历 |
| 隐藏进程 | windows.psscan | 池标签扫描 |
| 进程树 | windows.pstree | 父子关系 |
| 命令行 | windows.cmdline | 启动参数 |
| DLL | windows.dlllist | 加载的 DLL |
| 句柄 | windows.handles | 内核对象 |
| 注入检测 | windows.malfind | RWX 内存 |
| 进程镂空 | windows.hollowprocesses | Hollowing |
| 网络 | windows.netscan | 连接/端口 |
| 网络 | windows.netstat | 活动连接 |
| 注册表 | windows.registry.printkey | 键值读取 |
| 注册表 | windows.registry.hivelist | Hive 列表 |
| 服务 | windows.svcscan | 服务列表 |
| 文件 | windows.filescan | 文件对象 |
| 文件提取 | windows.dumpfiles | 提取文件 |
| 密码 | windows.hashdump | SAM 哈希 |
| 密码 | windows.lsadump | LSA 密钥 |
| 密码 | windows.cachedump | 域缓存 |
| 内核模块 | windows.modules | 驱动列表 |
| 隐藏模块 | windows.modscan | 池标签扫描 |
| 内核 hook | windows.ssdt | 系统调用表 |
| 回调 | windows.callbacks | 内核回调 |
| 驱动 | windows.driverscan | 驱动对象 |
| IRP hook | windows.driverirp | IRP 派遣 |
| YARA | yarascan.YaraScan | 规则匹配 |
| MFT | windows.mftscan.MFTScan | MFT 记录 |
Linux 插件按用途分类
| 用途 | 插件 | 说明 |
|---|---|---|
| 系统信息 | linux.info | 内核版本 |
| 进程列表 | linux.pslist | task_struct 遍历 |
| 进程树 | linux.pstree | 父子关系 |
| 进程详情 | linux.psaux | 含参数 |
| Bash 历史 | linux.bash | 命令记录 |
| ELF 映射 | linux.elfs | 已加载 ELF |
| 进程映射 | linux.proc.Maps | 内存布局 |
| 内核模块 | linux.lsmod | 已加载模块 |
| 隐藏模块 | linux.hidden_modules | 隐藏检测 |
| Syscall hook | linux.check_syscall | 系统调用表 |
| IDT hook | linux.check_idt | 中断表 |
| 模块完整性 | linux.check_modules | 模块验证 |
| TTY hook | linux.tty_check | 终端 hook |
| Socket | linux.sockstat | 网络连接 |
| 网络 hook | linux.check_afinfo | 协议 hook |
Related skills
AI & Agent Buildingagents