——本文总结了近期学习内存取证的内容,如有错误和遗漏,欢迎各位师傅指正补充。

内存取证,就是对计算机运行时的内存数据进行分析和还原,从中寻找系统活动痕迹和敏感信息的过程。就像给正在运行中的电脑拍了一张实况照片,我们来分析这张照片中当时发生了什么。

我们通过分析内存的镜像文件,尽力的去还原系统在那个时刻的运行状态。

常见文件类型

在进行内存取证时,常见以下文件类型:

RAW

原始内存镜像,按字节直接导出的数据文件。

VMEM

虚拟机生成的内存文件,常见于 VMware 场景。

DMP

内存转储文件,主要包含系统崩溃或调试时的内存内容,用于系统故障分析、调试和取证分析。

IMG

磁盘映像文件,逐字节复制磁盘内容,包括分区、文件系统等,应用于磁盘克隆、备份等场景。

ISO

光盘映像,逐字节复制光盘内容,包括引导信息等,最常用的就是操作系统安装或者光盘备份。

VMDK

虚拟机磁盘,包含虚拟机磁盘的完整内容,VMware环境取证常见。

其中,.raw .vmem和.dmp文件里面保存的是内存内容,可以直接使用volatility工具进行取证分析,.img,.iso,.vmdk等文件保存的是磁盘或光盘数据,一般不能直接拿来做内存分析,需要通过挂载等方式进一步查看内部信息。

volatility

Volatility 是内存取证中最常用的分析工具之一,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况和系统的运行状态等。常说的volatility有两个版本,Volatility 2 和 Volatility 3,我这里用的是vol2,下面是一些常用命令。

1.确定操作系统

vol.py -f 文件 imageinfo

获取内存镜像内核,系统版本信息,调用对应版本的profile取证

在该命令中识别到profile之后,后面的命令几乎都是以下面的命令为开头,加上命令插件:

vol.py -f 文件 –profile=操作系统

1
例:vol.py -f mem.raw --profile=Win7SP1x64 

2.常用命令插件

查看进程pslist

vol.py -f 文件 –profile=操作系统 pslist

查看已知进程pslist

vol.py -f 文件 –profile=操作系统 pslist -p 进程号

当使用pslist时会出现一些字段

image-20260413153359170

1
2
3
4
5
6
7
8
9
10
11
12
13
Offset(V) :进程的虚拟地址偏移量

PID:进程的唯一标识符

PPID:父进程ID

Thds:包含的线程数

Hnds:进程打开的句柄数

Sess:会话ID,用于区分用户登录会话(特别是在多用户系统中)

Wow64:如果进程运行64位系统的32位兼容模式下,显示为True,其余为空

扫描所有的文件列表filescan

vol.py -f 文件 –profile=操作系统 filescan

查看命令行操作,显示cmd历史命令cmdscan

vol.py -f 文件 –profile=操作系统 cmdscan

查看进程命令行参数(具体一些可疑进程的参数指令)cmdline

vol.py -f 文件 –profile=操作系统 cmdline

查看文件内容dumpfiles

vol.py -f 文件 –profile=操作系统 dumpfiles -Q 0xxxxxxxx -D ./

(-Q后是偏移地址,一般是十六进制,-D后是导出目录)

查看当前内存镜像中的用户名

vol.py -f 文件 –profile=操作系统 printkey -K “SAM\Domains\Account\Users\Names”

查看注册表地址

vol.py -f 文件 –profile=操作系统 hivelist

查看用户名密码信息(得到的密码是哈希值,需要john爆破hashdump的结果)

vol.py -f 文件 –profile=操作系统 hashdump -y 注册表地址 -s SAM地址

如果 hashdump 导出的哈希难以爆破,可以进一步尝试 lsadump 提取 LSA secrets

vol.py -f 文件 –profile=操作系统 lsadump

查看浏览器历史记录,获取当前系统浏览器搜索过的关键词iehistory

vol.py -f 文件 –profile=操作系统 iehistory

查看网络连接获取当前系统ip netscan

vol.py -f 文件 –profile=操作系统 netscan

有些版本使用不了,可以切换为connscan,connections

隐藏或解链的进程psscan

vol.py -f 文件 –profile=操作系统 psscan

查询服务名称svcscan

vol.py -f 文件 –profile=操作系统 svcscan

查看当前展示的notpad内容notpad

vol.py -f 文件 –profile=操作系统 notepad

提取进程memdump

vol.py -f 文件 –profile=操作系统 memdump -p xxx –dump-dir=./

memdump:提取出指定进程,常用foremost来分离里面的文件

dumpfiles:导出某一文件(指定虚拟地址)

此外还有很多支持的插件,使用vol.py -h命令即可查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
amcache         #打印 AmCache 信息
apihooks #检测进程和内核内存中的 API Hook
atoms #打印会话和窗口站的原子表
atomscan #使用池扫描方式扫描原子表
auditpol #从 HKLM\SECURITY\Policy\PolAdtEv 中打印审计策略
bigpools #使用 BigPagePoolScanner 导出大页内存池
bioskbd #从实模式内存中读取键盘缓冲区
cachedump #导出缓存的域哈希
callbacks #打印系统范围的通知例程
clipboard #提取 Windows 剪贴板内容
cmdline #显示进程命令行参数
cmdscan #通过扫描 _COMMAND_HISTORY 提取命令历史
connections #打印打开的网络连接列表(仅限 Windows XP 和 2003)
connscan #使用池扫描方式扫描 TCP 连接
consoles #通过扫描 _CONSOLE_INFORMATION 提取命令历史
crashinfo #导出崩溃转储信息
deskscan #针对 tagDESKTOP(桌面对象)的池扫描器
devicetree #显示设备树
dlldump #从进程地址空间中导出 DLL
dlllist #打印每个进程加载的 DLL 列表
driverirp #检测驱动 IRP Hook
drivermodule #将驱动对象与内核模块关联起来
driverscan #使用池扫描方式扫描驱动对象
dumpcerts #导出 RSA 私钥和公钥 SSL 密钥
dumpfiles #提取内存映射文件和缓存文件
dumpregistry #将注册表文件导出到磁盘
editbox #显示 Edit 控件信息(Listbox 为实验性功能)
envars #显示进程环境变量
eventhooks #打印 Windows 事件 Hook 的详细信息
evtlogs #提取 Windows 事件日志(仅限 XP/2003)
filescan #使用池扫描方式扫描文件对象
gahti #导出 USER 句柄类型信息
gditimers #打印已安装的 GDI 定时器和回调
gdt #显示全局描述符表(GDT)
getservicesids #获取注册表中服务名称并返回计算得到的 SID
getsids #打印每个进程所属的 SID
handles #打印每个进程打开的句柄列表
hashdump #从内存中导出密码哈希(LM/NTLM)
hibinfo #导出休眠文件信息
hivedump #打印注册表 Hive 内容
hivelist #打印注册表 Hive 列表
hivescan #使用池扫描方式扫描注册表 Hive
hpakextract #从 HPAK 文件中提取物理内存
hpakinfo #显示 HPAK 文件信息
idt #显示中断描述符表(IDT)
iehistory #重建 Internet Explorer 缓存 / 历史记录
imagecopy #将物理地址空间复制为原始 DD 镜像
imageinfo #识别镜像信息
impscan #扫描导入函数调用
joblinks #打印进程 Job 链接信息
kdbgscan #搜索并导出可能的 KDBG 值
kpcrscan #搜索并导出可能的 KPCR 值
ldrmodules #检测未链接的 DLL
lsadump #从注册表中导出(解密后的)LSA Secrets
machoinfo #导出 Mach-O 文件格式信息
malfind #查找隐藏代码和注入代码
mbrparser #扫描并解析可能的主引导记录(MBR)
memdump #导出某个进程可寻址的内存
memmap #打印内存映射
messagehooks #列出桌面和线程窗口消息 Hook
mftparser #扫描并解析可能的 MFT 条目
moddump #将内核驱动导出为可执行文件样本
modscan #使用池扫描方式扫描内核模块
modules #打印已加载模块列表
multiscan #同时扫描多种对象
mutantscan #使用池扫描方式扫描互斥体对象
notepad #列出当前显示的记事本文本
objtypescan #扫描 Windows 对象类型对象
patcher #基于页面扫描结果修补内存
poolpeek #可配置的池扫描插件
printkey #打印注册表键,以及其子键和值
privs #显示进程权限
procdump #将进程导出为可执行文件样本
pslist #通过遍历 EPROCESS 链表打印所有正在运行的进程
psscan #使用池扫描方式扫描进程对象
pstree #以树状结构打印进程列表
psxview #通过多种进程枚举方式查找隐藏进程
qemuinfo #导出 Qemu 信息
raw2dmp #将原始物理内存样本转换为 WinDbg 崩溃转储
screenshot #基于 GDI 窗口保存伪截图
servicediff #列出 Windows 服务(类似 Plugx 分析方式)
sessions #列出 _MM_SESSION_SPACE 的详细信息(用户登录会话)
shellbags #打印 ShellBags 信息
shimcache #解析应用兼容性 Shim Cache 注册表键
shutdowntime #从注册表中打印机器关机时间
sockets #打印打开的套接字列表
sockscan #使用池扫描方式扫描 TCP 套接字对象
ssdt #显示 SSDT 条目
strings #将物理偏移匹配到虚拟地址(可能耗时很久,而且输出非常详细)
svcscan #扫描 Windows 服务
symlinkscan #使用池扫描方式扫描符号链接对象
thrdscan #使用池扫描方式扫描线程对象
threads #分析 _ETHREAD 和 _KTHREAD
timeliner #根据内存中的多种痕迹生成时间线
timers #打印内核定时器及其关联模块的 DPC
truecryptmaster #恢复 TrueCrypt 7.1a 主密钥
truecryptpassphrase #查找缓存的 TrueCrypt 口令
truecryptsummary #TrueCrypt 摘要信息
unloadedmodules #打印已卸载模块列表
userassist #打印 UserAssist 注册表键及其信息
userhandles #导出 USER 句柄表
vaddump #将 VAD 区段导出到文件
vadinfo #导出 VAD 信息
vadtree #遍历 VAD 树并以树状形式显示
vadwalk #遍历 VAD 树
vboxinfo #导出 VirtualBox 信息
verinfo #打印 PE 映像中的版本信息
vmwareinfo #导出 VMware VMSS/VMSN 信息
volshell #进入内存镜像交互式 Shell
windows #打印桌面窗口(详细模式)
wintree #打印桌面窗口 Z-Order 树
wndscan #使用池扫描方式扫描窗口站
yarascan #使用 Yara 签名扫描进程或内核内存

内存取证题目的大致思路

首先确定镜像是何种操作系统的,命令imageinfo即可获取镜像系统信息。

接着需要重点分析计算机在这一时刻运行了哪些进程。

Volatility提供了众多的分析进程的命令,如pslist、psscan、pstree等从不同角度查看进程情况。

在此基础上,filescan命令可以对打开的文件进行扫描,命令dumpfiles和memdump命令将相关数据导出,然后对导出的数据进行二进制分析等处理。

简单说只要熟悉Volatility工具的常用命令,并能够结合其他类型的知识(图片隐写、压缩包分析等)对提取出的文件进行分析,就可以解决这类问题。