使用Python解析二进制文件

13
作为一个副业项目,我想尝试解析二进制文件(特别是Mach-O文件)。我知道已经存在用于此的工具(例如otool),因此将其视为学习练习。
我遇到的问题是我不知道如何将找到的二进制元素转换为Python表示形式。例如,Mach-O文件格式以由C结构定义的头部开始。第一项是uint_32的“魔术数字”字段。 当我执行以下操作时:
magic = f.read(4)

我明白了

b'\xcf\xfa\xed\xfe'

我开始理解它的意思了。它实际上是一个由四个字节组成的字节数组。但是我想将其视为代表原始魔数的四字节整数。还有一个例子是numberOfSections字段。我只想要表示为四字节字段的数字,而不是一组文字字节。

也许我对此的想法完全错误。有人做过类似的事情吗?我需要编写函数来查看这些四字节的字节数组,移位并合并它们的值以生成我想要的数字吗?大小端会对我造成问题吗?任何指针都将非常有帮助。


我之前写过一份代码,旨在简化这个语法。看看它是否有所帮助:http://code.activestate.com/recipes/577610-decoding-binary-files/?in=user-4175703 - Yony
3个回答

15

看看struct模块:

In [1]: import struct

In [2]: magic = b'\xcf\xfa\xed\xfe'

In [3]: decoded = struct.unpack('<I', magic)[0]

In [4]: hex(decoded)
Out[4]: '0xfeedfacf'

12

有一个Kaitai Struct项目可以解决这个问题。首先,您使用.ksy规范描述某个文件格式,然后将其编译为Python库(或实际上是任何其他主要编程语言中的库),import它,然后解析就完成了:

from mach_o import MachO
my_file = MachO.from_file("/path/to/your/file")
my_file.magic # => 0xfeedface
my_file.num_of_sections # => some other integer
my_file.sections # => list of objects that represent sections

他们拥有一个日益增长的文件格式规范库。目前还没有Mach-O文件格式规范(还没有吗?),但是那里有像Java .class或Microsoft的PE可执行文件这样的复杂格式的描述,所以我想编写Mach-O格式规范应该不是什么大问题。

实际上,它比ConstructHachoir更好,因为它是编译的(而不是解释的),因此更快,并且包括大量其他有用的工具,如可视化器或格式图表制作器。例如,这是PE可执行文件格式的生成解释图表:

PE executable format


The Construct文档包含两者的比较。Kaitai更快,但是在我看来,Kaitai目前不支持构建结构体,只支持解析,这是一个相当大的缺点。因此,我不会称其中一个比另一个“更好”。 - Lynn

5
我建议使用Construct模块。它提供了非常高级的接口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接