内存取证与 Volatility 3 实战:基于 agents24 memory-forensics 技能的内存镜像分析完整指南
2026/9/11 21:42:32 网站建设 项目流程

内存取证与 Volatility 3 实战:基于 agents24 memory-forensics 技能的内存镜像分析完整指南

【免费下载链接】agentsMulti-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity项目地址: https://gitcode.com/GitHub_Trending/agents24/agents

内存取证(Memory Forensics)是应急响应与恶意软件分析中不可替代的一环——攻击者驻留内存的文件型恶意软件、注入的 shellcode、已建立的 C2 连接,往往在磁盘上不留痕迹,却完整地留在 RAM 里。本文以本仓库reverse-engineering插件中 memory-forensics 技能及其 详细参考文档 为骨架,系统讲解基于 Volatility 3 的内存镜像分析:从环境搭建、符号表配置,到进程、网络、DLL、注册表、文件系统等核心插件族的逐条用法,再到 Linux/macOS 跨平台分析与恶意软件检测工作流。读完本文,你将掌握一套可直接落地的内存取证命令集,并能把采集、分析、提取、验证的完整流程应用到实际入侵调查场景。

技能定位:什么场景下该做内存取证

reverse-engineering插件中,memory-forensics技能用于以下典型场景(见 SKILL.md):

  • 应急响应或入侵调查中执行内存分析;
  • 从 RAM 镜像中提取恶意软件工件(进程、注入代码、网络连接);
  • 在系统关机前从存活的 Windows/Linux/macOS 主机采集易失性内存;
  • 使用 Volatility 3 / Rekall 对内存镜像进行分流排查(triage);
  • 从进程内存中恢复凭据、浏览器会话或打开的文件。

它与同插件下的 binary-analysis-patterns(ELF/PE/Mach-O 静态动态分析)、anti-reversing-techniques(反调试、反虚拟机与混淆对抗)以及 malware-analyst 智能体(恶意软件分类、沙箱分析、IOC 提取)互为补充:内存取证负责"从运行态找证据",其余技能负责"把证据拆到字节级"。

一个值得注意的仓库设计细节:本技能正文原本包含约 2680 字节的 Volatility 3 章节,因 Codex 对SKILL.md正文有 8 KB 硬截断限制,已被移至references/details.md,由SKILL.md按需加载。这正是本仓库遵循的"渐进式披露"内容组织模式(详见 docs/authoring.md)——正文负责导航与快速上手,references/承载深度细节。

Volatility 3 框架:安装与符号表配置

Volatility 3 是当前内存取证的主流开源框架,采用 Python 实现,去除了 Volatility 2 依赖内存配置文件(profile)的繁琐流程,改为按需下载符号表。核心安装与使用命令如下(来自 references/details.md):

# 安装 Volatility 3 pip install volatility3 # 安装符号表(Windows) # 从官方符号表下载地址获取(symbols 目录下的 zip 包) # 基本用法 vol -f memory.raw <plugin> # 指定符号表路径 vol -f memory.raw -s /path/to/symbols windows.pslist

参数与使用要点:

  • -f memory.raw:指定内存镜像文件,Volatility 3 会自动识别镜像格式(raw、E01、VMware.vmem、VirtualBox core dump 等);
  • -s /path/to/symbols:显式指定符号表目录。Windows 符号表按 OS 版本与构建号区分(如windows-10-19041-x64.zip),建议提前下载对应版本并集中存放;
  • 符号表匹配至关重要:符号缺失或版本不匹配时,多数 Windows 插件无法解析内核结构,会直接报 "Unsupported OS version" 类错误。这是 Windows 内存分析最常遇到的坑,对应 SKILL.md 最佳实践章节的 "Symbol issues: Ensure correct symbol files for OS version" 提示。

Windows 核心插件族逐项详解

references/details.md将 Windows 分析插件按功能划分为六组。下表与命令均可直接复制使用(<PID>替换为实际进程号)。

进程分析

# 列出进程 vol -f memory.raw windows.pslist # 进程树(父-子关系) vol -f memory.raw windows.pstree # 隐藏进程检测(按对象池扫描) vol -f memory.raw windows.psscan # 进程内存转储 vol -f memory.raw windows.memmap --pid <PID> --dump # 进程环境变量 vol -f memory.raw windows.envars --pid <PID> # 命令行参数 vol -f memory.raw windows.cmdline

辨析三者的底层差异:pslist遍历内核的ActiveProcessLinks双向链表,速度最快,但rootkit 通过 DKOM(Direct Kernel Object Manipulation)摘链后即可隐藏进程psscan则直接扫描物理内存中的EPROCESS对象池,不依赖链表,因此能发现被摘链的隐藏进程;pstreepslist基础上重建父子层级,便于识别"合法父进程派生异常子进程"的投放模式。

网络分析

# 网络连接 vol -f memory.raw windows.netscan # 网络连接状态 vol -f memory.raw windows.netstat

netscan是 Windows 上的首选:它同时扫描 TCP/UDP 端点表与 TCP 控制块,能列出连接两端地址、端口与状态,是确认 C2 回连、横向移动跳板最直接的证据来源。

DLL 与模块分析

# 每个进程加载的 DLL 列表 vol -f memory.raw windows.dlllist --pid <PID> # 查找隐藏/注入的 DLL vol -f memory.raw windows.ldrmodules # 内核模块 vol -f memory.raw windows.modules # 模块转储 vol -f memory.raw windows.moddump --pid <PID>

ldrmodules的检测原理值得说明:它对比每个 DLL 在内核VadRoot(VAD 树)、PEB->Ldr(加载器链表)与内存映射三处的记录一致性。若某 DLL 在 PEB 链表中被摘除但 VAD 中仍存在,即为典型的反射式注入(reflective DLL injection)痕迹——这正是恶意软件隐藏自身模块的惯用手法。

内存注入检测

# 检测代码注入 vol -f memory.raw windows.malfind # VAD(虚拟地址描述符)分析 vol -f memory.raw windows.vadinfo --pid <PID> # 对可疑内存区域执行 YARA 扫描 vol -f memory.raw windows.vadyarascan --yara-rules rules.yar

malfind是注入检测的核心武器:它遍历每个进程的 VAD,找出标记为可执行且无文件映射(即私有、非映像内存)的区域,检查其中是否存在 MZ 头、可执行标志或 shellcode 特征。结合 SKILL.md 中的注入判定指标:

  • 内存保护属性为PAGE_EXECUTE_READWRITE(可写可执行,本身即高度可疑,正常映像区几乎不会出现);
  • 非映像 VAD 区域中出现 MZ 头;
  • 分配起始位置出现 shellcode 特征字节。

配合这些指标,malfind的输出能直接定位"哪个进程、哪块内存、什么注入手法"。常见注入手法(见 SKILL.md 检测模式章节)包括:

  1. 经典 DLL 注入VirtualAllocEx+WriteProcessMemory+CreateRemoteThread
  2. 进程镂空(Process Hollowing)CreateProcess(SUSPENDED)+NtUnmapViewOfSection+WriteProcessMemory
  3. APC 注入:向可告警线程排队QueueUserAPC
  4. 线程执行劫持SuspendThread+SetThreadContext+ResumeThread

注册表分析

# 列出注册表配置单元(hives) vol -f memory.raw windows.registry.hivelist # 打印注册表键值 vol -f memory.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run" # 转储注册表配置单元 vol -f memory.raw windows.registry.hivescan --dump

注册表在内存中的证据价值极高:printkey直接打印Run键可快速定位自启动持久化hivescan --dump将内存中的 SYSTEM/SAM/SECURITY 等配置单元整体导出,供后续离线解析。注意windows.hashdump等凭据提取插件依赖先执行hivelist定位配置单元(见 SKILL.md 凭据提取章节)。

文件系统工件

# 扫描文件对象 vol -f memory.raw windows.filescan # 从内存转储文件 vol -f memory.raw windows.dumpfiles --pid <PID> # MFT 分析 vol -f memory.raw windows.mftscan

内存中驻留的文件对象(包括已被删除但仍被进程占用的文件)可通过filescan定位,dumpfiles将其还原为磁盘文件——这是恢复"删除即销毁"证据的关键能力。mftscan扫描 NTFS 主文件表记录,提供文件创建、修改、删除的时间线索。

Linux 内存分析

Linux 内存镜像(LiME 格式或 ELF core 格式)同样可直接交给 Volatility 3,常用插件:

# 进程列表 vol -f memory.raw linux.pslist # 进程树 vol -f memory.raw linux.pstree # Bash 历史 vol -f memory.raw linux.bash # 网络连接 vol -f memory.raw linux.sockstat # 已加载内核模块 vol -f memory.raw linux.lsmod # 挂载点 vol -f memory.raw linux.mount # 环境变量 vol -f memory.raw linux.envars

linux.bash能从 bash 进程内存中恢复已执行的命令历史(即使历史文件被清空),是 Linux 主机入侵调查的高价值插件;linux.lsmod对照内核模块加载记录,可发现隐藏的内核级 rootkit 模块(如 LKM 型植入)。

macOS 内存分析

# 进程列表 vol -f memory.raw mac.pslist # 进程树 vol -f memory.raw mac.pstree # 网络连接 vol -f memory.raw mac.netstat # 内核扩展 vol -f memory.raw mac.lsmod

macOS 侧插件命名以mac.前缀区分,mac.lsmod对应内核扩展(kext)枚举,用于排查以内核扩展方式驻留的恶意负载。整体功能面比 Windows 窄,但覆盖了进程与网络两大核心维度。

从采集到分析:两条可落地的完整工作流

仅掌握插件命令还不够,SKILL.md给出了两条端到端流程,可与上述插件族串联使用。

内存采集(Acquisition)

分析的前提是拿到镜像。Windows 侧推荐 WinPmem(命令行直接输出 raw 格式),备选 DumpIt、Belkasoft RAM Capturer、Magnet RAM Capture(后两者为 GUI);Linux 侧推荐 LiME 内核模块(sudo insmod lime.ko "path=/tmp/memory.lime format=lime"),亦可用受限的/dev/memsudo dd if=/dev/mem of=memory.raw bs=1M)或 ELF 格式的/proc/kcore;macOS 侧使用 osxpmem(sudo ./osxpmem -o memory.raw)或商业工具 MacQuisition。虚拟机内存则直接取宿主侧文件:VMware 的.vmem即 raw 镜像,VirtualBox 用vboxmanage debugvm "VMName" dumpvmcore --filename memory.elf,QEMU/KVM 用virsh dump <domain> memory.raw --memory-only,Hyper-V 则从检查点中获取内存状态。

恶意软件分析工作流

# 1. 初始进程普查 vol -f memory.raw windows.pstree > processes.txt vol -f memory.raw windows.pslist > pslist.txt # 2. 网络连接 vol -f memory.raw windows.netscan > network.txt # 3. 检测注入 vol -f memory.raw windows.malfind > malfind.txt # 4. 分析可疑进程 vol -f memory.raw windows.dlllist --pid <PID> vol -f memory.raw windows.handles --pid <PID> # 5. 转储可疑可执行文件 vol -f memory.raw windows.pslist --pid <PID> --dump # 6. 从转储中提取字符串 strings -a pid.<PID>.exe > strings.txt # 7. YARA 扫描 vol -f memory.raw windows.yarascan --yara-rules malware.yar

应急响应工作流

# 1. 事件时间线 vol -f memory.raw windows.timeliner > timeline.csv # 2. 用户活动 vol -f memory.raw windows.cmdline vol -f memory.raw windows.consoles # 3. 持久化机制 vol -f memory.raw windows.registry.printkey \ --key "Software\Microsoft\Windows\CurrentVersion\Run" # 4. 服务 vol -f memory.raw windows.svcscan # 5. 计划任务 vol -f memory.raw windows.scheduled_tasks # 6. 近期文件 vol -f memory.raw windows.filescan | grep -i "recent"

底层原理:理解内核数据结构才能看懂插件输出

references/details.md的下半部分深入 Windows 内核数据结构,这是解读插件输出的理论基础,也与前文的进程/注入分析逻辑一一对应。

EPROCESS 与 PEB

EPROCESS是 Windows 内核的进程控制块,ActiveProcessLinks双向链表连接所有活动进程(pslist即遍历此链表),UniqueProcessId记录 PID,Peb指针指向用户态进程环境块:

typedef struct _EPROCESS { KPROCESS Pcb; // 内核进程块 EX_PUSH_LOCK ProcessLock; LARGE_INTEGER CreateTime; LARGE_INTEGER ExitTime; LIST_ENTRY ActiveProcessLinks; // 双向链表 ULONG_PTR UniqueProcessId; // PID PEB* Peb; // 进程环境块 } EPROCESS;

PEB中的关键字段:BeingDebugged是反调试检查位(与 anti-reversing-techniques 中讨论的 PEB 反调试检测直接相关),ImageBaseAddress是可执行映像基址,Ldr指向加载器数据(即 DLL 链表,dlllist/ldrmodules的数据来源):

typedef struct _PEB { BOOLEAN InheritedAddressSpace; BOOLEAN ReadImageFileExecOptions; BOOLEAN BeingDebugged; // 反调试检查 PVOID ImageBaseAddress; // 可执行文件基址 PPEB_LDR_DATA Ldr; // 加载器数据(DLL 列表) PRTL_USER_PROCESS_PARAMETERS ProcessParameters; } PEB;

VAD 与内存保护标志

MMVAD(内存虚拟地址描述符)描述进程地址空间的每个内存区域,malfind/vadinfo正是围绕它工作。FileObject字段标识该区域是否有文件映射——无文件映射的可执行区域即注入的强信号

typedef struct _MMVAD { MMVAD_SHORT Core; union { ULONG LongFlags; MMVAD_FLAGS VadFlags; } u; PVOID FirstPrototypePte; PVOID LastContiguousPte; PFILE_OBJECT FileObject; } MMVAD;

配合内存保护标志常量理解malfind的判定逻辑——PAGE_EXECUTE_READWRITE (0x40)等"可写+可执行"组合在正常映像中几乎不存在:

#define PAGE_EXECUTE 0x10 #define PAGE_EXECUTE_READ 0x20 #define PAGE_EXECUTE_READWRITE 0x40 #define PAGE_EXECUTE_WRITECOPY 0x80

检测模式:Rootkit 与凭据提取

Rootkit 检测

# 对比进程列表,发现隐藏进程 vol -f memory.raw windows.pslist > pslist.txt vol -f memory.raw windows.psscan > psscan.txt diff pslist.txt psscan.txt # 隐藏进程 # 检查 DKOM(直接内核对象操作) vol -f memory.raw windows.callbacks # 检测被挂钩的系统调用 vol -f memory.raw windows.ssdt # 系统服务描述符表 # 驱动分析 vol -f memory.raw windows.driverscan vol -f memory.raw windows.driverirp

pslistpsscan的 diff 是最直观的隐藏进程检出法;ssdt检查系统服务描述符表是否被改写(inline hook 的典型位置);driverirp检查驱动的 IRP 分发例程是否被重定向。

凭据提取

# 转储哈希(需先执行 hivelist) vol -f memory.raw windows.hashdump # LSA 机密 vol -f memory.raw windows.lsadump # 缓存的域凭据 vol -f memory.raw windows.cachedump # Mimikatz 风格提取(依赖特定插件/工具)

这类插件直接面向横向移动与提权凭据的取证,属于敏感能力,应严格限定在已获授权的调查与防御性研究场景。

YARA 集成与字符串分析

内存 YARA 规则

YARA 可将威胁情报特征直接投向内存。references/details.md提供了两种典型规则范式:通用注入特征(MZ 头 + shellcode 前缀 + API hash 调用序列)与已知工具特征(Cobalt Strike Beacon 配置字节与关键字符串):

rule Suspicious_Injection { meta: description = "Detects common injection shellcode" strings: $mz = { 4D 5A } $shellcode1 = { 55 8B EC 83 EC } // 函数序言 $api_hash = { 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? E8 } // push hash, call condition: $mz at 0 or any of ($shellcode*) } rule Cobalt_Strike_Beacon { meta: description = "Detects Cobalt Strike beacon in memory" strings: $config = { 00 01 00 01 00 02 } $sleep = "sleeptime" $beacon = "%s (admin)" wide condition: 2 of them }

扫描执行方式(三种粒度):

# 扫描所有进程内存 vol -f memory.raw windows.yarascan --yara-rules rules.yar # 扫描特定进程 vol -f memory.raw windows.yarascan --yara-rules rules.yar --pid 1234 # 扫描内核内存 vol -f memory.raw windows.yarascan --yara-rules rules.yar --kernel

字符串与 FLOSS

# 基础字符串提取 strings -a memory.raw > all_strings.txt # Unicode 字符串 strings -el memory.raw >> all_strings.txt # 针对进程转储的定向提取 vol -f memory.raw windows.memmap --pid 1234 --dump strings -a pid.1234.dmp > process_strings.txt # 模式匹配(URL / IP) grep -E "(https?://|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" all_strings.txt # FLOSS 提取混淆字符串(含解码后的) floss malware.exe > floss_output.txt floss pid.1234.dmp

对于经过字符串加密/混淆的样本,FLOSS(FireEye Labs Obfuscated String Solver)能自动定位并解码 FLOSS 可识别的编码字符串,弥补strings的盲区。

最佳实践与常见误区

采集阶段

  1. 最小化足迹:使用轻量采集工具,避免在被取证主机上加载重型软件污染内存;
  2. 全程记录:记录采集时间、所用工具与版本、镜像哈希;
  3. 即时校验完整性:采集后立即计算镜像哈希;
  4. 维护监管链:保证取证处理链条完整可审计。

分析阶段

  1. 先宽后深:先做全局概览(进程树、netscan),再对可疑目标深挖;
  2. 交叉验证:同一数据用多个插件互相印证(如 pslist vs psscan);
  3. 时间线关联:将内存发现与磁盘、网络日志关联定位攻击时序;
  4. 记录留痕:保存详细笔记与截图作为证据;
  5. 多重验证:关键结论通过多种方法复核。

常见误区(见 SKILL.md)

  • 数据过期:内存易失,应尽快分析而非拖延归档;
  • 镜像不完整:核对镜像大小是否与目标机内存容量相符;
  • 符号问题:必须匹配正确的 OS 版本符号文件;
  • Smear 效应:采集过程中内存仍在变化,可能引入轻微不一致;
  • 加密数据:部分数据在内存中可能以加密形式存在,无法直接读取明文。

仓库资源导航

如需在真实调查任务中调用本文所述能力,可继续深入以下仓库文件:

  • memory-forensics 技能正文:采集工具、工作流、数据结构、YARA、最佳实践的完整入口;
  • memory-forensics 详细参考:本文核心依据,Volatility 3 插件命令全集;
  • malware-analyst 智能体:恶意软件分类、动静分析、IOC 提取与报告框架;
  • reverse-engineer 智能体:二进制分析、反汇编/反编译方法论;
  • anti-reversing-techniques 技能:与内存取证互补的保护对抗知识;
  • binary-analysis-patterns 技能:ELF/PE/Mach-O 分析工作流;
  • docs/authoring.md:了解references/渐进式披露模式与多平台技能分发的仓库约定。

需要注意,内存取证工具涉及敏感能力,使用范围应严格限定于已获授权的应急响应、防御性恶意软件研究与教育场景,与仓库内各智能体文档中声明的授权边界保持一致。

【免费下载链接】agentsMulti-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity项目地址: https://gitcode.com/GitHub_Trending/agents24/agents

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询