简短回答: 每个卷影副本(Volume Shadow Copy)快照都包含一份从拍摄时刻冻结下来的 $MFT。挂载一个较旧的快照并导出其中的 $MFT,你就可以把今天的文件系统与一周前的进行对比、恢复在两次快照之间被删除的文件,并观察元数据随时间的变化。
VSS 抓取了什么
卷影副本服务(Volume Shadow Copy Service,VSS)会为 NTFS 卷拍摄时间点快照。每个快照都是 copy-on-write 的增量:当某个数据块即将被修改时,原始内容会先被保留到影子副本中。因此,快照精确反映了在拍摄时刻该卷的状态,包括 Master File Table。
在典型的 Windows 终端上,快照会被自动拍摄 —— 通常是在 Windows 更新之前、有时由「系统还原」触发,经常也由第三方备份软件触发。一台工作站轻而易举就能拥有过去几周内的半打快照。
这对取证为何重要
活动 $MFT 是一次观测。一个有五个快照的卷给你 六次观测:今天加上五个历史时刻。每一份历史 $MFT 都记录了该时刻卷的状态,包括:
- 当时存在、之后被删除的文件 —— 可被完整恢复。
- 现在存在、当时尚不存在的文件 —— 这可以证明它们何时被引入。
- 与今天时间戳不一致的记录,可暴露快照之间发生的重命名、移动以及 timestomping。
快照在勒索软件案例中尤其有用:如果 VSS 没有被删除(一些勒索软件会尝试 —— 见 MFT 中的勒索软件特征),其中某个较旧的快照里就会包含加密前的 $MFT,而且通常还有原始的文件数据。
列出快照
在管理员 PowerShell 中:
vssadmin list shadows
每个条目都会显示一个 Shadow Copy Volume 路径,形如 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7。这个路径是可挂载的。
如果你手头是取证镜像,使用 libvshadow。其中的 vshadowinfo 工具能列出 .dd 或 .E01 镜像里的快照;vshadowmount 则把它们暴露为一个个独立的虚拟卷。
vshadowinfo disk.dd
vshadowmount disk.dd /mnt/shadows
挂载之后,你会得到 vss1、vss2…… 等独立文件,每一个都可作为 NTFS 卷来解析。
从快照中提取 $MFT
一旦快照被挂载(在活动系统上或通过 vshadowmount),$MFT 就位于与父卷相同的偏移上 —— 快照的根。可以用提取活动 $MFT 的同样工具把它拽出来:
fsutil(活动系统):fsutil file queryextents \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy7\$Mft- FTK Imager:把影子副本设备添加为证据,导航到
$MFT,导出。 icat(The Sleuth Kit,镜像):icat -o <offset> vss1 0 > mft_vss1.bin(inode 0 永远是$MFT)。- KAPE 对每一个挂载好的快照运行
MFT目标。
活动系统下的操作细节见提取 $MFT。
对比两份 MFT
最划算又最有用的分析就是一次 diff。把两份 $MFT 都解析为 CSV(每条记录一行),按记录号排序,然后做差异比较:
mft_dump -o csv mft_today.bin > today.csv
mft_dump -o csv mft_vss3.bin > vss3.csv
diff <(sort today.csv) <(sort vss3.csv) > changes.diff
你要找的是:
- 在
vss3中存在、但在today中缺失或被标记为已删除的记录 —— 在这两次快照之间被删除的文件。 - 在
today中存在、但在vss3中没有的记录 —— 在两次快照之间引入的文件。 $STANDARD_INFORMATION时间戳向后退的记录 —— 可能存在 timestomping(快照才是基准事实)。$FILE_NAME父引用发生变化的记录 —— 文件被移动到了不同的目录。
在 $UsnJrnl 级别做同样的 diff 信息更丰富;把它与 MFT diff 搭配,就能得到完整画像。
局限
- 快照可以被删除。
vssadmin delete shadows /all是一行命令的「清场」,几乎出现在每一份勒索软件操作手册里。已经被驱逐的快照就没了 —— VSS 默认保留固定上限(默认 64 个)。 - 快照并不是任意时间点。 你得到的是被预约或被某次安装触发的时间点。在事件发生的确切时刻几乎不会刚好有一个快照。
- 较旧
$MFT中的常驻数据并不会在快照之外被保留。 如果一个小文件曾出现在某个快照中,那么该快照里就保有它的常驻字节。不要指望从删除之后才拍的快照里恢复出数据。
常见问题
能从 Linux 读取 VSS 快照吗?
可以 —— libvshadow 是跨平台的。用 vshadowmount 挂载镜像,然后任何支持 NTFS 的工具都能把快照卷当作普通文件读取。
快照里是否包含像 $MFT 这样的系统文件?
包含。VSS 快照在拍摄时会捕获卷上的每一个块,包括位于 $MFT 开头的那些元数据文件。
Windows 默认保留多少个快照?
每卷默认最多 64 个。设置项是注册表里的 MaxShadowCopies,几乎没人改过它。在装有备份软件的服务器上,有效上限通常取决于备份软件保留多少份。
卷影副本中的数据抗擦除吗?
它能抵抗在活动卷上对单个文件的删除 —— 这正是其目的。但它不能抵抗 vssadmin delete shadows、整盘擦除或物理介质损坏。