内存取证-volatility3工具的使用

安装

  • 下载 (下载最新的源码包)
1
wget https://github.com/volatilityfoundation/volatility3/archive/refs/tags/v2.5.2.zip -O volatility3.zip
  • 解压
1
unzip volatility3.zip
  • 安装依赖(这是 Vol 3 必须多做的一步)

Volatility3需要一些Python库才能工作,不装会报错

1
2
cd volatility3-2.5.2
pip3 install -r requirements.txt

当然在这一步,可以会遇到下面这种情况:

这里需要创建一个虚拟环境,就可以正常安装依赖了

1
2
3
4
5
6
7
8
#安装 venv 模块 (如果尚未安装)
sudo apt install -y python3-venv

#创建名为 venv 的虚拟环境
python3 -m venv 虚拟环境名

#激活虚拟环境
source 虚拟环境名/bin/activate
1
pip install -r requirements.txt
  • 制作快捷启动指令
1
2
3
4
5
6
7
8
# 退回上一级目录
cd ..

# 创建快捷指令(注意路径里多了个 /venv/bin/)
echo '~/ctf/volatility3-2.5.2/venv/bin/python3 ~/ctf/volatility3-2.5.2/vol.py "$@"' > vol3

# 给权限
chmod +x vol3

装完依赖后,你就可以愉快地用 ./vol3 -f xxx.raw windows.info 来做题了!!!

符号表

“按需自动下载” 的机制

当你第一次分析某个特定的 Windows 镜像时(比如运行 windows.info),Volatility3会做以下动作:

  1. 扫描内存镜像,找到内核的特征(GUID/PDB 签名)

  2. 联网去微软的官方服务器或者 GitHub 仓库寻找对应的符号表(Symbol Table)

  3. 下载并生成 .json 格式的符号文件

  4. 缓存存在你的硬盘里(默认位置是 ~/.cache/volatility3

  • 在国内环境(或者某些比赛断网环境),自动下载可能会失败(连不上微软服务器),所以需要手动下载一个离线符号包(看自己需要)

使用对应 linux / mac / windows 插件之前,请先下载对应的符号表(最好下载所有的符号包):

这个包只包含常见系统,如果是极其偏门的版本,还是得靠自动下载

  • 安装位置

把下载的zip包里的文件解压放进你 Volatility 3 目录下的 volatility3/symbols 文件夹里

使用方法

基本语法格式如下

1
./vol3 -f [内存镜像路径] [插件名称]

查看官方使用文档

1
./vol3 -h

最新插件使用以官方文档为准

插件名 用法
layerwriter 列出内存镜像 platform 信息,分割 layers
linux.bash 从内存中恢复 bash 命令历史记录
linux.check_afinfo 验证网络协议的操作功能指针
linux.check_syscall 检查系统调用表中的挂钩
linux.elfs 列出所有进程的所有内存映射ELF文件
linux.lsmod 列出加载的内核模块
linux.lsof 列出所有进程的所有内存映射
linux.malfind 列出可能包含注入代码的进程内存范围
linux.proc 列出所有进程的所有内存映射
linux.pslist 列出 linux 内存映像中存在的进程
linux.pstree 列出进程树
mac.bash 从内存中恢复 bash 命令历史记录
mac.check_syscall 检查系统调用表中的挂钩
mac.check_sysctl 检查 sysctl 处理程序的挂钩
mac.check_trap_table 检查 trap 表中的挂钩
mac.ifconfig 列出网卡信息
mac.lsmod 列出加载的内核模块
mac.lsof 列出所有进程的所有内存映射
mac.malfind 列出可能包含注入代码的进程内存范围
mac.netstat 列出所有进程的所有网络连接
mac.psaux 恢复程序命令行参数
mac.pslist 列出 mac 内存映像中存在的进程
mac.pstree 列出进程树
mac.tasks 列出 mac 内存映像中存在的进程
windows.info 显示正在分析的内存样本的 OS 和内核详细信息
windows.callbacks 列出内核回调和通知例程
windows.cmdline 列出进程命令行参数
windows.dlldump 将进程内存范围 DLL 转储
windows.dlllist 列出 Windows 内存映像中已加载的 dll 模块
windows.driverirp 在 Windows 内存映像中列出驱动程序的 IRP
windows.driverscan 扫描 Windows 内存映像中存在的驱动程序
windows.filescan 扫描 Windows 内存映像中存在的文件对象
windows.handles 列出进程打开的句柄
windows.malfind 列出可能包含注入代码的进程内存范围
windows.moddump 转储内核模块
windows.modscan 扫描 Windows 内存映像中存在的模块
windows.mutantscan 扫描 Windows 内存映像中存在的互斥锁
windows.pslist 列出 Windows 内存映像中存在的进程,转储处理可执行映像
windows.psscan 扫描 Windows 内存映像中存在的进程
windows.pstree 列出进程树
windows.registry.certificates 列出注册表中存储的证书
windows.registry.hivelist 列出内存映像中存在的注册表配置单元
windows.registry.hivescan 扫描 Windows 内存映像中存在的注册表配置单元
windows.registry.printkey 在配置单元或特定键值下列出注册表项
windows.registry.userassist 打印用户助手注册表项和信息
windows.ssdt 列出系统调用表
windows.strings 读取字符串命令的输出,并指示每个字符串属于哪个进程
windows.svcscan 扫描 Windows 服务
windows.symlinkscan 扫描 Windows 内存映像中存在的链接

假设你有一个名为 memdump.mem 的内存文件。

1. 查看系统基本信息 (windows.info)

这是第一步,用于确认镜像是否被正确识别以及系统版本

1
./vol3 -f memdump.mem windows.info

2. 列出进程 (windows.pslist)

查看内存被捕获时正在运行的进程

1
./vol3 -f memdump.mem windows.pslist

3. 查看进程树 (windows.pstree)

这是 pslist 的增强版,以树状结构显示父子进程关系,非常适合发现恶意进程(例如 svchost.exe 如果没有父进程通常很可疑)

1
./vol3 -f memdump.mem windows.pstree

4. 查看网络连接 (windows.netscan)

查看当时的网络连接、监听端口和关联的 PID

1
./vol3 -f memdump.mem windows.netscan

5. 提取文件 (windows.dumpfiles)

如果你发现了一个可疑进程(比如 PID 为 1234),想把它从内存中提取出来进行逆向分析:

1
./vol3 -f memdump.mem windows.dumpfiles --pid 1234

6. 查找恶意代码注入 (windows.malfind)

扫描进程内存中具有 rwx(可读可写可执行)权限的内存段,这通常是 shellcode 注入的特征

1
./vol3 -f memdump.mem windows.malfind

7.进程转储(dump)

1
./vol3 -o ./outputdir/ -f memdump.mem windows.pslist --pid 进程 --dump

8.内存转储(windows.memmap)

1
./vol3 -o ./outputdir/ -f memdump.mem windows.memmap --pid 进程 --dump

9.查看句柄(windows.handles)

1
2
./vol3 -f memdump.mem windows.handles
./vol3 -f memdump.mem windows.handles --pid 进程

10.查看 DLL(windows.dlllist)

1
2
./vol3 -f memdump.mem windows.dlllist
./vol3 -f memdump.mem windows.dlllist --pid 进程

11.DLL 转储(dump)

1
./vol3 -o ./outputdir/ -f memdump.mem windows.dlllist --pid 进程 --dump

12.查看命令行(windows.cmdline)

1
2
./vol3 -f memdump.mem windows.cmdline
./vol3 -f memdump.mem windows.cmdline --pid 进程

13.查看网络端口(windows.netscan)

1
./vol3 -f memdump.mem windows.netscan

查看完整的结果,但可能包含垃圾信息和虚假信息 (谨慎使用啊)

1
./vol3 -f memdump.mem windows.netscan --include-corrupt

14.查看注册表信息(windows.registry.hivescanwindows.registry.hivelist)

1
2
./vol3 -f memdump.mem windows.registry.hivescan
./vol3 -f memdump.mem windows.registry.hivelist

查看指定过滤器 (文件夹) 下的注册表信息

1
./vol3 -f memdump.mem windows.registry.hivelist --filter FILTER

15.注册表信息转储(dump)

1
./vol3 -o ./outputdir/ -f memdump.mem windows.registry.hivelist --filter FILTER --dump

16.查看注册表键值对(windows.registry.printkey)

1
./vol3 -f memdump.mem windows.registry.printkey

查看指定过滤器 (文件夹) 下的注册表信息,但需要 hivelist 提供的 offset

1
./vol3 -f memdump.mem windows.registry.printkey --offset OFFSET

查看指定键下的注册表值

1
./vol3 -f memdump.mem windows.registry.printkey --key KEY

打印所有键的信息

1
./vol3 -f memdump.mem windows.registry.printkey --recurse

17.查看文件信息(windows.filescan)

1
./vol3 -f memdump.mem windows.filescan

建议通过 powershell 的 Select-String 或者 bash 的 grep 进行搜索,如:

1
2
./vol3 -f memdump.mem windows.filescan | grep "flag"
./vol3 -f memdump.mem windows.filescan | Select-String "flag"

18.文件转储(windows.dumpfiles)

需要 pslist 提供的 pid

1
./vol3 -o ./outputdir/ -f memdump.mem windows.dumpfiles --pid 进程

(推荐) 需要 filescan 提供的 offset (一般来说为 physaddr)

1
2
./vol3 -o ./outputdir/ -f memdump.mem windows.dumpfiles --virtaddr offset
./vol3 -o ./outputdir/ -f memdump.mem windows.dumpfiles --physaddr offset

19.查找恶意注入代码(windows.malfind)

1
2
./vol3 -f memdump.mem windows.malfind
./vol3 -f memdump.mem windows.malfind --pid 进程

恶意注入代码转储

1
./vol3 -o ./outputdir/ -f memdump.mem windows.malfind --pid 进程 --dump

更多使用可以看这位师傅的:

https://hasegawaazusa.github.io/vol3-note.html#vol-%E5%AF%B9%E8%B1%A1