跳转到主要内容

一个递归映射文件结构的实用程序。

项目描述

PolyFile


PyPI version Tests Slack Status

一个用于识别和映射文件语义和句法结构的实用程序,包括多语言、混合体和精神分裂文件。它具有libmagic的纯Python实现,可以作为file命令的替代品。然而,与file不同,PolyFile可以递归地识别嵌入式文件,如binwalk

PolyFile可以与其姐妹工具PolyTracker结合使用,进行自动词法注释和解析器导航,这是一个仅为将工具集体称为ALAN解析器项目而设计的缩写。

快速入门

您可以从PyPI安装PolyFile的最新稳定版本

pip3 install polyfile

要从源安装PolyFile,在与此README相同的目录下运行

pip3 install .

重要:在从源安装之前,请确保已安装Java。Java用于运行Kaitai Struct编译器,该编译器编译文件格式定义。

该程序将自动将 polyfilepolymerge 可执行文件安装到您的路径中。

用法

在没有任何参数的情况下运行 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 类型。

它目前支持解析和语义映射以下格式

要运行一个练习所有这些文件格式的示例,请运行

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。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

polyfile-0.5.4.tar.gz (6.0 MB 查看哈希值)

上传时间 源代码

构建分发

polyfile-0.5.4-py3-none-any.whl (1.7 MB 查看哈希值)

上传时间 Python 3

支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误记录StatusPageStatusPage状态页面