← 返回博客

卷影副本与 $MFT:恢复旧版本的 MFT

· 阅读 1 分钟

简短回答: 每个卷影副本(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

挂载之后,你会得到 vss1vss2…… 等独立文件,每一个都可作为 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、整盘擦除或物理介质损坏。

外部资源