FAT(File Allocation Table)与 NTFS 解决的是同一个问题 —— 跟踪每个簇属于哪个文件 —— 但解答方式天差地别。对取证分析师来说,两者的差距,是「我们知道某个文件曾经存在」与「我们依然几乎对它一清二楚」之间的差距。
FAT 的工作方式
FAT 维护一张表,其中每个表项把一个簇映射到下面之一:
- 文件的下一个簇
- 链结束标记
- 值
0,表示「空闲」
由一个单独的目录项把文件名和第一个簇关联起来。读文件时沿着链走;删除文件时,FAT 把所有簇表项清零,并把目录项里文件名的首字符替换为 0xE5。剩下的还在 —— 但只剩剩下:链本身已被破坏。你可以找回第一个簇和部分文件名,但通往后续簇的连接已不复存在。
正因如此,FAT 恢复工具在处理碎片化文件时举步维艰。它们能找到碎片,却拼不回去。
NTFS 的工作方式
NTFS 用主文件表代替了分配表 —— 这是一个单一文件,其中其他每个文件都至少有一条 1024 字节的记录来描述它。每条记录是一个带类型属性的小型容器:$STANDARD_INFORMATION、$FILE_NAME、$DATA、$INDEX_ROOT 等等。
关键在于:$DATA 并不是只指向第一个簇,而是带着一个完整的 runlist —— 一串 (起始簇, 长度) 的对,覆盖了文件的每一个碎片。删除一个文件并不会破坏这张表。
这对取证带来什么变化
- 被删除文件的 runlist 一直保留,直到 MFT 槽位被复用为止 —— 即使是高度碎片化的文件也能被重建。
- 每条记录八个时间戳(SI 四个、FN 四个),提供了 FAT 给不了的相互佐证。
- 小文件的常驻数据意味着,可以在完全不触碰数据区的情况下完成恢复。
- 日志(
$UsnJrnl、$LogFile)留下了 FAT 根本不记录的审计痕迹。
如果同一事件的 FAT 镜像和 NTFS 镜像摆在面前任你选,NTFS 几乎总能回答更多问题。
你仍然会遇到 FAT 的地方
FAT 并未消亡。你依然会在以下地方碰到它:
- 工厂格式化的 U 盘;
- 大多数 Windows 安装的 EFI 系统分区;
- 相机和嵌入式设备的 SD 卡。
但在任何一台现代 Windows 机器的系统卷上,你面对的就是 NTFS —— 而 $MFT 就是你的起点。