如何有效识别未知文件格式
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)
这将其缩小到两个文件。如果您继续使用 read
或 parse
等术语,
你会很快找到你想要的结果。
如果没有参考来源怎么办?
嗯,有时,您无法访问参考实现的源代码。例如:参考实现是闭源的。 尝试打破格式。插入一些垃圾,然后观察日志文件。如果你幸运的话,你可能会发现 一条有用的错误消息,可能会为您提供有关格式的提示。 如果你觉得很勇敢,你也可以尝试使用真正的反编译器。这可能是也可能不是非法的,可能是也可能不是浪费时间。 我个人只会将此作为最后的手段。
【讨论】:
以上是关于如何有效识别未知文件格式的主要内容,如果未能解决你的问题,请参考以下文章