——本文总结了近期学习内存取证的内容,如有错误和遗漏,欢迎各位师傅指正补充。
内存取证,就是对计算机运行时的内存数据进行分析和还原,从中寻找系统活动痕迹和敏感信息的过程。就像给正在运行中的电脑拍了一张实况照片,我们来分析这张照片中当时发生了什么。
我们通过分析内存的镜像文件,尽力的去还原系统在那个时刻的运行状态。
常见文件类型
在进行内存取证时,常见以下文件类型:
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时会出现一些字段

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工具的常用命令,并能够结合其他类型的知识(图片隐写、压缩包分析等)对提取出的文件进行分析,就可以解决这类问题。