取证工件地图

拿到一台 Windows 主机镜像,第一个问题永远是:证据在哪里?

最后更新 2026-10-09版本 v1.0维护 DigiForensics查看历史 0

关键词:工件地图、时间线、系统信息、卷影副本、回收站、取证工作站 难度:入门 前置知识:磁盘镜像与仿真、NTFS 基本概念

一、概述

拿到一台 Windows 主机镜像,第一个问题永远是:证据在哪里?

Windows 不给你一个集中的审计日志。「谁在什么时候做了什么」散落在几十个互不相干的位置——注册表 hive、.evtx 文件、目录里的二进制缓存、SQLite 数据库、隐藏的 NTFS 数据流。这些工件分属不同子系统,各有自己的生命周期、保留策略和清除方式。有的重启就重建,有的删掉就再也回不来。

两个最常见的处置错误都源于此:

  • 查获了一台运行中的机器,直接拔电关机。结果丢失当前会话的内存态工件(ShimCache 未落盘条目、浏览器会话、剪贴板、网络连接),且改变了系统状态。
  • 只提取了「看得见」的文件(Users\ 下的文档),漏掉了 C:\Windows 下的系统工件——而执行痕迹、登录记录、持久化证据几乎全在后者里。

要回答的问题只有一个:每类工件在哪里、值多少、活多久、怎么被清掉。分类的依据是「谁记录的」——因为清除难度决定了攻击者会先清哪里、因此哪里残留得最可信。

这张地图卡在「拿到设备」到「逐工件分析」之间,是采集阶段的决策依据。上游是镜像制作与接入,它不产出证据,它决定了你能不能拿到证据。地图本身要产出三样:Windows 版本判定(决定用哪个解析器)、工件存在性清点、接入未污染证据的验证。下游支撑所有具体篇目——有了地图,才知道哪个方向有料、哪个方向是空的,而「空的」往往也是结论。

工件全景按证据类型组织如下:

类别 记录者 典型工件 清除难度
显式审计 Windows 安全/审计子系统 Security.evtx、System.evtx、Sysmon ★★★★ 可被 wevtutil cl 清除
性能优化副产品 内核为加速启动而缓存 Prefetch、ShimCache、Amcache ★★★ 需清缓存/删文件,重启后重建
Shell 便利功能 资源管理器为 UX 记录 LNK、JumpList、RecentDocs、UserAssist ★★ 用户可在设置里一键关闭
应用自身数据 各应用自己的数据库 浏览器、邮件、聊天软件、Office ★ 用户可自删历史
文件系统元数据 NTFS 驱动 $MFT、$LogFile、$UsnJrnl ★★★★ 需占用空闲区,极难
一个容易被忽略的层级 卷影副本(VSS) 每个快照是某时刻的完整文件系统视图 取证入口 mklink /d X: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\,每个快照对应唯一卷

同一份工件,XP 和 Win11 上可能根本不叫同一个名字、也不在同一个位置。选错解析器,读出来的是垃圾。

差异点 XP/2003 Vista/7 8/8.1 10/11
事件日志格式 .evt(16KB 定长) .evtx .evtx .evtx
Prefetch v17,1 个时间戳 v23,1 个时间戳 v26,8 个时间戳 v30/v31,MAM 压缩
Prefetch 条目上限 128 128 128 1024
ShimCache 容量 96 512 512 1024
Amcache RecentFileCache.bcf RecentFileCache.bcf Amcache.hve Amcache.hve
Jump List / SRUM 无 / 无 有限 / 无 有 / 有 有 / 有
Sysmon 不支持 不支持 支持 支持
ShimCache 路径 Session Manager\AppCompatCache(无内层子键) Session Manager\AppCompatCache\AppCompatCache 同 同

读法:拿到镜像先确定版本,再决定用哪个解析器。

据此能判断的是:这台机器的 Windows 版本、哪些工件实际存在、每个工件的位置与取证价值、以及各类工件的清除难度与被清理的可能性。

判断不了的有六条:

  • 按「清除难度」分类的价值在于反推。 攻击者的反取证会从易到难清——先清浏览器历史,再清事件日志,再删 Prefetch。$UsnJrnl 与 $LogFile 因为清理需要占用空闲区并可能被占用空间保护,通常被放弃。因此「事件日志缺失」本身就是值得记录的发现,不能直接读成「没有活动」。
  • 任何具体行为。 地图只标注位置与价值,不解释任何单个工件的语义。
  • 存在性之外的可用性。 工件存在不代表数据完整——是否被覆盖、是否超出保留期、是否被清理,要在具体篇目里判断。
  • VSS 里的内容。 快照存在与否要靠 vssadmin list shadows 揭示,默认保留空间有限,快照可能很少或很小。
  • 跨主机的关联。 单台主机的地图回答不了「它连着谁」。
  • 已删除数据。 地图基于现存文件,已删除内容需要卷层面的恢复能力。

往下读之前先确认你已经完成镜像制作与完整性校验,并且理解「为什么先验证哈希再分析」;具备 Windows 的基础结构认知——注册表 hive、事件日志、%SystemRoot% 与用户配置文件的位置;了解 NTFS 的基本概念(MFT、备用数据流),见NTFS 结构与 MFT 解析;熟悉只读挂载与仿真环境,VSS 与挂载都是在仿真环境里做的,见虚拟机仿真。同时清楚绝不可逆的操作清单:VSS 枚举是只读的,但绝不要用 vssadmin delete shadows 清空间——那是直接销毁证据。

二、核心原理

2.1 工件按"谁记录的"分为五类

每类痕迹由哪个子系统写入、在什么时候写入,直接决定了它的可信度和清除难度。

类别 记录者 典型工件 清除难度
显式审计 Windows 安全/审计子系统 Security.evtx、System.evtx、Sysmon ★★★★ 可被 wevtutil cl 清除
性能优化副产品 内核为加速启动而缓存 Prefetch、ShimCache、Amcache ★★★ 需清缓存/删文件,重启后重建
Shell 便利功能 资源管理器为 UX 记录 LNK、JumpList、RecentDocs、UserAssist ★★ 用户可在设置里一键关闭
应用自身数据 各应用自己的数据库 浏览器、邮件、聊天软件、Office ★ 用户可自删历史
文件系统元数据 NTFS 驱动 $MFT、$LogFile、$UsnJrnl ★★★★ 需占用空闲区,极难

实战推论:攻击者的反取证会从易到难清——先清浏览器历史(用户可删),再清事件日志,再删 Prefetch。$UsnJrnl 和 $LogFile 因为清理需要占用空闲区并可能被占用空间保护,通常被放弃。因此"事件日志缺失"本身就是值得记录的发现,不能直接读成"没有活动"。

2.2 工件目录结构总览

下表是 Windows 取证的核心索引。路径以 Windows 10/11 为基准,其他版本差异见 2.4。

系统级(C:\Windows\)

路径 工件 价值 参见
System32\config\SYSTEM 硬件/服务/控制集/ShimCache ★★★★★ 02、06
System32\config\SOFTWARE 已安装软件、SRUM 配置、卸载残留 ★★★★★ 02、09
System32\config\SAM / SECURITY 本地账户与密码哈希 / LSA 秘密 ★★★★★ 02
System32\sru\SRUDB.dat SRUM 资源使用数据库 ★★★★★ 09
System32\winevt\Logs\*.evtx 事件日志(含 Sysmon) ★★★★★ 03、04
Prefetch\*.pf 程序执行证据 ★★★★★ 05
AppCompat\Programs\Amcache.hve 程序哈希/编译时间 ★★★★ 06
System32\Tasks\ / inf\setupapi.dev.log 计划任务 / 设备安装历史 ★★★★ —

用户级(C:\Users\<用户名>\)

路径 工件 价值 参见
NTUSER.DAT 用户注册表:RecentDocs、UserAssist、RunMRU、TypedPaths ★★★★★ 10
AppData\Roaming\Microsoft\Windows\Recent\*.lnk 快捷方式(含 TrackerDataBlock) ★★★★★ 07
...\Recent\AutomaticDestinations\*.automaticDestinations-ms Jump List ★★★★★ 07
AppData\Local\Google\Chrome\User Data\Default\ Chrome 密码/历史/Cookie ★★★★★ 08
AppData\Local\Microsoft\Edge\User Data\ Edge 同上 ★★★★★ 08
AppData\Roaming\Mozilla\Firefox\Profiles\ Firefox logins.json/key4.db ★★★★★ 08
AppData\Local\Microsoft\Recall\ 或 AppData\Local\CoreAIPlatform.00\ Recall 相关 ★★★★★ 12
AppData\Local\Microsoft\Windows\INetCache\ IE/Edge Legacy 缓存 ★★★ 08

系统元数据(NTFS 层,不在目录树中正常显示)

对象 位置 价值
$UsnJrnl:$J $Extend 目录 ★★★★★
$MFT 见 fsstat 输出 ★★★★★
$LogFile NTFS 根 ★★★★
$Recycle.Bin\<SID>\$I* 回收站元数据 ★★★★
卷影副本 System Volume Information\ 历史版本文件 ★★★★★
hiberfil.sys / pagefile.sys 休眠镜像 / 可搜字符串 ★★★★

$UsnJrnl 与 $MFT 的解析参见本板块第 11 篇与《文件系统分析》板块。

回收站($Recycle.Bin)

$I 文件是 8 字节版本头 + 8 字节文件大小 + 8 字节删除时间(FILETIME)+ 路径长度 + UTF-16 路径;$R 是被删内容原件。

删除时间来自 $I 文件,而非 $R 的 MFT 时间戳。 两条时间线冲突时,这是关键区分点。

2.3 一个容易被忽略的层级:卷影副本(VSS)

卷影副本是"时间机器",但只有知道快照存在才能用。

  • 每个快照是某时刻的卷快照,包含当时的完整文件系统视图。
  • 快照数量与大小由 vssadmin list shadows 揭示;默认保留空间有限,快照可能很少或很小。
  • 取证入口:mklink /d X: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopyN\,每个快照对应唯一卷,需与 vssadmin 输出的 Original Volume 对应。
vssadmin list shadows        # 列出所有卷影副本(管理员权限)
vssadmin list shadowstorage  # 查看影子副本存储占用

⚠️ VSS 枚举是只读操作,对运行中的机器相对安全。但绝不要用 vssadmin delete shadows 清空间——那是直接销毁证据。

2.4 Windows 版本差异对取证的实际影响

选错解析器会得到错误结论,而不只是"报个错"。用 v17 解析器读 v31 的 Prefetch,或用 16K .evt 解析器读 .evtx,出来的是垃圾或「文件损坏」。

差异点 XP/2003 Vista/7 8/8.1 10/11
事件日志格式 .evt(16KB 定长) .evtx .evtx .evtx
Prefetch v17,1 个时间戳 v23,1 个时间戳 v26,8 个时间戳 v30/v31,MAM 压缩
Prefetch 条目上限 128 128 128 1024
ShimCache 容量 96 512 512 1024
Amcache RecentFileCache.bcf RecentFileCache.bcf Amcache.hve Amcache.hve
Jump List / SRUM 无 / 无 有限 / 无 有 / 有 有 / 有
Sysmon 不支持 不支持 支持 支持
ShimCache 路径 Session Manager\AppCompatCache(无内层子键) Session Manager\AppCompatCache\AppCompatCache 同 同

读法:拿到镜像先确定版本,再决定用哪个解析器。

2.5 取证工作站配置

分析环境本身也是证据链的一环——分析工具的行为可能改变你读到的数据。

要求 理由
只读挂载,永不写回 挂载点设为只读;写保护器最保险
关闭 AutoPlay 挂载可能触发自动运行、缩略图生成、journal 回放
不改系统时区/时钟 事件日志时间是本地时间,时区错误会导致全盘时间线错位
记录工具版本与哈希 同名工具不同版本解析结果可能不同,报告需可复现

最重要一条:任何"我打开看了一下"的操作,如果是在原始镜像上做的,都可能因 atime 更新、journal 回放、预览生成缩略图而改变证据。先复制,后分析。


三、操作步骤

3.1 第 1 步:镜像结构确认与工件存在性清点

mmls DigiForensics.dd # 分区布局 fsstat -o 2048 /work/DigiForensics.dd | grep -iE 'cluster|mft|serial|volume name' fls -o 2048 -r -p /work/DigiForensics.dd > /evidence/fls-all.txt

工件存在性("缺失"本身是发现)

grep -ic 'prefetch' /evidence/fls-all.txt # Prefetch 文件数 grep -ic 'amcache' /evidence/fls-all.txt # Amcache 是否存在 grep -icE '.evtx$' /evidence/fls-all.txt # 事件日志数量 grep -i 'usnjrnl' /evidence/fls-all.txt # UsnJrnl 位置

3.2 第 2 步:判断版本与 Prefetch 格式

先看 .pf 头部 4 字节——这一步决定后续所有解析器选择:

icat -o 2048 /work/DigiForensics.dd <pf-inode> > /evidence/sample.pf
xxd -l 16 /evidence/sample.pf
输出开头 含义 应对
4D 41 4D 04(MAM\x04) Win10/11 MAM 压缩 必须先用 PECmd 等工具解压
1F 00 00 00 / 1E 00 00 00 v31 / v30 高版本解析器
1A 00 00 00 / 17 00 00 00 / 11 00 00 00 v26 / v23 / v17 对应版本解析器
偏移 4 处 53 43 43 41(SCCA) 未压缩,签名在固定位置 常规解析

3.3 第 3 步:提取注册表 hive、事件日志与元数据

mkdir -p /evidence/hives

hive 路径以实际系统为准,常见 /Windows/System32/config

for h in SYSTEM SOFTWARE SAM SECURITY DEFAULT; do ino=$(fls -o 2048 -r -p /work/DigiForensics.dd | grep -E "config/$h$" | head -1 | cut -d' ' -f2) icat -o 2048 /work/DigiForensics.dd "$ino" > "/evidence/hives/$h" done for h in /evidence/hives/*; do echo -n "$h: "; xxd -l 4 -p "$h"; done # 期望 72656766

用户 hive / 事件日志:先用 fls 定位 inode,再逐个 icat

fls -o 2048 -r -p /wor