$MFTMirr 是 NTFS 中最小的一份保险。它镜像 $MFT 的前几条记录,让在主表起始处的字节不可读时,文件系统驱动仍然能找到卷上的每个文件。它也是大家容易忘了采集、然后三周后才急着要的工件。
下面说明它实际包含什么、在磁盘上位于何处、NTFS 何时使用它,以及在取证中它真正派上用场的(有限的)几种情况。
为什么会存在镜像
$MFT 的前几条记录是承重结构。记录 0 是 $MFT 自身,其 $DATA runlist 告诉你这张表在磁盘上的其余部分在哪里。记录 2 是 $LogFile。记录 3 是 $Volume。如果 $MFT 起始处的字节被破坏,NTFS 就无法在卷上找到其他任何文件,包括它通常用来从文件系统不一致中恢复的事务日志。
这是一个循环依赖:你需要 $MFT 来找到 $LogFile,但你需要 $LogFile 来修复 $MFT。镜像打破了这个循环。$MFTMirr 是一个独立文件,位于不同的物理位置,保存着那些前几条记录的副本。驱动挂载卷时会读取 $MFT 的记录 0;若该读取失败或 fixup 数组无法验证,它会回退到 $MFTMirr 的记录 0,并用副本来重新定位其余内容。
它在哪儿
$MFTMirr 是 MFT 中的记录 1。它的 $DATA 属性是非常驻,其 runlist 传统上指向 卷的中间,以确保一次局部故障(一个坏扇区、一次跨同一区域的撕裂写入)不会同时干掉两份副本。现代 NTFS 把它放在 LCN clusterCount / 2。500 GB 卷上,镜像大约在 250 GB 位置。
可以从在线系统找到它:
fsutil file queryextents C:\$MFTMirr
会返回 $MFTMirr 占用的簇 run,原始读取可以据此组装出来。KAPE 的 MFT target 默认与 $MFT 一起采集它。如果你用 FTK Imager,它就在 NTFS 卷根目录中 $MFT 的旁边。
它装了什么
前几条 MFT 记录的逐字节副本。历史上保证的是前 4 条记录(0 到 3,真正必不可少的元数据)。当前 Windows 版本镜像的是前 16 条,也就是 Master File Table 参考 中描述的整个 NTFS 元数据集合。
每个副本都是一条标准的 MFT 记录。同样的 FILE 签名、同样的头、同样的 fixup 数组、同样的属性流。指向 $MFTMirr 的解析器走读它的方式与走读 $MFT 完全一样。MFTECmd、mft_dump、analyzeMFT 与 Sleuth Kit 的 fls 都把它作为可接受的输入。
NTFS 在挂载时如何使用它
在健康挂载下,驱动不会碰 $MFTMirr。在损坏的挂载下:
- 读
$MFT的记录 0。 - 若读取返回 I/O 错误,或 fixup 验证失败,就改读
$MFTMirr的记录 0。 - 若镜像中的记录 0 有效,则用其
$DATArunlist 在磁盘上定位$MFT,继续进行。
镜像无需 取代 $MFT。它只需要提供足够信息来找到真正的那个。一旦驱动从镜像的指针定位到 $MFT,就转入使用在线表。
chkdsk 如何使用它
chkdsk 更激进。当它在 $MFT 前几条记录中发现损坏时,会把每条记录与镜像交叉比对。如果两份副本都有效但不一致,chkdsk 把镜像视为前几条关键记录的权威(假设是:在线记录被更新得更晚,并在更新过程中出现了损坏)。
如果 $MFT 不可读 且 镜像也不可读,chkdsk 会报 Windows cannot recover master file table. CHKDSK aborted。这时恢复需要离线工具:用 Sleuth Kit、R-Studio 或 testdisk 在原始卷上按签名 carving FILE 记录。NTFS 内建的自我修复手段已经用完。
为什么 $MFTMirr 不是完整备份
它只镜像元数据文件。记录 16 及之后的内容,即所有用户文件与目录,只存在于 $MFT 中。如果 $MFT 在记录 16 之外受损,镜像帮不上忙。镜像足以让卷得以 挂载;要从损坏中恢复任意文件,依然需要在没有镜像时所用的同样技术。
这是 IR 处置中常常浪费时间的误解。人们伸手去找 $MFTMirr,以为它是完整的历史快照。它不是。要那个,应该用 Volume Shadow Copy,其中每一份都包含一个完整 $MFT 的某时间点真实副本。
取证关注
$MFTMirr 在案件中很少是主要工件,但它有两种真实用途:
- 交叉校验。 镜像中的记录 0 到 15 应当与在线记录逐位一致。出现分歧意味着其中一侧曾被绕过常规通道修改过:驱动 bug、刻意篡改、崩溃后部分恢复,或者粗劣的擦写器在涂写
$MFT时没意识到卷别处还有副本。我只见过一例:镜像抓到一个擦写器覆写了$MFT前 16 条记录、但没意识到副本在卷的别处。因为镜像完好,重建才得以成功。 - 损坏前快照。 如果在线
$MFT记录已被修改但镜像尚未刷新(NTFS 会同步两者,但存在一个小窗口),镜像保留的是较旧的状态。该窗口很短,正常操作下只有毫秒级,但在突发故障情形下,它可能是唯一干净的副本。
除这些情形外,把 $MFTMirr 视作你按例采集(KAPE 会替你做)、但很少需要去看的东西。
常见问题
$MFTMirr 与整个 MFT 的备份是一回事吗?
不是。它只包含前几条记录(系统元数据文件)。用户文件不被镜像。
我能用解析 $MFT 的同一套工具去解析 $MFTMirr 吗?
可以。它在结构上完全相同:同样的记录格式、同样的 fixup 数组、同样的属性。把它扔进 浏览器解析器,或喂给 MFTECmd 都行。
我能删除或移动 $MFTMirr 吗?
不行。和 $MFT 一样,它在 Windows 运行时被锁定。完全禁用镜像不是受支持的操作;chkdsk 会拒绝该卷。
如果我的盘没有 $MFTMirr 会怎么样?
它一定有。每个 NTFS 卷在格式化时都会创建一个。如果 $MFTMirr 缺失或不可读,说明卷已经严重损坏,chkdsk 会失败。
延伸阅读
- Microsoft,NTFS Reserved Files。前 16 条记录中元数据文件的官方目录。
- linux-ntfs 项目的 $MFTMirr 笔记。从解析器实现者视角对镜像作用的实务讲解。
- Brian Carrier,File System Forensic Analysis。关于 NTFS 元数据文件的章节解释了挂载时的恢复路径。