取证调查常常围绕着一个问题打转:这个文件是否在这台电脑上出现过?不是「它现在还在不在磁盘里?」—— 那是 dir 的事。难一点的版本是:能不能证明它昨天、上周、去年曾经在过?在 NTFS 卷上,这个问题最有力的回答通常就是 $MFT。
删除之后还留下什么
在 NTFS 上删除一个文件,只会把它 MFT 记录里的「使用中」位置零,记录的其余部分依然在。这条记录承载:
- 完整文件名(在
$FILE_NAME中); - 父目录的引用;
- 四个时间戳(创建、修改、访问、MFT 修改)—— 在 SI 和 FN 中各有一份,合共两套;
- 逻辑大小与物理大小;
- 小文件的话,完整的内容(常驻的
$DATA); - 大文件的话,曾经承载数据的簇的 runlist。
每一项都是直接的证据。一条已删除的 MFT 记录,如果 $FILE_NAME = secret-plan.docx、父目录是 \Users\bob\Documents、SI 创建时间是 2024-11-03T14:02:11Z,就证明了在那一天确实有一个叫这个名字的文件存在于那个目录里 —— 与今天 dir 显示什么无关。
它作为证据的强度
三个性质让 MFT 记录成为强有力的取证证据:
- NTFS 自己写入它们。在正常的 Windows 工具下,用户无法编辑这些字段。除非整张
$MFT都被伪造 —— 那是非常艰巨的任务 —— 否则被告很难主张它们是被人种下的。 - 八个时间戳互相印证。手动改动通常会留痕:SI 被改而 FN 没动,就是时间篡改的经典签名。
$UsnJrnl与$LogFile形成佐证。如果$MFT说某文件在时间 T 被创建,变更日志理应在同一时刻记录这次创建事件。差异本身就是证据。
$MFT 单独无法证明的事
$MFT 能证明某个文件在某个特定目录、某个特定时间存在过。它不能证明:
- 是谁创建或访问过它 —— 那需要 Security 事件日志;
- 是哪个程序产生了它 —— Prefetch 和 ShimCache 能补这一块;
- 大文件里装的内容是什么 —— 除非把数据簇也恢复出来;
- 用户是否真的打开过它 —— Jump List 和 LNK 文件更有用。
一份完整的回答,通常要把 $MFT 与周边的取证物拼起来用。但 $MFT 是基石 —— 没有它,其他证据就没有可以扎根的地基。