如何有效识别未知文件格式

Posted

技术标签:

【中文标题】如何有效识别未知文件格式【英文标题】:How do I effectively identify an unknown file format 【发布时间】:2018-09-21 02:57:38 【问题描述】:

我想写一个解析 yum 配置文件的程序。这些文件如下所示:

[google-chrome]
name=google-chrome - 64-bit
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

这种格式看起来很容易解析,但我不想重新发明***。如果有一个可以通用解析这种格式的现有库,我想使用它。 但是如何为您无法命名的东西找到一个库? 文件扩展名在这里没有帮助。术语“.repo”不会产生任何与 yum 本身相关的一般结果。

那么,请教我如何钓鱼: 如何有效地找到我不知道的文件格式的名称?

【问题讨论】:

欢迎在reverseengineering.stackexchange.com提出逆向工程问题 【参考方案1】:

识别未知的文件格式可能会很痛苦。 但是你有一些选择。我将从一个非常明显的开始。

向其他人展示该格式可能是找出其名称的最佳方式。 有人可能会认出它。如果没有人这样做,很有可能 您面前有一个专有的文件格式。

如果是您的 yum 存储库文件,我会说它是一个普通的旧 INI 文件。 但让我们对此进行更多研究。

逆向工程

如果没有人认可您的格式,逆向工程可能是您的最佳选择。 获取参考实现并找出他们使用什么来解析格式。 幸运的是,yum 是开源的。所以很容易查到。 让我们看看 yum 作者用什么来解析他们的 repo 文件:

try:
    ini = INIConfig(open(repo.repofile))
except:
    return None

https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L1304

现在这个函数的导入可以在这里找到:

from iniparse import INIConfig

https://github.com/rpm-software-management/yum/blob/master/yum/config.py#L32

这将我们引向一个名为 iniparse (https://pypi.org/project/iniparse/) 的库。 所以 yum 对其配置文件使用 INI 解析器。

我将向您展示如何快速导航到这些代码段落 因为在一些大型项目中导航可能会令人生畏。

我使用一个名为 ripgrep (https://github.com/BurntSushi/ripgrep) 的工具。 我最初的锚点通常是众所周知的文件路径。如果是 yum,我使用 /etc/yum.repos.d 进行初步搜索:

# assuming you are in the root directory of yum's source code
rg /etc/yum.repos.d yum
yum/config.py
769:    reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d'])

yum/__init__.py
556:        # (typically /etc/yum/repos.d)

这将其缩小到两个文件。如果您继续使用 readparse 等术语, 你会很快找到你想要的结果。

如果没有参考来源怎么办?

嗯,有时,您无法访问参考实现的源代码。例如:参考实现是闭源的。 尝试打破格式。插入一些垃圾,然后观察日志文件。如果你幸运的话,你可能会发现 一条有用的错误消息,可能会为您提供有关格式的提示。 如果你觉得很勇敢,你也可以尝试使用真正的反编译器。这可能是也可能不是非法的,可能是也可能不是浪费时间。 我个人只会将此作为最后的手段。

【讨论】:

以上是关于如何有效识别未知文件格式的主要内容,如果未能解决你的问题,请参考以下文章

如何删除取消win7系统文件的“始终使用选择的程序打开这种文件”,让原类别文件恢复默认的未知格式?

如何检查数据/有效载荷是否可以被protobuf解码

Flume 推文的未知文件格式

如何创建有效的 Avro 格式文件 nodejs

如何在C或C++中读取识别html格式文件

qcachegrind 错误:未知的文件格式。从 php xdebug 生成的文件