← 返回博客

证明某个文件曾经存在于一台 Windows 系统上

· 阅读 1 分钟

取证调查常常围绕着一个问题打转:这个文件是否在这台电脑上出现过?不是「它现在还在不在磁盘里?」—— 那是 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 记录成为强有力的取证证据:

  1. NTFS 自己写入它们。在正常的 Windows 工具下,用户无法编辑这些字段。除非整张 $MFT 都被伪造 —— 那是非常艰巨的任务 —— 否则被告很难主张它们是被人种下的。
  2. 八个时间戳互相印证。手动改动通常会留痕:SI 被改而 FN 没动,就是时间篡改的经典签名。
  3. $UsnJrnl$LogFile 形成佐证。如果 $MFT 说某文件在时间 T 被创建,变更日志理应在同一时刻记录这次创建事件。差异本身就是证据。

$MFT 单独无法证明的事

$MFT 能证明某个文件在某个特定目录、某个特定时间存在过。它不能证明:

  • 是谁创建或访问过它 —— 那需要 Security 事件日志;
  • 是哪个程序产生了它 —— Prefetch 和 ShimCache 能补这一块;
  • 大文件里装的内容是什么 —— 除非把数据簇也恢复出来;
  • 用户是否真的打开过它 —— Jump List 和 LNK 文件更有用。

一份完整的回答,通常要把 $MFT 与周边的取证物拼起来用。但 $MFT 是基石 —— 没有它,其他证据就没有可以扎根的地基。

外部资源