#mft #file #user #data #bodyfile #parses #usn-jrnl

程序+库 mft2bodyfile

解析 MFT 文件到 bodyfile(标准输出)

13 个版本

0.8.0 2023 年 5 月 8 日
0.7.1 2022 年 11 月 18 日
0.7.0 2022 年 2 月 16 日
0.6.10 2021 年 12 月 24 日
0.4.2 2021 年 5 月 17 日

#6 in #解析

自定义许可证

47KB
941

Crate Crates.io (latest) Codecov

mft2bodyfile

解析 MFT 文件(可选地解析对应的 $UsnJrnl)到 bodyfile

安装

cargo install mft2bodyfile

用法

USAGE:
    mft2bodyfile [FLAGS] [OPTIONS] <MFT_FILE>

FLAGS:
    -h, --help                  Prints help information
        --journal-long-flags    don't remove the USN_REASON_ prefix from the $UsnJrnl reason output
    -V, --version               Prints version information

OPTIONS:
    -J, --journal <journal>    path to $UsnJrnl $J file (optional)
    -O, --output <output>      name of destination file (or '-' to write to stdout)

ARGS:
    <MFT_FILE>    path to $MFT

示例

mft2bodyfile '$MFT' -J '$UsnJrnl_$J' >mft.bodyfile
mactime -b mft.bodyfile -d >mft.csv

我为什么要开始这个项目?

到目前为止,我和我的团队在收到客户的三级分类数据时,使用 analyze_mft.py$MFT 中提取数据。不幸的是,analyze_mft.py 有一些缺点

  • 需要 python2
  • 用于生成时间戳的属性要么是 $STANDARD_INFORMATION,要么是 $FILE_NAME,但不是同时两者。这总是要求我们合并两个输出,这有点混乱
  • 我们有时会遇到解析 $MFT 的问题

因此,我们最初开始对 analyze_mft.py 进行工作以修复我们的抱怨,但当我们发现一个额外的缺点时,我们很快就陷入了困境

  • 如果一个文件的 $FILE_NAME 属性没有存储在其基本条目中,而是在某个非基本条目中,该条目由 $ATTRIBUTE_LIST 属性引用,那么这个文件将不会显示在 bodyfile 中。

你可能认为“非基本MFT条目没有$FILE_NAME和$STANDARD_INFORMATION属性”,正如Brian Carrier在他的大书中所说。但我们发现这确实发生了。进一步的调查表明,几乎所有快速简单的工具都存在同样的问题。因此,这就是我们编写自己工具的最后一部分。

这个工具有什么优势?

  • analyze_mft.py快得多
  • 正确处理具有非基本属性条目,即使它们存储在非持久$ATTRIBUTE_LIST条目中。
  • 可以组合$MFT$UsnJrnl数据

显示哪些信息?

$UsnJrnl记录

文件$UsnJrnl(更新序列号日志的缩写)包含一系列条目,其中每个条目都记录了文件元数据的更改。

以下数据会显示

字段 描述
$UsnJrnl 显示条件:对于从$UsnJrnl文件提取的每个条目
filename 显示条件:如果$MFT中找到的文件名与$UsnJrnl中找到的文件名不同,或者如果$MFT不包含此文件的$FILENAME属性
parent 显示条件:如果$MFT中的父引用与$FILENAME属性中的父引用不同,或者如果$MFT不包含此文件的$FILENAME属性
原因 标识自文件或目录打开以来在此文件或目录日记记录中累积的变化原因的标志。 (https://docs.microsoft.com/de-de/windows/win32/api/winioctl/ns-winioctl-usn_record_v2)

示例:文件已被重命名

Tue Aug 31 2021 10:48:42,16,macb,0,0,0,335695,"/Users/tmpadmin/AppData/Local/Microsoft/Edge/User Data/Default/Local Storage/leveldb/CURRENT ($UsnJrnl filename=000001.dbtmp reason=RENAME_OLD_NAME)"

示例:文件被移动到不同的文件夹(并重命名)

Tue Aug 31 2021 10:49:50,0,macb,0,0,0,336826,"/Users/tmpadmin/AppData/Local/Microsoft/Edge/User Data/CertificateRevocation/6498.2021.5.1 ($UsnJrnl filename=8244_1963452067 parent='/Users/tmpadmin/AppData/Local/Temp' reason=CLOSE+FILE_CREATE)"
Tue Aug 31 2021 10:49:50,0,macb,0,0,0,336826,"/Users/tmpadmin/AppData/Local/Microsoft/Edge/User Data/CertificateRevocation/6498.2021.5.1 ($UsnJrnl filename=8244_1963452067 parent='/Users/tmpadmin/AppData/Local/Temp' reason=FILE_CREATE)"
Tue Aug 31 2021 10:49:51,0,macb,0,0,0,336826,"/Users/tmpadmin/AppData/Local/Microsoft/Edge/User Data/CertificateRevocation/6498.2021.5.1 ($UsnJrnl filename=8244_1963452067 parent='/Users/tmpadmin/AppData/Local/Temp' reason=RENAME_OLD_NAME)"

此工具的限制是什么?

考虑以下情况:您有一个文件,其属性列表非常长,以至于无法存储在基本条目中。然后,使用一个或多个附加条目。如果此类文件被删除,并且基本条目被用于另一个文件,我们只能看到曾经存在一个文件(使用非基本条目),但我们无法看到原始文件名。此外,如果我们无法看到 $FILENAME 属性,我们也无法看到具有更低属性 ID 的 $STANDARD_INFORMATION 属性。因此,我们看到一些文件曾经存在,但既看不到其名称也看不到任何时间戳。

如果您提供了一个 $UsnJrnl:$J 文件,那么 mft2bodyfile 很可能可以找到文件名和一些时间戳,即使是从已删除的文件中。

参考

依赖项

~14-25MB
~316K SLoC