一个递归映射文件结构的实用程序。
项目描述
PolyFile
一个用于识别和映射文件语义和句法结构的实用程序,包括多语言、混合体和精神分裂文件。它具有libmagic的纯Python实现,可以作为file
命令的替代品。然而,与file
不同,PolyFile可以递归地识别嵌入式文件,如binwalk。
PolyFile可以与其姐妹工具PolyTracker结合使用,进行自动词法注释和解析器导航,这是一个仅为将工具集体称为ALAN解析器项目而设计的缩写。
快速入门
您可以从PyPI安装PolyFile的最新稳定版本
pip3 install polyfile
要从源安装PolyFile,在与此README相同的目录下运行
pip3 install .
重要:在从源安装之前,请确保已安装Java。Java用于运行Kaitai Struct编译器,该编译器编译文件格式定义。
该程序将自动将 polyfile
和 polymerge
可执行文件安装到您的路径中。
用法
在没有任何参数的情况下运行 polyfile
将模拟 file --keep-going
的行为
$ polyfile png-polyglot.png
PNG image data, 256 x 144, 8-bit/color RGB, non-interlaced
Brainfu** Program
Malformed PDF
PDF document, version 1.3, 1 pages
ZIP end of central directory record Java JAR archive
要为文件生成交互式十六进制查看器,请使用 --html
选项
$ polyfile --html output.html png-polyglot.png
Found a file of type application/pdf at byte offset 0
Found a file of type application/x-brainfuck at byte offset 0
Found a file of type image/png at byte offset 0
Found a file of type application/zip at byte offset 0
Found a file of type application/java-archive at byte offset 0
Saved HTML output to output.html
运行 polyfile --help
获取完整的用法说明。
交互式调试器
PolyFile 具有交互式调试器,用于其文件匹配和解析。它可以用来调试 libmagic 模式定义,确定为什么某个特定文件无法被分类为预期的 MIME 类型,或者逐步通过解析器。您可以使用 -db
选项开启调试器来运行 PolyFile。
文件支持
PolyFile 具有干净的、纯 Python 实现的 libmagic 文件分类器,并支持它可以识别的所有 263 种 MIME 类型。
它目前支持解析和语义映射以下格式
- PDF,使用 Didier Stevens 的公共领域、许可的取证解析器的一个仪表化版本(Didier Stevens' public domain, permissive, forensic parser)
- ZIP,包括递归识别所有 ZIP 内容
- JPEG/JFIF,使用其 Kaitai Struct 语法
- iNES
- 任何其他格式,在 KSY 语法 中指定
要运行一个练习所有这些文件格式的示例,请运行
curl -v --silent https://www.sultanik.com/files/ESultanikResume.pdf | polyfile --html ESultanikResume.html -
在 PolyFile 0.3.0 版本之前,它使用 TrID 数据库 进行文件识别,而不是 libmagic 文件定义。这证明非常慢(因为 TrID 有许多重复条目)并且容易产生误报(因为 TrID 的文件定义比 libmagic 的简单得多)。原始的 TrID 匹配代码仍然与 PolyFile 一起提供,可以通过编程方式调用,但默认情况下不使用。
输出格式
PolyFile 有几个输出结果的选项,通过其 --format
选项指定。对于计算机可读的输出,PolyFile 有一个 SBuD JSON 格式的扩展,这在文档中进行了描述。在版本 0.5.0 之前,这是 PolyFile 的默认输出格式。然而,现在默认输出格式是模仿 file
命令的行为。要维持原始行为,请使用 --format sbud
选项。
libmagic 实现
PolyFile 具有对 libmagic(在 file
命令中使用) 的干净实现。可以通过运行
from polyfile.magic import MagicMatcher
with open("file_to_test", "rb") as f:
# the default instance automatically loads all file definitions
for match in MagicMatcher.DEFAULT_INSTANCE.match(f.read()):
for mimetype in match.mimetypes:
print(f"Matched MIME: {mimetype}")
print(f"Match string: {match!s}")
来加载特定的或自定义的文件定义
list_of_paths_to_definitions = ["def1", "def2"]
matcher = MagicMatcher.parse(*list_of_paths_to_definitions)
with open("file_to_test", "rb") as f:
for match in matcher.match(f.read()):
...
扩展 PolyFile
有关如何使用新的匹配器和解析器扩展 PolyFile 以支持更多文件格式的说明,请参阅[文档](in the documentation)。
许可证和致谢
这项研究由 Trail of Bits 开发,由国防高级研究计划局(DARPA)在 SafeDocs 计划下为 Galois 的分包商提供资金。它根据 Apache 2.0 许可证 许可。© 2019,Trail of Bits。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。