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

时间:2018-09-21 02:57:38

标签: format reverse-engineering

我想编写一个解析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

这种格式看起来很容易解析,但是我不想重蹈覆辙。如果有一个可以通用解析此格式的现有库,我想使用它。 但是,如何为您无法命名的内容找到一个库? 文件扩展名在这里没有帮助。 yum本身并不会产生任何一般结果。

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

1 个答案:

答案 0 :(得分: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之类的术语, 您将快速找到所需的结果。

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

有时候,您无权访问参考实现的源代码。例如:参考实现是封闭源。 尝试破坏格式。插入一些垃圾,然后观察日志文件。如果幸运的话,您可能会发现 有用的错误消息,可能会给您有关格式的提示。 如果您觉得自己很勇敢,也可以尝试使用实际的反编译器。这可能是非法的,也可能不是非法的,也可能不是浪费时间。 我个人只会在万不得已时这样做。