04-取证制品分析 (Forensic Artifacts Analysis)
Windows 系统在程序执行、文件访问、用户操作等各个环节留下了大量取证制品(Forensic Artifacts)。这些制品是 Windows 独有的——Linux 没有 Prefetch、Amcache、ShimCache、Shellbags 等机制。掌握这些制品的解析方法,是 Windows DFIR 的核心竞争力。
前置知识:01-系统基础与注册表 | 03-事件日志分析
关联章节:Windows应急响应/07-文件取证排查 | Windows应急响应/36-KAPE与Velociraptor
Linux 对照:06-文件系统取证 | 09-历史记录与时间线分析
1. 取证制品概述与分类
1.1 为什么 Windows 取证制品如此重要?
Windows 在设计上记录了大量用户和系统活动,形成了丰富的取证制品体系
即使攻击者删除了恶意文件,这些制品往往仍然保留着关键证据
与 Linux 的根本差异:
Linux 取证主要依赖:bash_history、syslog/journald、wtmp/lastlog、文件时间戳
Windows 取证制品种类远多于 Linux,且分布在注册表、文件系统、ESE 数据库等多个位置
这是 Windows DFIR 最大的优势也是最大的复杂度来源
1.2 取证制品分类体系
| 类别 | 制品 | 回答的核心问题 |
|---|---|---|
| 程序执行 | Prefetch, Amcache, ShimCache, UserAssist, BAM/DAM, SRUM | 某程序是否被执行过?执行了几次?何时执行? |
| 文件访问 | LNK 文件, Jump Lists, Shellbags, Recent Files | 用户访问/打开了哪些文件和目录? |
| 文件系统 | $MFT, $UsnJrnl, $LogFile, $I30 | 文件何时创建/修改/删除?是否被篡改时间戳? |
| 网络活动 | SRUM (网络部分), BITS Jobs, DNS Cache | 程序使用了多少网络流量?连接了哪些地址? |
| 用户活动 | UserAssist, Shellbags, TypedPaths, TypedURLs | 用户在 GUI 中做了什么操作? |
1.3 取证制品的时间覆盖范围
| 制品 | 典型保留时间 | 数据量限制 |
|---|---|---|
| Prefetch | 取决于文件数量,上限 1024 个 .pf 文件 | Windows 10+ 最大 1024 条 |
| Amcache | 数月至数年 | 注册表 Hive 文件大小限制 |
| ShimCache | 自上次重启以来 | 最后 1024 条记录 |
| USN Journal | 数天到数周 | 默认 32MB-64MB 循环覆盖 |
| SRUM | 最长 30 天 | ESE 数据库大小限制 |
| Shellbags | 数月至数年 | 用户注册表 Hive 大小限制 |
| Event Log | 取决于日志大小设置 | 默认 20MB 循环覆盖 |
2. Prefetch 文件分析
2.1 Prefetch 基本原理
什么是 Prefetch:
Windows XP 引入的性能优化机制
监控程序启动时加载的文件(DLL、数据文件等),生成 .pf 文件
下次启动同一程序时,预先将这些文件加载到内存,加速启动
位置:C:\Windows\Prefetch\
文件命名格式:EXECUTABLE_NAME-HASH.pf
例如:CMD.EXE-4A81B364.pf
HASH 基于程序路径和命令行参数计算
同一程序从不同路径运行会生成不同的 .pf 文件
版本差异:
| Windows 版本 | Prefetch 版本 | 最大文件数 | 记录执行次数 |
|---|---|---|---|
| Windows XP/2003 | v17 | 128 | 最后 1 次执行时间 |
| Windows Vista/7 | v23 | 128 | 最后 1 次执行时间 |
| Windows 8/8.1 | v26 | 1024 | 最后 8 次执行时间 |
| Windows 10/11 | v30 | 1024 | 最后 8 次执行时间 |
2.2 Prefetch 包含的关键信息
每个 .pf 文件记录以下内容:
可执行文件名称:程序名(大写)
执行次数(Run Count):该程序被执行的总次数
最后执行时间:Windows 8+ 记录最近 8 次执行时间
引用的文件/DLL 列表:程序启动时加载的所有文件路径
引用的目录列表:程序访问过的目录
卷信息:卷设备路径、卷序列号、卷创建时间
IR 关键价值:
证明某程序曾在系统上执行过(即使程序文件已被删除)
通过引用文件列表推断程序行为(如加载了哪些 DLL)
通过执行时间建立时间线
2.3 使用 PECmd 分析 Prefetch
PECmd 是 Eric Zimmerman 开发的 Prefetch 解析工具:
1 | # 下载 Eric Zimmerman 工具集 |
PECmd 输出关键字段解读:
| 字段 | 含义 | IR 关注点 |
|---|---|---|
| SourceFilename | .pf 文件名 | 对应可执行文件名和路径哈希 |
| RunCount | 执行次数 | 异常高/低的执行次数 |
| LastRun | 最后执行时间 | 与事件时间线对照 |
| PreviousRun0-6 | 之前的 7 次执行时间 | 建立完整执行时间线 |
| FilesLoaded | 加载的文件列表 | 分析程序加载了哪些 DLL/文件 |
| Directories | 访问的目录 | 分析程序访问了哪些路径 |
2.4 Prefetch 异常指标 (IOC)
高度可疑的 Prefetch 文件:
CMD.EXE-*.pf — 命令提示符被频繁使用
POWERSHELL.EXE-*.pf — PowerShell 被执行
CERTUTIL.EXE-*.pf — 可能用于下载文件或 Base64 解码
BITSADMIN.EXE-*.pf — 可能用于下载文件或持久化
MSHTA.EXE-*.pf — 可能执行了 HTA 恶意脚本
WSCRIPT.EXE-*.pf / CSCRIPT.EXE-*.pf — 可能执行了 VBS/JS 恶意脚本
REGSVR32.EXE-*.pf — 可能用于执行 COM scriptlet
RUNDLL32.EXE-*.pf — 检查引用文件列表中是否有可疑 DLL
MSIEXEC.EXE-*.pf — 可能安装了恶意 MSI 包
PSEXEC.EXE-*.pf / PSEXESVC.EXE-*.pf — 远程执行工具,横向移动标志
WMIC.EXE-*.pf — 可能用于侦察或远程执行
NET.EXE-*.pf / NET1.EXE-*.pf — 账户/组/共享操作
WHOAMI.EXE-*.pf — 权限侦察
NLTEST.EXE-*.pf — 域信任枚举
RAR.EXE-*.pf / 7Z.EXE-*.pf — 数据打包准备窃取
检查引用文件中的可疑路径:
\Users\Public\ — 公共目录,常被恶意软件利用
\Temp\ — 临时目录
\AppData\Local\Temp\ — 用户临时目录
\ProgramData\ — 隐藏的程序数据目录
\Downloads\ — 用户下载目录
1 | # 快速查找可疑 Prefetch 文件 |
2.5 Prefetch 限制与注意事项
Windows Server 默认不启用 Prefetch:
服务器版 Windows 默认将 Prefetch 设为禁用或仅缓存启动应用
注册表位置:HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters
EnablePrefetcher 值:0=禁用, 1=仅应用, 2=仅启动, 3=全部启用
Prefetch 可被清除:
攻击者可以删除特定 .pf 文件或清空整个 Prefetch 目录
对策:通过 $MFT 或 $UsnJrnl 追踪 .pf 文件的删除记录
SSD 上的行为差异:
Windows 8+ 在 SSD 上默认启用 SuperFetch 但行为略有不同
Prefetch 仍然生成 .pf 文件,但预加载策略不同
3. Amcache.hve 分析
3.1 Amcache 基本原理
什么是 Amcache:
Windows 应用兼容性数据库,用于记录程序执行信息
本质上是一个注册表 Hive 文件
记录了在系统上执行过的程序、驱动程序、快捷方式等信息
位置:C:\Windows\appcompat\Programs\Amcache.hve
前身:Windows XP/Vista 使用 RecentFileCache.bcf,Windows 7+ 开始使用 Amcache.hve
3.2 Amcache 包含的关键信息
InventoryApplicationFile 键(Windows 10+):
| 字段 | 含义 | IR 价值 |
|---|---|---|
| ProgramId | 程序标识符 | 关联不同制品 |
| Name | 程序名称 | 确认执行了什么程序 |
| LowerCaseLongPath | 完整文件路径 | 确认恶意文件的原始位置 |
| FileId (SHA1) | 文件 SHA1 哈希 | 即使文件被删也能查 VT |
| Size | 文件大小 | 辅助识别 |
| Publisher | 发布者信息 | 验证软件来源 |
| Version | 文件版本 | 识别已知恶意版本 |
| BinaryType | 32/64 位 | 分析恶意软件特征 |
| LinkDate | PE 编译时间 | 检测时间戳伪造 |
| ProductName | 产品名称 | 识别伪装程序 |
核心 IR 价值:
提供恶意软件的 SHA1 哈希值,即使恶意文件已被删除
可直接将哈希提交到 VirusTotal 查询
记录了程序的原始路径,帮助确认感染向量
3.3 使用 AmcacheParser 分析
1 | # AmcacheParser (Eric Zimmerman 工具) |
分析输出 CSV 的关键步骤:
按
FileKeyLastWriteTimestamp排序,找到事件时间窗口内的记录检查
SHA1字段,批量提交到 VirusTotal检查
LowerCaseLongPath,关注可疑路径(Temp、Public、Downloads 等)检查
Publisher字段为空或异常的记录检查
IsPeFile为 True 但Publisher为空的文件
1 | # 使用 PowerShell 从 Amcache CSV 中快速筛选可疑记录 |
3.4 Amcache 与 VirusTotal 联动
1 | # 使用 VT API 批量查询 Amcache 提取的哈希 |
3.5 Amcache 注意事项
Amcache 数据不一定在程序执行的同时写入,可能有延迟
Windows 10 更新频繁修改 Amcache 结构,不同版本的键名可能不同
安装了程序但未执行也可能留下 Amcache 记录(通过 MSI 安装时)
Amcache.hve 在系统运行时被锁定,取证时需要:
使用 KAPE 或 RawCopy 提取
从取证镜像中直接提取
使用卷影副本(VSS)获取
4. ShimCache / AppCompatCache 分析
4.1 ShimCache 基本原理
什么是 ShimCache(AppCompatCache):
Windows 应用兼容性缓存,用于加速兼容性查找
记录操作系统检查过兼容性的可执行文件信息
数据存储在注册表中,仅在系统关机/重启时写入
位置:SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache(AppCompatCache 值)
与 Amcache 的区别:
| 特性 | ShimCache | Amcache |
|---|---|---|
| 存储位置 | SYSTEM 注册表 Hive | 独立 Hive 文件 |
| 写入时机 | 系统关机/重启时 | 程序执行后不久 |
| 包含哈希 | 否(仅路径+时间) | 是(SHA1) |
| 执行证据 | 不确定(有执行标志位但不完全可靠) | 较强的执行证据 |
| 记录上限 | ~1024 条 | 无固定上限 |
4.2 ShimCache 包含的信息
| 字段 | 含义 | IR 价值 |
|---|---|---|
| Path | 可执行文件完整路径 | 确认恶意文件位置 |
| LastModifiedTime | 文件最后修改时间($STANDARD_INFORMATION) | 时间线分析 |
| ExecutionFlag | 是否曾执行(Windows 7/8,Win10 不可靠) | 辅助判断是否执行 |
| CacheEntryPosition | 在缓存中的位置(越靠前越新) | 推断时间顺序 |
关键理解:
ShimCache 中存在的文件 不一定被执行过(文件被访问/检查也会留下记录)
但 ShimCache 中 不存在 的文件,说明该文件从未被操作系统检查兼容性
ShimCache 的主要价值在于:结合其他制品(Prefetch、Amcache)进行关联验证
4.3 使用 AppCompatCacheParser 分析
1 | # AppCompatCacheParser (Eric Zimmerman 工具) |
1 | # 分析 ShimCache CSV 中的可疑条目 |
4.4 ShimCache 特殊注意事项
数据仅在重启后写入:
如果系统自入侵以来未重启,当前 ShimCache 可能不包含最新活动
需要从内存中提取实时 ShimCache 数据(使用 Volatility 的 shimcache 插件)
攻击者可能强制重启来刷新 ShimCache:
通过重启将恶意活动混入大量正常条目中
优先级:在多制品关联分析中,ShimCache 通常作为辅助证据而非主要证据
5. MFT ($MFT) 深度分析
5.1 NTFS Master File Table 基础
什么是 MFT:
NTFS 文件系统的核心元数据结构
每个文件和目录在 MFT 中都有至少一条记录(MFT Entry)
每条记录默认 1024 字节,包含文件的所有元数据
MFT 相当于文件系统的”电话簿”——记录了所有文件的详细信息
位置:卷根目录下的 $MFT 文件(隐藏的系统文件)
Linux 对照:类似 ext4 的 inode 表,但 MFT 包含的信息更丰富,参考 06-文件系统取证
5.2 MFT 记录结构
每条 MFT 记录包含多个属性(Attributes):
| 属性类型 | 属性名 | 内容 |
|---|---|---|
| 0x10 | $STANDARD_INFORMATION ($SI) | MACE 时间戳、文件属性、安全 ID、所有者 ID |
| 0x30 | $FILE_NAME ($FN) | 文件名(短名/长名)、MACE 时间戳、父目录引用 |
| 0x40 | $OBJECT_ID | 文件唯一标识符(GUID) |
| 0x80 | $DATA | 文件数据内容(小文件直接存储在 MFT,称为 Resident) |
| 0x90 | $INDEX_ROOT | 目录索引(目录的 MFT 记录) |
| 0xA0 | $INDEX_ALLOCATION | 目录索引分配 |
| 0xB0 | $BITMAP | 索引使用位图 |
5.3 MACE 时间戳体系
MACE = Modified, Accessed, Changed(MFT Entry), Entry Created
每个 MFT 记录包含 两组 MACE 时间戳:
$STANDARD_INFORMATION (0x10) 时间戳:
Created (C):文件创建时间
Modified (M):内容最后修改时间
Accessed (A):最后访问时间
Entry Modified (E):MFT 条目最后修改时间
$FILE_NAME (0x30) 时间戳:
同样包含 MACE 四个时间戳
通常在文件创建/重命名/移动时设置
关键区别:$FN 时间戳在正常操作中很少更新
为什么有两组时间戳?
$SI 时间戳是”用户可见”的时间戳,dir 和 Explorer 显示的就是 $SI 时间
$FN 时间戳是”内部”的,普通 API 无法直接修改
攻击者使用 timestomping 工具时,通常只修改 $SI 时间戳
$SI 与 $FN 时间戳不一致 = timestomping 强指标
5.4 Timestomping 检测
什么是 Timestomping:
攻击者修改文件时间戳来隐藏恶意活动
使恶意文件看起来是”很久以前”创建的合法文件
MITRE ATT&CK: T1070.006 - Indicator Removal: Timestomping
检测原理:
大多数 timestomping 工具(如 Cobalt Strike 的 timestomp)只修改 $SI 时间戳
$FN 时间戳无法通过普通 Windows API 修改(需要内核级操作)
对比两组时间戳可发现异常
Timestomping 检测指标:
$SI Created 远早于 $FN Created
$SI 时间精确到整秒(0 纳秒),正常文件有纳秒精度
$SI Modified 早于 $FN Created(逻辑矛盾)
$SI 时间与 PE 编译时间不匹配
1 | # 使用 MFTECmd 解析 $MFT 并检测 timestomping |
1 | # 从解析后的 MFT CSV 中检测 timestomping |
5.5 MFT 分析实战要点
小文件 Resident Data:
小于约 700 字节的文件,其内容直接存储在 MFT 记录中
即使文件被删除,如果 MFT 记录未被覆盖,文件内容仍可恢复
这对于恢复小型 Webshell、脚本文件等非常有价值
已删除文件的 MFT 记录:
文件删除时,MFT 记录的 Flags 标记为”未使用”,但数据通常不会立即清除
MFTECmd 可以解析包括已删除文件在内的所有 MFT 记录
MFT 记录号可用于关联其他制品:
USN Journal 记录引用 MFT Entry Number
$LogFile 也引用 MFT Entry Number
通过 MFT Entry Number 可以跨制品关联分析
6. USN Journal ($UsnJrnl:$J) 分析
6.1 USN Journal 基本原理
什么是 USN Journal:
NTFS 更新序列号日志(Update Sequence Number Journal)
记录文件系统中所有文件和目录的变更操作
用途:文件索引服务、备份软件、防病毒等依赖 USN Journal 追踪文件变化
位置:$Extend\$UsnJrnl:$J(作为 NTFS Alternate Data Stream 存储)
Linux 对照:Linux 没有直接等价物;ext4 的 journal 是事务日志而非变更日志
6.2 USN Journal 记录内容
每条 USN 记录包含:
| 字段 | 含义 | IR 价值 |
|---|---|---|
| Usn | 更新序列号 | 唯一标识符,可排序 |
| Timestamp | 变更时间 | 精确的操作时间 |
| FileName | 文件名 | 哪个文件被操作 |
| ParentFileReferenceNumber | 父目录 MFT 引用号 | 文件所在目录 |
| FileReferenceNumber | 文件 MFT 引用号 | 关联 MFT 记录 |
| Reason | 变更原因标志 | 具体发生了什么操作 |
| FileAttributes | 文件属性 | 隐藏/系统/目录等标志 |
Reason 标志(关键):
| Reason Code | 含义 | IR 关注点 |
|---|---|---|
| FILE_CREATE | 文件创建 | 恶意文件投放 |
| FILE_DELETE | 文件删除 | 恶意文件清理/反取证 |
| DATA_EXTEND / DATA_OVERWRITE | 数据写入/修改 | 文件内容变更 |
| RENAME_NEW_NAME | 重命名(新名) | 文件伪装 |
| RENAME_OLD_NAME | 重命名(旧名) | 原始文件名 |
| SECURITY_CHANGE | 权限变更 | 提权/权限修改 |
| CLOSE | 文件关闭 | 操作完成标记 |
6.3 使用 MFTECmd 分析 USN Journal
1 | # 提取 $UsnJrnl:$J(需要原始磁盘访问) |
1 | # 追踪恶意文件的完整生命周期 |
1 | # 查找特定时间窗口内的文件创建事件 |
6.4 USN Journal 的限制
循环覆盖(默认 32MB-64MB)、仅记录文件名和操作类型(不含内容/操作者)、覆盖快需尽早采集
7. LNK 文件(快捷方式)分析
7.1 LNK 文件基本原理
什么是 LNK 文件:
Windows 快捷方式文件(Shell Link Binary File Format)
当用户通过 Explorer 打开文件时,系统自动在 Recent 目录创建 LNK 文件
LNK 文件记录了目标文件的丰富元数据
自动生成 LNK 的位置:
C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Recent\ — 最近访问的文件
C:\Users\<user>\AppData\Roaming\Microsoft\Office\Recent\ — Office 最近文件
C:\Users\<user>\Desktop\ — 用户自建的快捷方式
7.2 LNK 文件包含的关键信息
| 字段 | 含义 | IR 价值 |
|---|---|---|
| TargetPath | 目标文件完整路径 | 确认用户打开了什么文件 |
| TargetCreated | 目标文件创建时间 | 时间线关联 |
| TargetModified | 目标文件修改时间 | 时间线关联 |
| TargetAccessed | 目标文件访问时间 | 时间线关联 |
| FileSize | 目标文件大小 | 辅助识别 |
| VolumeSerialNumber | 卷序列号 | 识别来源设备(USB 取证) |
| VolumeName | 卷名称 | 识别来源设备 |
| DriveType | 驱动器类型 | 本地/网络/可移动存储 |
| NetworkSharePath | 网络共享路径 | 发现网络活动 |
| MacAddress | 网络适配器 MAC 地址 | 设备识别 |
| MachineID/NetBIOS | 机器名 | 来源主机识别 |
核心 IR 价值:
证明用户曾经打开过某个文件(即使文件已删除或共享已断开)
LNK 中的 网络路径 可暴露内网拓扑(UNC 路径、共享名)
LNK 中的 卷序列号 可追踪 USB 设备
LNK 中的 MAC 地址 可辅助设备归属认定
7.3 使用 LECmd 分析 LNK 文件
1 | # LECmd (Eric Zimmerman 工具) |
1 | # 分析 LNK CSV,查找可疑网络路径 |
7.4 LNK 文件作为攻击向量
LNK 文件不仅是取证制品,也是常见的攻击向量(钓鱼 LNK)
检测恶意 LNK:
1 | # 检查桌面和下载目录中的可疑 LNK |
8. Jump Lists 分析
8.1 Jump Lists 基本原理
什么是 Jump Lists:
Windows 7 引入的功能,记录应用程序最近打开的文件和常用操作
右键点击任务栏图标时显示的”最近文件”列表就来自 Jump Lists
两种类型:
AutomaticDestinations:系统自动记录的文件访问历史
位置:C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\
文件名格式:<AppID>.automaticDestinations-ms
CustomDestinations:应用程序自定义的”固定”项和常用操作
位置:C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations\
文件名格式:<AppID>.customDestinations-ms
AppID 示例:
| AppID | 应用程序 |
|---|---|
| 1b4dd67f29cb1962 | Explorer (文件浏览器) |
| 5f7b5f1e01b83767 | cmd.exe |
| f01b4d95cf55d32a | Windows Explorer Pinned |
| 9b9cdc69c1c24e2b | Notepad |
| 918e0ecb43d17e23 | Notepad++ |
| be71009ff8bb02a2 | Calculator |
| 12dc1ea8e34b5a6 | Paint |
8.2 使用 JLECmd 分析 Jump Lists
1 | # JLECmd (Eric Zimmerman 工具) |
1 | # 分析 Jump Lists CSV |
8.3 Jump Lists 的 IR 价值
精确追踪每个应用打开了哪些文件、可能包含 UNC 路径、文件删除后仍保留记录、记录交互次数和时间戳
9. Shellbags 分析
9.1 Shellbags 基本原理
什么是 Shellbags:
Windows Explorer 用于记住用户浏览文件夹时的视图设置(窗口大小、排序方式、图标布局等)
副作用:记录了用户曾经浏览过的所有文件夹路径
即使文件夹已被删除,Shellbags 中的记录仍然保留
存储位置:
NTUSER.DAT:Software\Microsoft\Windows\Shell\BagMRU 和 \Bags
UsrClass.dat:Local Settings\Software\Microsoft\Windows\Shell\BagMRU 和 \Bags
UsrClass.dat 位置:C:\Users\<user>\AppData\Local\Microsoft\Windows\UsrClass.dat
记录范围:本地文件夹、网络共享(\server\share)、USB 设备、ZIP 包内部浏览、控制面板项、已删除的文件夹
9.2 使用 ShellBags Explorer (SBECmd) 分析
1 | # SBECmd (Eric Zimmerman 命令行版本) |
1 | # 分析 Shellbags CSV,查找可疑目录浏览记录 |
9.3 Shellbags 的 IR 价值
证明用户浏览过特定目录(即使已删除)、发现网络共享路径、追踪 USB 设备浏览、辅助数据窃取调查
注意:Shellbags 只证明”浏览”了目录,不能证明”访问/修改”了其中的文件
10. UserAssist 分析
10.1 UserAssist 基本原理
什么是 UserAssist:
记录用户通过 Windows Explorer GUI 执行的程序
双击桌面快捷方式、开始菜单启动程序等操作都会被记录
不记录命令行启动的程序(cmd/powershell 直接运行不记录)
存储位置:NTUSER.DAT\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\
编码方式:键名使用 ROT13 编码(简单字母替换,A↔N, B↔O…)
例如:HRZR_PGYFRFFVBA 解码为 UEME_CTLSESSION
两个重要 GUID:
{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA} — 可执行文件执行记录
{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F} — 快捷方式执行记录
10.2 UserAssist 包含的信息
| 字段 | 含义 |
|---|---|
| 程序路径 (ROT13 编码) | 被执行的程序完整路径 |
| Run Count | 执行次数 |
| Focus Count | 获得焦点次数 |
| Focus Time | 获得焦点总时长(毫秒) |
| Last Execution Time | 最后执行时间(FILETIME 格式) |
10.3 使用工具解析 UserAssist
1 | # 使用 RECmd 批量解析 UserAssist(自动 ROT13 解码) |
10.4 UserAssist 的 IR 价值与局限
价值:
追踪通过 GUI 执行的程序(双击、开始菜单、快捷方式)
提供精确的执行次数和时间
Focus Time 可反映程序的使用时长
局限:
不记录命令行启动的程序
不记录服务/计划任务启动的程序
可被攻击者清除(删除注册表键值即可)
11. SRUM (System Resource Usage Monitor) 分析
11.1 SRUM 基本原理
什么是 SRUM:
Windows 8+ 引入的系统资源使用监控机制
记录每个应用程序的 CPU、内存、网络、磁盘使用量
数据以 1 小时为粒度汇总
存储在 ESE(Extensible Storage Engine)数据库中
位置:C:\Windows\System32\sru\SRUDB.dat
Linux 对照:Linux 没有原生等价物;最接近的是 systemd 的 cgroup 统计或 process accounting
11.2 SRUM 包含的关键表
| 表名 | 内容 | IR 价值 |
|---|---|---|
| {D10CA2FE-6FCF-4F6D-848E-B2E99266FA89} | Application Resource Usage | 程序的 CPU/内存/磁盘使用 |
| {973F5D5C-1D90-4944-BE8E-24B94231A174} | Network Data Usage | 每个程序的网络流量(发送/接收字节数) |
| {DD6636C4-8929-4683-974E-22C046A43763} | Network Connectivity Usage | 网络连接配置文件数据 |
| {FEE4E14F-02A9-4550-B5CE-5FA2DA202E37} | Energy Usage (Push Notifications) | 推送通知相关能量使用 |
Network Data Usage 字段详情:
| 字段 | 含义 |
|---|---|
| AppId | 程序标识符 |
| UserId (SID) | 运行程序的用户 SID |
| InterfaceLuid | 网络接口标识 |
| BytesSent | 发送的字节数 |
| BytesRecvd | 接收的字节数 |
| Timestamp | 记录时间(1 小时粒度) |
11.3 使用 SrumECmd 分析 SRUM
1 | # SrumECmd (Eric Zimmerman 工具) |
1 | # 分析 SRUM 网络使用数据 |
11.4 SRUM 的 IR 核心价值
追踪已删除程序的网络流量:即使恶意程序被删除,SRUM 仍记录了其网络使用量
数据窃取检测:异常的大量数据发送(BytesSent)
时间段分析:确认程序在什么时间段活跃
用户归属:通过 SID 确认哪个用户运行了该程序
保留时间长:SRUM 数据最长可保留约 30 天
结合 Prefetch:SRUM 中出现但 Prefetch 中没有 .pf 文件的程序值得关注(可能 .pf 被清除)
12. BAM/DAM 分析
12.1 BAM/DAM 基本原理
什么是 BAM/DAM:
BAM = Background Activity Moderator(后台活动监控器)
DAM = Desktop Activity Moderator(桌面活动监控器)
Windows 10 1709 (Fall Creators Update) 引入
记录在系统上执行的程序的完整路径和最后执行时间
存储位置:
SYSTEM\CurrentControlSet\Services\bam\State\UserSettings\<SID> (Windows 10 1809+)
SYSTEM\CurrentControlSet\Services\bam\UserSettings\<SID> (Windows 10 1709-1803)
DAM 路径类似,将 bam 替换为 dam
12.2 BAM/DAM 包含的信息
每个键值的结构:
键名:程序的完整路径(如 \Device\HarddiskVolume3\Users\victim\Desktop\malware.exe)
键值:二进制数据,包含最后执行时间(FILETIME 格式,前 8 字节)
特点:
使用 NT 设备路径格式(\Device\HarddiskVolumeX\...)而非盘符路径
按用户 SID 分组记录
数据量有限,旧记录会被覆盖
12.3 解析 BAM/DAM 数据
1 | # PowerShell 直接查询 BAM(活体取证) |
12.4 BAM/DAM 的 IR 价值
简单直接的程序执行证据:路径 + 最后执行时间
用户归属明确:按 SID 分组,可精确到用户
补充 Prefetch:当 Prefetch 被禁用或清除时,BAM 可作为替代证据
局限:
仅 Windows 10 1709+ 可用
仅记录最后执行时间(无执行次数)
数据量有限,不适合长时间回溯
重启后可能丢失部分未写入注册表的数据
13. 其他重要取证制品
13.1 $LogFile (NTFS Transaction Log)
位置:NTFS 卷根目录下的 $LogFile
功能:NTFS 事务日志,记录文件系统元数据变更操作(用于崩溃恢复)
IR 价值:
记录了 MFT 记录的变更详情
可用于恢复短时间内被覆盖的 MFT 数据
通常只覆盖最近数小时到数天的变更
分析工具:LogFileParser、NTFS Log Tracker
13.2 $I30 (NTFS Index Attributes)
功能:NTFS 目录索引,记录目录中文件/子目录的信息
IR 价值:
即使文件从目录中删除,$I30 索引的 Slack Space 中可能残留已删除文件的记录
可恢复文件名、时间戳、文件大小等信息
分析工具:INDXParse、MFTECmd
1 | # 使用 MFTECmd 解析 $I30(需要先使用 RawCopy 提取) |
13.3 Thumbcache (缩略图缓存)
位置:C:\Users\<user>\AppData\Local\Microsoft\Windows\Explorer\
文件:thumbcache_32.db、thumbcache_96.db、thumbcache_256.db、thumbcache_1024.db
IR 价值:
即使图片文件被删除,缩略图缓存中可能仍保留其缩略图
可证明用户曾查看过特定图片
对敏感数据泄露调查有价值
分析工具:Thumbcache Viewer、Thumbs Viewer
13.4 TypedPaths 和 TypedURLs
TypedPaths:
位置:NTUSER.DAT\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths
记录用户在 Explorer 地址栏中手动输入的路径
IR 价值:证明用户有意访问了特定路径
TypedURLs:
位置:NTUSER.DAT\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedURLs
记录用户在 IE/旧版 Edge 地址栏中手动输入的 URL
IR 价值:追踪用户手动访问的网站
1 | # 查询 TypedPaths |
13.5 RDP Bitmap Cache
位置:C:\Users\<user>\AppData\Local\Microsoft\Terminal Server Client\Cache\
IR 价值:包含 RDP 会话的屏幕位图碎片,可部分还原远程桌面内容
分析工具:BMC-Tools (ANSSI)
13.6 BITS Jobs
位置:C:\ProgramData\Microsoft\Network\Downloader\qmgr0.dat / qmgr1.dat
IR 价值:攻击者可滥用 BITS 下载恶意文件或持久化,记录下载 URL 和本地路径
1 | # 查看当前 BITS Jobs |
14. Eric Zimmerman 工具链完整指南
14.1 工具集总览
Eric Zimmerman (EZ) 开发了一整套免费的 Windows 取证分析工具:
| 工具 | 用途 | 解析的制品 |
|---|---|---|
| PECmd | Prefetch 解析 | .pf 文件 |
| AmcacheParser | Amcache 解析 | Amcache.hve |
| AppCompatCacheParser | ShimCache 解析 | SYSTEM Hive |
| MFTECmd | MFT/USN/J 解析 | $MFT, $UsnJrnl:$J, $I30, $LogFile |
| LECmd | LNK 文件解析 | .lnk 文件 |
| JLECmd | Jump Lists 解析 | .automaticDestinations-ms |
| SBECmd | Shellbags 解析 | UsrClass.dat, NTUSER.DAT |
| RECmd | 注册表批量解析 | 各种 Registry Hive |
| RegistryExplorer | 注册表 GUI 浏览 | 各种 Registry Hive |
| ShellBagsExplorer | Shellbags GUI | UsrClass.dat |
| Timeline Explorer | CSV/TSV 查看器 | 所有 CSV 输出 |
| SrumECmd | SRUM 解析 | SRUDB.dat |
| EvtxECmd | 事件日志解析 | .evtx 文件 |
| WxTCmd | Windows 10 Timeline 解析 | ActivitiesCache.db |
| RBCmd | 回收站解析 | $I/$R 文件 |
| bstrings | 字符串提取 | 任意二进制文件 |
14.2 批量下载与安装
1 | # 官方下载:https://ericzimmerman.github.io/#!index.md |
14.3 统一输出与 Timeline Explorer
所有 EZ 工具都支持 CSV 输出格式,可使用 Timeline Explorer 统一查看:
1 | # 将所有取证制品解析到同一目录,使用 Timeline Explorer 统一查看 |
15. KAPE 自动化采集与分析
15.1 KAPE 基本原理
什么是 KAPE:
Kroll Artifact Parser and Extractor
由 Eric Zimmerman 开发的自动化取证制品采集与分析工具
分为两个阶段:Target(采集)和 Module(分析)
核心概念:
Target:定义要采集哪些文件(如 Prefetch 目录、注册表 Hive 等)
Module:定义用什么工具分析采集到的文件(如用 PECmd 解析 .pf 文件)
Compound Target/Module:组合多个 Target/Module 的预设方案
15.2 KAPE 使用示例
1 | # 采集所有常见取证制品(Target 阶段)— 包含 Prefetch/注册表/evtx/Amcache/SRUM/LNK/MFT 等 |
15.3 KAPE 与 Velociraptor 的区别
| 特性 | KAPE | Velociraptor |
|---|---|---|
| 运行方式 | 命令行/GUI 工具 | C/S 架构(服务端+Agent) |
| 部署 | 单机运行或远程 UNC | 需要在端点部署 Agent |
| 适用场景 | 事后取证、单机/少量主机 | 大规模实时检测和取证 |
| 自定义能力 | YAML 配置的 Target/Module | VQL(Velociraptor Query Language) |
| 实时监控 | 不支持 | 支持 |
| 详见 | — | Windows应急响应/36-KAPE与Velociraptor |
16. 取证制品关联分析方法论
16.1 多制品交叉验证原则
单一制品不构成结论——必须通过多种制品交叉验证:
| 分析目标 | 主要制品 | 辅助制品 | 验证制品 |
|---|---|---|---|
| 程序是否执行 | Prefetch (.pf 存在) | Amcache (SHA1+路径) | ShimCache, BAM/DAM, UserAssist |
| 程序执行时间 | Prefetch (LastRun) | BAM/DAM (最后时间) | Event Log (进程创建), SRUM |
| 用户打开了什么文件 | LNK 文件 | Jump Lists | Shellbags, Recent Files |
| 文件何时创建 | $MFT ($FN Created) | USN Journal (FILE_CREATE) | Prefetch (文件首次出现在引用列表) |
| 文件是否被篡改时间 | $MFT ($SI vs $FN) | $UsnJrnl 记录 | $LogFile |
| 程序网络活动 | SRUM (BytesSent/Recv) | Event Log (网络连接) | Firewall Log |
16.2 时间线分析方法 (Timeline Analysis)
时间线分析是 DFIR 的核心方法:
步骤 1:确定事件时间窗口
从告警、安全设备日志、用户报告中确定可疑时间范围
宁可宽不可窄——初始窗口建议扩大到告警前后各 24-48 小时
步骤 2:采集并解析所有取证制品
使用 KAPE 一键采集 + EZ Tools 批量解析
步骤 3:构建超级时间线 (Super Timeline)
1 | # 使用 log2timeline / plaso 构建超级时间线 |
步骤 4:围绕关键时间点前后分析
关注事件时间窗口内的:
新程序执行(Prefetch 新建)
文件创建/删除(USN Journal)
网络活动(SRUM)
用户操作(LNK、Jump Lists、Shellbags)
注册表变更(相关键的 LastWriteTime)
步骤 5:形成攻击叙事 (Attack Narrative)
将所有证据按时间顺序串联,形成完整的攻击故事线
16.3 实战示例:还原一次钓鱼攻击
以下演示如何使用多种取证制品还原一次钓鱼邮件攻击:
场景:用户收到钓鱼邮件,打开附件后系统被植入后门
1 | === 攻击时间线还原 === |
17. 取证制品完整速查表
17.1 按位置分类
文件系统制品:
| 位置 | 制品 | 工具 |
|---|---|---|
C:\Windows\Prefetch\ |
Prefetch | PECmd |
C:\Windows\appcompat\Programs\Amcache.hve |
Amcache | AmcacheParser |
C:\Windows\System32\sru\SRUDB.dat |
SRUM | SrumECmd |
$MFT (卷根目录) |
Master File Table | MFTECmd |
$Extend\$UsnJrnl:$J |
USN Journal | MFTECmd |
$LogFile (卷根目录) |
NTFS Transaction Log | LogFileParser |
C:\Users\<user>\AppData\Roaming\Microsoft\Windows\Recent\ |
LNK 文件 | LECmd |
C:\Users\<user>\...\AutomaticDestinations\ |
Jump Lists | JLECmd |
C:\Users\<user>\...\CustomDestinations\ |
Jump Lists | JLECmd |
C:\Users\<user>\AppData\Local\Microsoft\Windows\Explorer\ |
Thumbcache | Thumbcache Viewer |
C:\$Recycle.Bin\<SID>\ |
回收站 | RBCmd |
注册表制品:
| 注册表路径 | 制品 | 所在 Hive |
|---|---|---|
SYSTEM\...\AppCompatCache |
ShimCache | SYSTEM |
SYSTEM\...\bam\State\UserSettings\<SID> |
BAM/DAM | SYSTEM |
NTUSER.DAT\...\UserAssist\ |
UserAssist | NTUSER.DAT |
NTUSER.DAT\...\TypedPaths |
TypedPaths | NTUSER.DAT |
NTUSER.DAT\...\TypedURLs |
TypedURLs | NTUSER.DAT |
UsrClass.dat\...\Shell\BagMRU |
Shellbags | UsrClass.dat |
UsrClass.dat\...\Shell\Bags |
Shellbags | UsrClass.dat |
17.2 按分析目标速查
“这个程序是否执行过?”
Prefetch — 是否有对应 .pf 文件?
Amcache — 是否有记录?SHA1 是什么?
ShimCache — 是否有记录?执行标志?
BAM/DAM — 是否有记录?最后执行时间?
UserAssist — 是否有记录?(仅 GUI 执行)
SRUM — 是否有资源使用记录?
“这个文件何时出现在系统上?”
$MFT — $FN Created 时间
USN Journal — FILE_CREATE 记录
Prefetch — .pf 文件 CreationTime(程序首次执行)
Amcache — FileKeyLastWriteTimestamp
“用户打开/访问了什么文件?”
LNK 文件 — Recent 目录中的快捷方式
Jump Lists — 应用程序最近文件列表
Shellbags — 浏览过的目录
TypedPaths — Explorer 地址栏输入的路径
UserAssist — 通过 GUI 打开的程序
“文件是否被篡改时间戳?”
$MFT — $SI vs $FN 时间戳对比
USN Journal — 验证文件实际创建时间
Amcache — LinkDate(PE 编译时间)vs 文件时间
“这个程序使用了多少网络流量?”
SRUM — BytesSent / BytesRecvd
Event Log — Sysmon Event ID 3 (Network Connection)
Firewall Log — Windows Firewall 连接日志
18. 与 Linux 取证的对比总结
18.1 核心差异对照
| 维度 | Windows | Linux |
|---|---|---|
| 时间戳系统 | MACE 双组($SI + $FN) | MAC + crtime(ext4) |
| Timestomping 检测 | $SI vs $FN 对比 | mtime vs ctime 对比(touch 无法改 ctime) |
| 程序执行记录 | Prefetch + Amcache + ShimCache + BAM + UserAssist + SRUM | bash_history + process accounting(有限) |
| 文件变更日志 | USN Journal(详细的文件操作记录) | auditd 日志(需要预先配置) |
| 用户活动追踪 | LNK + Jump Lists + Shellbags + TypedPaths | 无直接等价物(依赖 shell history) |
| 取证工具 | Eric Zimmerman 套件 + KAPE | Sleuth Kit + Autopsy + Volatility |
| 哈希获取 | Amcache 自动记录 SHA1 | 需要手动计算(sha256sum) |
关键启示:
Windows 取证制品种类远多于 Linux,但也意味着更多的噪音需要过滤
Linux 取证更依赖于”事先配置好日志”(如 auditd、syslog),Windows 很多制品是”默认就有”
Windows 取证更适合”事后分析”——即使没有部署增强日志,默认制品也非常丰富
Linux 取证更适合”实时监控”——如果没有事先配置,事后可分析的制品相对有限
18.2 跨平台综合调查
在混合环境中,同一攻击可能跨 Windows 和 Linux:钓鱼邮件 → Windows 被控 → 横向到 Linux
Windows 端:Prefetch/Amcache 证明攻击工具执行,SRUM 记录 C2 流量,Shellbags/LNK 暴露内网浏览
Linux 端(参考 06-文件系统取证):SSH 日志追踪横向移动,bash_history 记录命令,auditd 追踪文件投放
19. 实战练习
练习 1:Prefetch 分析
目标:分析 Prefetch 目录,识别可疑程序执行
步骤:使用 PECmd 批量解析 → 搜索可疑程序名 → 检查引用文件列表 → 建立时间线
1 | # 练习脚本 |
练习 2:多制品关联分析
目标:综合使用 Prefetch + Amcache + USN Journal + SRUM 还原攻击时间线
步骤:KAPE 采集所有制品 → EZ Tools 批量解析 → Timeline Explorer 加载 CSV → 围绕时间窗口分析 → 编写攻击叙事
1 | # 综合练习脚本 |
练习 3:与 Linux 取证对比
参考:06-文件系统取证
| 场景 | Windows 方法 | Linux 方法 |
|---|---|---|
| 证明程序执行 | Prefetch + Amcache + BAM | bash_history + process accounting |
| 获取恶意文件哈希 | Amcache 自动记录 SHA1 | sha256sum /path/to/file |
| 检测时间戳篡改 | MFT $SI vs $FN 对比 | stat mtime vs ctime 对比 |
| 追踪文件删除 | USN Journal FILE_DELETE | auditd 日志(需预先配置) |
| 追踪用户文件访问 | LNK + Jump Lists + Shellbags | 无直接等价物 |
| 程序网络流量 | SRUM (自动) | nethogs/iftop (需实时) |
20. 总结与下一步
20.1 本章核心要点回顾
Prefetch:证明程序执行,提供执行次数和时间线,注意 Server 版默认不启用
Amcache:提供 SHA1 哈希和完整路径,即使文件被删也能查 VT
ShimCache:辅助验证制品,数据在重启后才写入注册表
MFT:双组时间戳($SI vs $FN)是检测 timestomping 的关键
USN Journal:追踪文件完整生命周期(创建→修改→重命名→删除)
LNK / Jump Lists:证明用户打开过特定文件,暴露网络路径
Shellbags:证明用户浏览过特定目录,即使目录已删除
UserAssist:追踪 GUI 程序执行,ROT13 编码
SRUM:追踪程序资源使用(CPU/内存/网络),数据保留约 30 天
BAM/DAM:Windows 10 1709+ 的简单程序执行证据
20.2 记忆口诀
程序执行五件套:P-A-S-B-U
Prefetch — 有 .pf 就执行过
Amcache — SHA1 查 VT
ShimCache — 重启后才写入
BAM/DAM — 路径+时间
UserAssist — GUI 才记录
文件系统三兄弟:M-U-L
MFT — 双组时间戳抓 timestomping
USN Journal — 文件生命周期
$LogFile — MFT 变更日志
用户活动四件套:L-J-S-T
LNK — 打开了什么文件
Jump Lists — 哪个应用打开的
Shellbags — 浏览了什么目录
Typed Paths/URLs — 手动输入了什么
20.3 下一步学习
继续学习 → 05-账户安全排查
深入文件取证 → Windows应急响应/07-文件取证排查
工具实战 → Windows应急响应/36-KAPE与Velociraptor
事件日志关联 → 03-事件日志分析
返回总索引 → Windows应急响应
| 上一章 | 目录 | 下一章 |
|---|---|---|
| 03-事件日志分析 | Windows应急响应 | 05-账户安全排查 |