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 行
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