1. 1. 04-取证制品分析 (Forensic Artifacts Analysis)
    1. 1.1. 1. 取证制品概述与分类
      1. 1.1.1. 1.1 为什么 Windows 取证制品如此重要?
      2. 1.1.2. 1.2 取证制品分类体系
      3. 1.1.3. 1.3 取证制品的时间覆盖范围
    2. 1.2. 2. Prefetch 文件分析
      1. 1.2.1. 2.1 Prefetch 基本原理
      2. 1.2.2. 2.2 Prefetch 包含的关键信息
      3. 1.2.3. 2.3 使用 PECmd 分析 Prefetch
      4. 1.2.4. 2.4 Prefetch 异常指标 (IOC)
      5. 1.2.5. 2.5 Prefetch 限制与注意事项
    3. 1.3. 3. Amcache.hve 分析
      1. 1.3.1. 3.1 Amcache 基本原理
      2. 1.3.2. 3.2 Amcache 包含的关键信息
      3. 1.3.3. 3.3 使用 AmcacheParser 分析
      4. 1.3.4. 3.4 Amcache 与 VirusTotal 联动
      5. 1.3.5. 3.5 Amcache 注意事项
    4. 1.4. 4. ShimCache / AppCompatCache 分析
      1. 1.4.1. 4.1 ShimCache 基本原理
      2. 1.4.2. 4.2 ShimCache 包含的信息
      3. 1.4.3. 4.3 使用 AppCompatCacheParser 分析
      4. 1.4.4. 4.4 ShimCache 特殊注意事项
    5. 1.5. 5. MFT ($MFT) 深度分析
      1. 1.5.1. 5.1 NTFS Master File Table 基础
      2. 1.5.2. 5.2 MFT 记录结构
      3. 1.5.3. 5.3 MACE 时间戳体系
      4. 1.5.4. 5.4 Timestomping 检测
      5. 1.5.5. 5.5 MFT 分析实战要点
    6. 1.6. 6. USN Journal ($UsnJrnl:$J) 分析
      1. 1.6.1. 6.1 USN Journal 基本原理
      2. 1.6.2. 6.2 USN Journal 记录内容
      3. 1.6.3. 6.3 使用 MFTECmd 分析 USN Journal
      4. 1.6.4. 6.4 USN Journal 的限制
    7. 1.7. 7. LNK 文件(快捷方式)分析
      1. 1.7.1. 7.1 LNK 文件基本原理
      2. 1.7.2. 7.2 LNK 文件包含的关键信息
      3. 1.7.3. 7.3 使用 LECmd 分析 LNK 文件
      4. 1.7.4. 7.4 LNK 文件作为攻击向量
    8. 1.8. 8. Jump Lists 分析
      1. 1.8.1. 8.1 Jump Lists 基本原理
      2. 1.8.2. 8.2 使用 JLECmd 分析 Jump Lists
      3. 1.8.3. 8.3 Jump Lists 的 IR 价值
    9. 1.9. 9. Shellbags 分析
      1. 1.9.1. 9.1 Shellbags 基本原理
      2. 1.9.2. 9.2 使用 ShellBags Explorer (SBECmd) 分析
      3. 1.9.3. 9.3 Shellbags 的 IR 价值
    10. 1.10. 10. UserAssist 分析
      1. 1.10.1. 10.1 UserAssist 基本原理
      2. 1.10.2. 10.2 UserAssist 包含的信息
      3. 1.10.3. 10.3 使用工具解析 UserAssist
      4. 1.10.4. 10.4 UserAssist 的 IR 价值与局限
    11. 1.11. 11. SRUM (System Resource Usage Monitor) 分析
      1. 1.11.1. 11.1 SRUM 基本原理
      2. 1.11.2. 11.2 SRUM 包含的关键表
      3. 1.11.3. 11.3 使用 SrumECmd 分析 SRUM
      4. 1.11.4. 11.4 SRUM 的 IR 核心价值
    12. 1.12. 12. BAM/DAM 分析
      1. 1.12.1. 12.1 BAM/DAM 基本原理
      2. 1.12.2. 12.2 BAM/DAM 包含的信息
      3. 1.12.3. 12.3 解析 BAM/DAM 数据
      4. 1.12.4. 12.4 BAM/DAM 的 IR 价值
    13. 1.13. 13. 其他重要取证制品
      1. 1.13.1. 13.1 $LogFile (NTFS Transaction Log)
      2. 1.13.2. 13.2 $I30 (NTFS Index Attributes)
      3. 1.13.3. 13.3 Thumbcache (缩略图缓存)
      4. 1.13.4. 13.4 TypedPaths 和 TypedURLs
      5. 1.13.5. 13.5 RDP Bitmap Cache
      6. 1.13.6. 13.6 BITS Jobs
    14. 1.14. 14. Eric Zimmerman 工具链完整指南
      1. 1.14.1. 14.1 工具集总览
      2. 1.14.2. 14.2 批量下载与安装
      3. 1.14.3. 14.3 统一输出与 Timeline Explorer
    15. 1.15. 15. KAPE 自动化采集与分析
      1. 1.15.1. 15.1 KAPE 基本原理
      2. 1.15.2. 15.2 KAPE 使用示例
      3. 1.15.3. 15.3 KAPE 与 Velociraptor 的区别
    16. 1.16. 16. 取证制品关联分析方法论
      1. 1.16.1. 16.1 多制品交叉验证原则
      2. 1.16.2. 16.2 时间线分析方法 (Timeline Analysis)
      3. 1.16.3. 16.3 实战示例:还原一次钓鱼攻击
    17. 1.17. 17. 取证制品完整速查表
      1. 1.17.1. 17.1 按位置分类
      2. 1.17.2. 17.2 按分析目标速查
    18. 1.18. 18. 与 Linux 取证的对比总结
      1. 1.18.1. 18.1 核心差异对照
      2. 1.18.2. 18.2 跨平台综合调查
    19. 1.19. 19. 实战练习
      1. 1.19.1. 练习 1:Prefetch 分析
      2. 1.19.2. 练习 2:多制品关联分析
      3. 1.19.3. 练习 3:与 Linux 取证对比
    20. 1.20. 20. 总结与下一步
      1. 1.20.1. 20.1 本章核心要点回顾
      2. 1.20.2. 20.2 记忆口诀
      3. 1.20.3. 20.3 下一步学习

Windows应急响应 - 04 取证制品分析

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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载 Eric Zimmerman 工具集
# https://ericzimmerman.github.io/#!index.md

# 解析单个 Prefetch 文件
PECmd.exe -f "C:\Windows\Prefetch\CMD.EXE-4A81B364.pf"

# 批量解析整个 Prefetch 目录,输出 CSV
PECmd.exe -d "C:\Windows\Prefetch" --csv "C:\IR\output" --csvf prefetch_results.csv

# 解析并显示详细信息(含引用文件列表)
PECmd.exe -f "C:\Windows\Prefetch\POWERSHELL.EXE-022A1004.pf" -k "keyword"

# 指定时间范围过滤
PECmd.exe -d "C:\Windows\Prefetch" --csv "C:\IR\output" --csvf prefetch.csv --dt "2026-03-01"

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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 快速查找可疑 Prefetch 文件
Get-ChildItem "C:\Windows\Prefetch" -Filter "*.pf" |
Where-Object { $_.Name -match "PSEXE|MIMIKATZ|COBALT|BEACON|WMIC|CERTUTIL|BITSADMIN|MSHTA|REGSVR32" } |
Select-Object Name, CreationTime, LastWriteTime | Format-Table -AutoSize

# 按最近修改时间排序查找最近执行的程序
Get-ChildItem "C:\Windows\Prefetch" -Filter "*.pf" |
Sort-Object LastWriteTime -Descending | Select-Object -First 20 |
Select-Object Name, LastWriteTime | Format-Table -AutoSize

# 查找最近 24 小时内创建的 Prefetch(首次执行的程序)
Get-ChildItem "C:\Windows\Prefetch" -Filter "*.pf" |
Where-Object { $_.CreationTime -gt (Get-Date).AddHours(-24) } |
Select-Object Name, CreationTime | Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
# AmcacheParser (Eric Zimmerman 工具)
# 解析 Amcache.hve 并输出 CSV
AmcacheParser.exe -f "C:\Windows\appcompat\Programs\Amcache.hve" --csv "C:\IR\output" --csvf amcache.csv

# 包含已删除条目的解析
AmcacheParser.exe -f "C:\Windows\appcompat\Programs\Amcache.hve" --csv "C:\IR\output" --csvf amcache.csv -i

# 离线分析(从取证镜像中提取的 Amcache.hve)
AmcacheParser.exe -f "E:\Evidence\Amcache.hve" --csv "C:\IR\output" --csvf amcache_offline.csv

分析输出 CSV 的关键步骤

  1. FileKeyLastWriteTimestamp 排序,找到事件时间窗口内的记录

  2. 检查 SHA1 字段,批量提交到 VirusTotal

  3. 检查 LowerCaseLongPath,关注可疑路径(Temp、Public、Downloads 等)

  4. 检查 Publisher 字段为空或异常的记录

  5. 检查 IsPeFile 为 True 但 Publisher 为空的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 PowerShell 从 Amcache CSV 中快速筛选可疑记录
Import-Csv "C:\IR\output\amcache.csv" |
Where-Object {
$_.LowerCaseLongPath -match "\\temp\\|\\public\\|\\downloads\\|\\appdata\\" -and
$_.Publisher -eq ""
} |
Select-Object Name, LowerCaseLongPath, SHA1, FileKeyLastWriteTimestamp |
Format-Table -AutoSize

# 提取所有 SHA1 哈希用于批量 VT 查询
Import-Csv "C:\IR\output\amcache.csv" |
Where-Object { $_.SHA1 -ne "" } |
Select-Object -ExpandProperty SHA1 -Unique |
Out-File "C:\IR\output\amcache_hashes.txt"

3.4 Amcache 与 VirusTotal 联动

1
2
3
4
5
6
7
8
9
10
11
12
# 使用 VT API 批量查询 Amcache 提取的哈希
$apiKey = "YOUR_VT_API_KEY"
$hashes = Get-Content "C:\IR\output\amcache_hashes.txt"
foreach ($hash in $hashes) {
$uri = "https://www.virustotal.com/api/v3/files/$hash"
$response = Invoke-RestMethod -Uri $uri -Headers @{"x-apikey" = $apiKey}
$detected = $response.data.attributes.last_analysis_stats.malicious
if ($detected -gt 0) {
Write-Host "[!] MALICIOUS: $hash - $detected engines" -ForegroundColor Red
}
Start-Sleep -Seconds 16 # VT 免费 API 限制:4 次/分钟
}

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
2
3
4
5
6
7
8
9
# AppCompatCacheParser (Eric Zimmerman 工具)
# 解析当前系统的 ShimCache
AppCompatCacheParser.exe --csv "C:\IR\output" --csvf shimcache.csv

# 解析离线 SYSTEM Hive
AppCompatCacheParser.exe -f "E:\Evidence\SYSTEM" --csv "C:\IR\output" --csvf shimcache.csv

# 从所有控制集解析(包含历史数据)
AppCompatCacheParser.exe -f "E:\Evidence\SYSTEM" --csv "C:\IR\output" --csvf shimcache.csv -t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 分析 ShimCache CSV 中的可疑条目
Import-Csv "C:\IR\output\shimcache.csv" |
Where-Object {
$_.Path -match "\\Temp\\|\\Public\\|\\Downloads\\|\\ProgramData\\" -or
$_.Path -match "\.tmp$|\.dat$|\.bin$"
} |
Select-Object CacheEntryPosition, Path, LastModifiedTimeUTC |
Format-Table -AutoSize

# 查找来自非标准路径的可执行文件
Import-Csv "C:\IR\output\shimcache.csv" |
Where-Object {
$_.Path -notmatch "^C:\\Windows\\|^C:\\Program Files" -and
$_.Path -match "\.exe$|\.dll$|\.scr$|\.bat$|\.ps1$"
} |
Select-Object CacheEntryPosition, Path, LastModifiedTimeUTC |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
10
11
12
# 使用 MFTECmd 解析 $MFT 并检测 timestomping
# 首先提取 $MFT(需要管理员权限+原始磁盘访问)

# 方法1:使用 RawCopy 提取
RawCopy.exe /FileNamePath:C:0 /OutputPath:C:\IR\evidence
# 提取 MFT(MFT Entry 0 = $MFT 文件本身)

# 方法2:使用 KAPE
# kape.exe --tsource C: --tdest C:\IR\evidence --target $MFT

# 使用 MFTECmd 解析
MFTECmd.exe -f "C:\IR\evidence\$MFT" --csv "C:\IR\output" --csvf mft_parsed.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 从解析后的 MFT CSV 中检测 timestomping
Import-Csv "C:\IR\output\mft_parsed.csv" |
Where-Object {
# $SI Created 远早于 $FN Created(差异超过 24 小时)
$siCreated = [datetime]$_.Created0x10
$fnCreated = [datetime]$_.Created0x30
($fnCreated - $siCreated).TotalHours -gt 24
} |
Select-Object ParentPath, FileName, Created0x10, Created0x30 |
Format-Table -AutoSize

# 检测精度为整秒的时间戳(timestomping 常见特征)
Import-Csv "C:\IR\output\mft_parsed.csv" |
Where-Object {
$_.Created0x10 -match "\.0000000$" -and
$_.FileName -match "\.exe$|\.dll$|\.sys$"
} |
Select-Object ParentPath, FileName, Created0x10, Created0x30 |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
# 提取 $UsnJrnl:$J(需要原始磁盘访问)
# 使用 ExtractUsnJrnl 工具
ExtractUsnJrnl.exe /DevicePath:C: /OutputPath:C:\IR\evidence

# 或使用 KAPE 自动化提取
# kape.exe --tsource C: --tdest C:\IR\evidence --target UsnJrnl

# 使用 MFTECmd 解析 USN Journal
MFTECmd.exe -f "C:\IR\evidence\$J" --csv "C:\IR\output" --csvf usn_parsed.csv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 追踪恶意文件的完整生命周期
# 假设已知恶意文件名为 "payload.exe"
Import-Csv "C:\IR\output\usn_parsed.csv" |
Where-Object { $_.Name -match "payload" } |
Sort-Object UpdateTimestamp |
Select-Object UpdateTimestamp, Name, UpdateReasons, ParentPath |
Format-Table -AutoSize

# 输出示例(还原完整生命周期):
# 2026-03-28 10:15:00 payload.exe FILE_CREATE \Users\victim\Downloads
# 2026-03-28 10:15:01 payload.exe DATA_EXTEND|CLOSE \Users\victim\Downloads
# 2026-03-28 10:16:30 payload.exe RENAME_OLD_NAME \Users\victim\Downloads
# 2026-03-28 10:16:30 svchost.exe RENAME_NEW_NAME \Users\victim\AppData\Local\Temp
# 2026-03-28 15:30:00 svchost.exe FILE_DELETE|CLOSE \Users\victim\AppData\Local\Temp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查找特定时间窗口内的文件创建事件
Import-Csv "C:\IR\output\usn_parsed.csv" |
Where-Object {
$_.UpdateReasons -match "FILE_CREATE" -and
[datetime]$_.UpdateTimestamp -gt "2026-03-28 00:00:00" -and
[datetime]$_.UpdateTimestamp -lt "2026-03-29 00:00:00"
} |
Where-Object { $_.Name -match "\.exe$|\.dll$|\.ps1$|\.bat$|\.vbs$|\.js$" } |
Sort-Object UpdateTimestamp |
Select-Object UpdateTimestamp, Name, ParentPath |
Format-Table -AutoSize

# 查找被删除的可执行文件
Import-Csv "C:\IR\output\usn_parsed.csv" |
Where-Object {
$_.UpdateReasons -match "FILE_DELETE" -and
$_.Name -match "\.exe$|\.dll$|\.bat$|\.ps1$"
} |
Sort-Object UpdateTimestamp -Descending |
Select-Object -First 50 UpdateTimestamp, Name, ParentPath |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
# LECmd (Eric Zimmerman 工具)
# 解析单个 LNK 文件
LECmd.exe -f "C:\Users\victim\AppData\Roaming\Microsoft\Windows\Recent\secret.doc.lnk"

# 批量解析 Recent 目录
LECmd.exe -d "C:\Users\victim\AppData\Roaming\Microsoft\Windows\Recent" --csv "C:\IR\output" --csvf lnk_files.csv

# 递归扫描用户目录下所有 LNK 文件
LECmd.exe -d "C:\Users\victim" --csv "C:\IR\output" --csvf all_lnk.csv -q
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 分析 LNK CSV,查找可疑网络路径
Import-Csv "C:\IR\output\lnk_files.csv" |
Where-Object { $_.NetworkShareName -ne "" -or $_.NetworkSharePath -ne "" } |
Select-Object SourceFile, TargetPath, NetworkSharePath, NetworkShareName |
Format-Table -AutoSize

# 查找指向可疑位置的 LNK 文件
Import-Csv "C:\IR\output\lnk_files.csv" |
Where-Object {
$_.TargetPath -match "\\Temp\\|\\Public\\|\\ProgramData\\" -or
$_.TargetPath -match "\.exe$|\.ps1$|\.bat$|\.hta$|\.vbs$"
} |
Select-Object SourceFile, TargetPath, TargetCreated, FileSize |
Format-Table -AutoSize

# 查找来自 USB 设备的 LNK(DriveType = Removable)
Import-Csv "C:\IR\output\lnk_files.csv" |
Where-Object { $_.DriveType -eq "Removable" } |
Select-Object SourceFile, TargetPath, VolumeSerialNumber, VolumeName |
Format-Table -AutoSize

7.4 LNK 文件作为攻击向量

LNK 文件不仅是取证制品,也是常见的攻击向量(钓鱼 LNK)

检测恶意 LNK

1
2
3
4
5
6
7
8
9
# 检查桌面和下载目录中的可疑 LNK
Get-ChildItem "C:\Users\*\Desktop\*.lnk", "C:\Users\*\Downloads\*.lnk" -Recurse |
ForEach-Object {
$shell = New-Object -ComObject WScript.Shell
$sc = $shell.CreateShortcut($_.FullName)
[PSCustomObject]@{ Path=$_.FullName; Target=$sc.TargetPath; Args=$sc.Arguments }
} |
Where-Object { $_.Target -match "cmd\.exe|powershell|mshta|wscript" -or $_.Args -match "-enc|-e |/c " } |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
# JLECmd (Eric Zimmerman 工具)
# 解析 AutomaticDestinations
JLECmd.exe -d "C:\Users\victim\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations" --csv "C:\IR\output" --csvf jumplists_auto.csv

# 解析 CustomDestinations
JLECmd.exe -d "C:\Users\victim\AppData\Roaming\Microsoft\Windows\Recent\CustomDestinations" --csv "C:\IR\output" --csvf jumplists_custom.csv

# 解析所有用户的 Jump Lists
JLECmd.exe -d "C:\Users" --csv "C:\IR\output" --csvf jumplists_all.csv -q
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 分析 Jump Lists CSV
Import-Csv "C:\IR\output\jumplists_auto.csv" |
Where-Object { $_.Path -ne "" } |
Sort-Object InteractionCount -Descending |
Select-Object AppId, AppIdDescription, Path, InteractionCount, LastModified |
Format-Table -AutoSize

# 查找通过 Explorer 访问的可疑路径
Import-Csv "C:\IR\output\jumplists_auto.csv" |
Where-Object {
$_.AppIdDescription -match "Explorer|cmd|PowerShell" -and
$_.Path -match "\\Temp\\|\\Public\\|\\ProgramData\\"
} |
Select-Object AppIdDescription, Path, LastModified |
Format-Table -AutoSize

8.3 Jump Lists 的 IR 价值

精确追踪每个应用打开了哪些文件、可能包含 UNC 路径、文件删除后仍保留记录、记录交互次数和时间戳


9. Shellbags 分析

9.1 Shellbags 基本原理

什么是 Shellbags

Windows Explorer 用于记住用户浏览文件夹时的视图设置(窗口大小、排序方式、图标布局等)

副作用:记录了用户曾经浏览过的所有文件夹路径

即使文件夹已被删除,Shellbags 中的记录仍然保留

存储位置

NTUSER.DATSoftware\Microsoft\Windows\Shell\BagMRU\Bags

UsrClass.datLocal 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
2
3
4
5
6
7
8
9
# SBECmd (Eric Zimmerman 命令行版本)
# 解析用户的 Shellbags
SBECmd.exe -d "C:\Users\victim" --csv "C:\IR\output" --csvf shellbags.csv

# 解析离线注册表 Hive
SBECmd.exe --hive "E:\Evidence\UsrClass.dat" --csv "C:\IR\output" --csvf shellbags_offline.csv

# GUI 版本 ShellBags Explorer(更直观的树状展示)
# 直接打开 ShellBagsExplorer.exe,加载 UsrClass.dat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 分析 Shellbags CSV,查找可疑目录浏览记录
Import-Csv "C:\IR\output\shellbags.csv" |
Where-Object {
$_.Value -match "\\\\|\\Temp|\\ProgramData|\\Public" -or
$_.Value -match "USB|Removable"
} |
Sort-Object LastWriteTime -Descending |
Select-Object Value, LastWriteTime, ShellType |
Format-Table -AutoSize

# 查找网络共享浏览记录
Import-Csv "C:\IR\output\shellbags.csv" |
Where-Object { $_.Value -match "^\\\\" } |
Select-Object Value, LastWriteTime |
Sort-Object LastWriteTime -Descending |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
# 使用 RECmd 批量解析 UserAssist(自动 ROT13 解码)
RECmd.exe --bn BatchExamples\UserAssist.reb -f "C:\Users\victim\NTUSER.DAT" --csv "C:\IR\output" --csvf userassist.csv

# 分析 UserAssist CSV
Import-Csv "C:\IR\output\userassist.csv" |
Where-Object { $_.RunCount -gt 0 } |
Sort-Object LastExecutionTime -Descending |
Select-Object ProgramName, RunCount, FocusTime, LastExecutionTime |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
10
11
12
13
# SrumECmd (Eric Zimmerman 工具)
# 注意:SRUDB.dat 在系统运行时被锁定,需要先提取

# 方法1:使用 KAPE 提取
# kape.exe --tsource C: --tdest C:\IR\evidence --target SRUM

# 方法2:从 VSS(卷影副本)获取
# vssadmin list shadows
# 然后从 shadow copy 中复制

# 解析 SRUM 数据库
SrumECmd.exe -f "C:\IR\evidence\SRUDB.dat" -r "C:\IR\evidence\SOFTWARE" --csv "C:\IR\output" --csvf srum.csv
# 注意:-r 参数指定 SOFTWARE 注册表 Hive,用于解析 AppId 到程序名的映射
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
# 分析 SRUM 网络使用数据
# 查找发送了大量数据的程序(可能是数据窃取)
Import-Csv "C:\IR\output\srum_NetworkUsages.csv" |
Where-Object { [long]$_.BytesSent -gt 100MB } |
Sort-Object { [long]$_.BytesSent } -Descending |
Select-Object Timestamp, ExeInfo, BytesSent, BytesRecvd, UserId |
Format-Table -AutoSize

# 查找异常时段(深夜/凌晨)的网络活动
Import-Csv "C:\IR\output\srum_NetworkUsages.csv" |
Where-Object {
$hour = ([datetime]$_.Timestamp).Hour
$hour -ge 0 -and $hour -le 5 # 凌晨 0-5 点
} |
Where-Object { [long]$_.BytesSent -gt 1MB -or [long]$_.BytesRecvd -gt 1MB } |
Select-Object Timestamp, ExeInfo, BytesSent, BytesRecvd |
Sort-Object Timestamp |
Format-Table -AutoSize

# 查找已删除程序的历史资源使用
# SRUM 保留了程序的使用记录,即使程序已被删除
Import-Csv "C:\IR\output\srum_AppResourceUseInfo.csv" |
Where-Object { $_.ExeInfo -match "\\Temp\\|\\Public\\|\\ProgramData\\" } |
Select-Object Timestamp, ExeInfo, ForegroundCycleTime, BackgroundCycleTime |
Format-Table -AutoSize

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# PowerShell 直接查询 BAM(活体取证)
$bamPath = "HKLM:\SYSTEM\CurrentControlSet\Services\bam\State\UserSettings"
Get-ChildItem $bamPath | ForEach-Object {
$sid = $_.PSChildName
Write-Host "`n=== User SID: $sid ===" -ForegroundColor Cyan
$_.GetValueNames() | Where-Object { $_ -ne "Version" -and $_ -ne "SequenceNumber" } | ForEach-Object {
$data = (Get-ItemProperty "$bamPath\$sid").$_
if ($data.Length -ge 8) {
$lastExec = [DateTime]::FromFileTime([BitConverter]::ToInt64($data, 0))
Write-Host " $lastExec | $_"
}
}
}

# 离线解析:使用 RECmd
RECmd.exe --bn BatchExamples\Bam.reb -f "E:\Evidence\SYSTEM" --csv "C:\IR\output" --csvf bam.csv

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
2
# 使用 MFTECmd 解析 $I30(需要先使用 RawCopy 提取)
MFTECmd.exe -f "C:\IR\evidence\$I30" --csv "C:\IR\output" --csvf i30_parsed.csv

13.3 Thumbcache (缩略图缓存)

位置C:\Users\<user>\AppData\Local\Microsoft\Windows\Explorer\

文件thumbcache_32.dbthumbcache_96.dbthumbcache_256.dbthumbcache_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
2
3
4
5
6
7
# 查询 TypedPaths
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedPaths" |
Select-Object url1, url2, url3, url4, url5 | Format-List

# 查询 TypedURLs
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\TypedURLs" |
Select-Object url1, url2, url3, url4, url5, url6, url7, url8, url9, url10 | Format-List

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
2
3
4
# 查看当前 BITS Jobs
Get-BitsTransfer -AllUsers | Select-Object DisplayName, JobState, CreationTime,
@{N='URL';E={$_.FileList.RemoteName}}, @{N='Local';E={$_.FileList.LocalName}} |
Format-Table -AutoSize

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
2
3
4
# 官方下载:https://ericzimmerman.github.io/#!index.md
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/EricZimmerman/Get-ZimmermanTools/master/Get-ZimmermanTools.ps1" -OutFile "Get-ZimmermanTools.ps1"
.\Get-ZimmermanTools.ps1 -Dest "C:\Tools\EZTools"
# 或使用 KAPE 内嵌的 EZ Tools(KAPE 自动下载)

14.3 统一输出与 Timeline Explorer

所有 EZ 工具都支持 CSV 输出格式,可使用 Timeline Explorer 统一查看:

1
2
3
4
5
6
7
8
9
# 将所有取证制品解析到同一目录,使用 Timeline Explorer 统一查看
mkdir C:\IR\output\all_artifacts
PECmd.exe -d "C:\Windows\Prefetch" --csv "C:\IR\output\all_artifacts" --csvf prefetch.csv
AmcacheParser.exe -f "C:\IR\evidence\Amcache.hve" --csv "C:\IR\output\all_artifacts" --csvf amcache.csv
AppCompatCacheParser.exe -f "C:\IR\evidence\SYSTEM" --csv "C:\IR\output\all_artifacts" --csvf shimcache.csv
LECmd.exe -d "C:\Users" --csv "C:\IR\output\all_artifacts" --csvf lnk.csv -q
JLECmd.exe -d "C:\Users" --csv "C:\IR\output\all_artifacts" --csvf jumplists.csv -q
SBECmd.exe -d "C:\Users" --csv "C:\IR\output\all_artifacts" --csvf shellbags.csv
SrumECmd.exe -f "C:\IR\evidence\SRUDB.dat" -r "C:\IR\evidence\SOFTWARE" --csv "C:\IR\output\all_artifacts"

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 采集所有常见取证制品(Target 阶段)— 包含 Prefetch/注册表/evtx/Amcache/SRUM/LNK/MFT 等
kape.exe --tsource C: --tdest "C:\IR\collected" --target KapeTriage

# 对采集的制品执行分析(Module 阶段)
kape.exe --msource "C:\IR\collected" --mdest "C:\IR\analyzed" --module !EZToolsALL

# 一步完成采集 + 分析
kape.exe --tsource C: --tdest "C:\IR\collected" --target KapeTriage --mdest "C:\IR\analyzed" --module !EZToolsALL

# 针对性采集示例
kape.exe --tsource C: --tdest "C:\IR\collected" --target Prefetch,Amcache,ApplicationCompatCache
kape.exe --tsource C: --tdest "C:\IR\collected" --target $MFT,$UsnJrnl,$LogFile
kape.exe --tsource C: --tdest "C:\IR\collected" --target LnkFiles,JumpLists,Shellbags,UserAssist

# 远程采集(通过 UNC 路径)
kape.exe --tsource \\TARGET\C$ --tdest "C:\IR\collected\TARGET" --target KapeTriage

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
2
3
4
5
6
# 使用 log2timeline / plaso 构建超级时间线
# log2timeline.exe evidence.plaso C:\IR\collected\
# psort.exe -z "Asia/Shanghai" -o l2tcsv evidence.plaso -w timeline.csv

# 或使用各 EZ 工具的 CSV 输出手动合并
# 在 Timeline Explorer 中打开多个 CSV,按时间排序

步骤 4:围绕关键时间点前后分析

关注事件时间窗口内的:

新程序执行(Prefetch 新建)

文件创建/删除(USN Journal)

网络活动(SRUM)

用户操作(LNK、Jump Lists、Shellbags)

注册表变更(相关键的 LastWriteTime)

步骤 5:形成攻击叙事 (Attack Narrative)

将所有证据按时间顺序串联,形成完整的攻击故事线

16.3 实战示例:还原一次钓鱼攻击

以下演示如何使用多种取证制品还原一次钓鱼邮件攻击:

场景:用户收到钓鱼邮件,打开附件后系统被植入后门

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
=== 攻击时间线还原 ===

[10:00] 用户通过 Outlook 打开钓鱼邮件附件 "Invoice.doc"
证据: Prefetch → WINWORD.EXE-*.pf (LastRun=10:00)
LNK → Invoice.doc.lnk (TargetCreated=10:00)
Jump Lists → Word AppID 中记录 Invoice.doc

[10:01] Word 宏执行,通过 PowerShell 下载恶意 payload
证据: Prefetch → POWERSHELL.EXE-*.pf (LastRun=10:01)
Event Log → PowerShell ScriptBlock Logging (Event ID 4104)
Prefetch → 引用文件列表中包含 \Temp\payload.exe

[10:02] Payload 下载到 Temp 目录并执行
证据: USN Journal → FILE_CREATE payload.exe at \AppData\Local\Temp\
Prefetch → PAYLOAD.EXE-*.pf (创建时间=10:02)
Amcache → payload.exe 的 SHA1 哈希(查 VT 确认恶意)
BAM/DAM → payload.exe 最后执行时间 10:02

[10:03] Payload 创建持久化(计划任务)
证据: Event Log → Event ID 4698 (计划任务创建)
Prefetch SCHTASKS.EXE-*.pf
USN Journal → FILE_CREATE 计划任务 XML 文件

[10:05-11:00] 后门与 C2 通信,内网侦察
证据: SRUM → payload.exe 网络流量(BytesSent/BytesRecvd)
Prefetch → WHOAMI.EXE, NET.EXE, NLTEST.EXE
ShimCache → 多个侦察工具路径
Shellbags → 攻击者浏览了 \\fileserver\share 等内网路径

[11:30] 攻击者清理痕迹
证据: USN Journal → FILE_DELETE payload.exe
USN Journal → FILE_DELETE 部分 .pf 文件
但 Amcache 仍保留 SHA1 → VT 确认恶意
MFT 已删除条目 → 恢复 payload.exe 元数据

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 按分析目标速查

“这个程序是否执行过?”

  1. Prefetch — 是否有对应 .pf 文件?

  2. Amcache — 是否有记录?SHA1 是什么?

  3. ShimCache — 是否有记录?执行标志?

  4. BAM/DAM — 是否有记录?最后执行时间?

  5. UserAssist — 是否有记录?(仅 GUI 执行)

  6. SRUM — 是否有资源使用记录?

“这个文件何时出现在系统上?”

  1. $MFT — $FN Created 时间

  2. USN Journal — FILE_CREATE 记录

  3. Prefetch — .pf 文件 CreationTime(程序首次执行)

  4. Amcache — FileKeyLastWriteTimestamp

“用户打开/访问了什么文件?”

  1. LNK 文件 — Recent 目录中的快捷方式

  2. Jump Lists — 应用程序最近文件列表

  3. Shellbags — 浏览过的目录

  4. TypedPaths — Explorer 地址栏输入的路径

  5. UserAssist — 通过 GUI 打开的程序

“文件是否被篡改时间戳?”

  1. $MFT — $SI vs $FN 时间戳对比

  2. USN Journal — 验证文件实际创建时间

  3. Amcache — LinkDate(PE 编译时间)vs 文件时间

“这个程序使用了多少网络流量?”

  1. SRUM — BytesSent / BytesRecvd

  2. Event Log — Sysmon Event ID 3 (Network Connection)

  3. 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
3
4
5
6
7
8
9
10
11
12
13
14
# 练习脚本
$outputDir = "C:\IR\Lab04\prefetch"
New-Item -ItemType Directory -Path $outputDir -Force
PECmd.exe -d "C:\Windows\Prefetch" --csv $outputDir --csvf prefetch_lab.csv

$suspicious = @("CMD.EXE","POWERSHELL.EXE","CERTUTIL.EXE","BITSADMIN.EXE",
"MSHTA.EXE","WSCRIPT.EXE","NET.EXE","WHOAMI.EXE","PSEXEC","MIMIKATZ")
$pattern = ($suspicious | ForEach-Object { [regex]::Escape($_) }) -join "|"

Import-Csv "$outputDir\prefetch_lab.csv" |
Where-Object { $_.ExecutableName -match $pattern } |
Sort-Object LastRun -Descending |
Select-Object ExecutableName, RunCount, LastRun |
Format-Table -AutoSize

练习 2:多制品关联分析

目标:综合使用 Prefetch + Amcache + USN Journal + SRUM 还原攻击时间线

步骤:KAPE 采集所有制品 → EZ Tools 批量解析 → Timeline Explorer 加载 CSV → 围绕时间窗口分析 → 编写攻击叙事

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 综合练习脚本
$collectDir = "C:\IR\Lab04\collected"
$analyzeDir = "C:\IR\Lab04\analyzed"
New-Item -ItemType Directory -Path $collectDir, $analyzeDir -Force

# KAPE 采集 + EZ Tools 批量解析
# kape.exe --tsource C: --tdest $collectDir --target KapeTriage
PECmd.exe -d "$collectDir\C\Windows\Prefetch" --csv $analyzeDir --csvf prefetch.csv
AmcacheParser.exe -f "$collectDir\C\Windows\appcompat\Programs\Amcache.hve" --csv $analyzeDir --csvf amcache.csv
AppCompatCacheParser.exe -f "$collectDir\C\Windows\System32\config\SYSTEM" --csv $analyzeDir --csvf shimcache.csv
MFTECmd.exe -f "$collectDir\C\`$MFT" --csv $analyzeDir --csvf mft.csv
SrumECmd.exe -f "$collectDir\C\Windows\System32\sru\SRUDB.dat" -r "$collectDir\C\Windows\System32\config\SOFTWARE" --csv $analyzeDir
LECmd.exe -d "$collectDir\C\Users" --csv $analyzeDir --csvf lnk.csv -q
JLECmd.exe -d "$collectDir\C\Users" --csv $analyzeDir --csvf jumplists.csv -q

练习 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-账户安全排查