内存取证-Volatility
前置说明
内存取证(Memory Forensics)是 IR 中最强大的技术之一,能发现磁盘取证无法发现的威胁
适用场景:fileless malware、进程注入、rootkit、凭据提取、加密数据恢复
核心工具:Volatility 3(Python,无需 profile)是当前标准
关联页面:29-取证工具 | 06-进程与网络分析 | 35-恶意软件基础分析
一、内存获取(Memory Acquisition)
1.1 获取工具对比
| 工具 | 类型 | 输出格式 | 优点 | 缺点 |
|---|---|---|---|---|
| WinPmem | 开源 CLI | RAW/AFF4 | 免费、轻量、支持 AFF4 | 可能被 AV 检测 |
| DumpIt | 免费 CLI | RAW | 极简、双击运行、IR 首选 | 仅 RAW 格式 |
| FTK Imager | 商业 GUI | RAW/AD1 | GUI 友好、同时可做磁盘镜像 | 体积较大 |
| Magnet RAM Capture | 免费 GUI | RAW | 简单易用 | 功能单一 |
| Comae (DumpIt 2.0) | 免费 CLI | DMP/RAW | 支持 Microsoft crash dump 格式 | 需注册 |
| Belkasoft RAM Capturer | 免费 GUI | RAW | 绕过某些 AV/EDR 的内存保护 | 功能单一 |
1.2 获取操作
1 | # === WinPmem === |
获取注意事项:
获取过程会修改内存(获取工具本身占用内存),这是不可避免的
输出到外部 USB 或网络共享,不要输出到本机磁盘(减少写入影响)
文件大小 = 物理内存大小(如 16GB RAM → 16GB 文件)
获取前不要重启系统!重启会丢失所有内存数据
某些 EDR/AV 可能阻止内存获取,可能需要临时禁用或使用特殊工具
1.3 其他内存数据源
休眠文件(Hibernation File):
路径:C:\hiberfil.sys
包含休眠时的完整内存快照
Volatility 可以直接解析(支持 hibr 格式)
崩溃转储(Crash Dump):
路径:C:\Windows\MEMORY.DMP(完整转储)
路径:C:\Windows\Minidump\*.dmp(小型转储)
完整转储包含全部物理内存,可用 Volatility 分析
虚拟机快照/内存文件:
VMware: .vmem 文件
Hyper-V: .bin 文件
VirtualBox: .sav 文件
这些文件可以直接作为 Volatility 输入
1 | # 检查是否有休眠文件 |
二、Volatility 3 基础
2.1 安装
1 | # 方式一:pip 安装 |
2.2 Volatility 3 vs Volatility 2
| 特性 | Volatility 2 | Volatility 3 |
|---|---|---|
| 语言 | Python 2 | Python 3 |
| Profile | 必须指定 --profile=Win10x64_xxxx |
自动识别(无需 profile) |
| 插件命名 | pslist、netscan |
windows.pslist、windows.netscan |
| 速度 | 较慢 | 更快 |
| 维护状态 | 停止维护 | 活跃开发 |
强烈建议使用 Volatility 3,Volatility 2 仅在需要特定老插件时才使用
2.3 基本命令格式
1 | # Volatility 3 基本格式 |
三、进程分析插件
3.1 windows.pslist — 进程列表
1 | # 列出所有活动进程 |
IR 分析要点:
检查是否有同名但 PID/PPID 异常的进程(如多个 lsass.exe)
检查 ExitTime 不为空但仍在列表中的进程(僵尸进程)
注意 CreateTime 异常的进程(与系统启动时间不符)
3.2 windows.pstree — 进程树
1 | # 以树形结构显示进程 |
IR 分析要点:
与 31-Sysinternals套件 中的正常进程树对比
查找不属于正常树结构的进程
查找由异常父进程(如 Word → cmd → powershell)创建的进程
3.3 windows.cmdline — 进程命令行
1 | # 提取所有进程的完整命令行参数 |
IR 分析要点:
查找编码的命令(-enc、-e、-encodedcommand)
查找可疑参数(-nop -w hidden -c "IEX(...)")
查找非标准路径的程序(C:\Users\Public\svchost.exe)
3.4 windows.dlllist — 已加载 DLL
1 | # 列出所有进程加载的 DLL |
IR 分析要点:
查找从非标准路径(Temp、AppData、ProgramData)加载的 DLL
查找名称可疑的 DLL
与正常 DLL 列表对比
3.5 windows.handles — 打开的句柄
1 | # 列出所有打开的句柄 |
IR 要点:查找恶意软件的 Mutex、访问的文件和注册表键
四、网络分析插件
4.1 windows.netscan — 网络连接
1 | # 扫描内存中的网络连接信息 |
IR 分析要点:
查找 ESTABLISHED 连接到外部 IP(潜在 C2)
查找 LISTENING 在非标准端口的进程
查找 cmd.exe/powershell.exe 的网络连接
记录所有外部 IP 用于 IOC 匹配
1 | # 提取所有外部连接的 IP 列表 |
4.2 windows.netstat — 网络状态
1 | # 类似 netstat 的输出格式 |
与 netscan 类似,但数据来源不同(从内核数据结构而非扫描内存)
建议两者都运行,交叉验证
五、检测进程注入 — malfind
5.1 windows.malfind 概述
malfind 是内存取证中最重要的检测插件之一
它检测进程虚拟地址空间中的可疑内存区域:
RWX(Read-Write-Execute)内存页:正常程序很少有 RWX 页
非映像区域中的 PE 头:内存中存在没有对应磁盘文件的 PE(可能是注入的 shellcode 或 DLL)
VAD(Virtual Address Descriptor)标记异常
5.2 使用方法
1 | # 扫描所有进程的可疑内存区域 |
5.3 结果解读
输出示例(注入检测):
1 | PID: 672 Process: svchost.exe |
分析要点:
MZ 开头 + PAGE_EXECUTE_READWRITE = 高度可疑,很可能是注入的 PE
Tag: VadS 表示私有内存(非文件映射),正常 DLL 应该是 VadF(文件映射)
PAGE_EXECUTE_READWRITE 权限很少在正常程序中出现
误报排除:
某些合法软件(JIT 编译器如 .NET CLR、Java、V8)会使用 RWX 内存
某些安全软件也会注入 DLL
需要结合进程名称和注入内容判断
5.4 提取注入的代码
1 | # 从可疑内存区域 dump 数据 |
六、检测 Rootkit
6.1 windows.ssdt — SSDT Hook 检测
1 | # 检查 System Service Descriptor Table 是否被 hook |
SSDT 是内核级系统调用表,rootkit 通过修改 SSDT 拦截系统调用
现代 Windows(64-bit + Kernel Patch Protection/PatchGuard)使 SSDT hook 更困难
但仍需检查(某些 rootkit 可绕过 PatchGuard)
6.2 隐藏进程检测
1 | # 方法一:对比 pslist 和 psscan |
原理: Rootkit 通过从活动进程链表中摘除 EPROCESS 来隐藏进程
pslist 只能看到链表中的进程
psscan 通过特征扫描物理内存,能找到被摘除的进程
6.3 驱动检测
1 | # 列出内核模块/驱动 |
七、注册表与凭据提取
7.1 windows.registry.hivelist — 注册表 Hive 列表
1 | # 列出内存中加载的注册表 Hive |
7.2 windows.registry.printkey — 读取注册表键
1 | # 读取 Run 键(持久化检查) |
7.3 windows.hashdump — 提取密码 Hash
1 | # 从 SAM 中提取本地账户的 NTLM hash |
注意:
aad3b435b51404eeaad3b435b51404ee 是空 LM hash(Windows 7+ 默认不存储 LM hash)
31d6cfe0d16ae931b73c59d7e0c089c0 是空密码的 NTLM hash
提取的 hash 可用于判断是否使用弱密码或相同密码
7.4 windows.lsadump — LSA Secrets
1 | # 提取 LSA Secrets(可能包含服务账户密码、VPN 密码等) |
LSA Secrets 中可能存储:
服务账户的明文密码
自动登录密码
VPN/网络凭据
DPAPI master key
7.5 windows.cachedump — 域缓存凭据
1 | # 提取域缓存凭据(DCC2 hash) |
域环境中,Windows 会缓存最近登录的域用户凭据(默认 10 个)
DCC2 hash 可离线破解(但比 NTLM hash 慢得多)
八、高级分析插件
8.1 windows.vadinfo — 虚拟地址描述符
1 | # 查看进程的 VAD 树(虚拟地址空间布局) |
IR 用途:辅助 malfind 分析,了解进程的完整内存布局
8.2 windows.memmap — 内存映射
1 | # 导出进程的完整内存空间 |
当需要对进程做完整的内存分析时使用
8.3 windows.filescan — 文件扫描
1 | # 扫描内存中的文件对象 |
8.4 windows.dumpfiles — 文件提取
1 | # 从内存中提取文件(即使磁盘上已删除) |
IR 关键场景:恶意软件自删除后,仍可能从内存中恢复
8.5 windows.envars — 环境变量
1 | # 提取进程的环境变量 |
环境变量中可能包含攻击者设置的路径或配置
九、实战案例:完整内存取证流程
9.1 场景描述
EDR 告警显示某主机上 svchost.exe 存在异常网络连接
目标:确认是否被入侵、找出攻击方式、提取 IOC
9.2 分析步骤
Step 1: 获取内存
1 | # 在目标主机上运行 |
Step 2: 进程分析
1 | # 查看进程树 |
Step 3: 网络分析
1 | # 查看网络连接 |
Step 4: 注入检测
1 | # 检查进程注入 |
Step 5: DLL 分析
1 | # 查看加载的 DLL |
Step 6: 持久化检查
1 | # 从内存中读取注册表 |
Step 7: 凭据检查
1 | # 提取密码 hash(评估横向移动风险) |
Step 8: 文件恢复
1 | # 从内存中恢复恶意文件 |
9.3 IOC 汇总
1 | === IOC Report === |
十、自动化脚本与最佳实践
10.1 Volatility 3 批量分析脚本
1 | # Volatility 3 自动化分析脚本 |
10.2 最佳实践
获取阶段:
优先获取内存,其次再做磁盘取证
使用外部存储保存内存 dump
记录获取时间和工具版本
分析阶段:
先跑 pslist + pstree 建立进程概览
再跑 netscan 找网络连接
用 malfind 做注入检测
最后根据发现做针对性分析
证据链:
保留原始内存 dump,分析在副本上进行
计算内存 dump 的 hash 值
记录每个分析步骤和发现
参考链接
The Art of Memory Forensics (书)
MemProcFS — 另一个优秀的内存分析框架
关联页面:29-取证工具 | 06-进程与网络分析 | 35-恶意软件基础分析
| 上一章 | 目录 | 下一章 |
|---|---|---|
| 33-事件日志分析工具 | Windows应急响应 | 35-恶意软件基础分析 |