使用Python解析二进制文件

时间:2011-08-21 20:51:36

标签: python binaryfiles

作为一个副项目,我想尝试解析二进制文件(具体是Mach-O文件)。我知道已存在的工具(otool),所以请考虑这是一个学习练习。

我遇到的问题是我不明白如何将发现的二进制元素转换为python表示。例如,Mach-O文件格式以标题开头,标题由C Struct定义。第一项是uint_32'魔数'字段。当我做的时候

magic = f.read(4)

我得到了

b'\xcf\xfa\xed\xfe'

这开始对我有意义。它实际上是一个4字节的字节数组。但是我想把它当作一个4字节的int来表示原始的幻数。另一个例子是numberOfSections字段。我只想要由4字节字段表示的数字,而不是文字字节数组。

也许我在想这一切都错了。有没有人在做类似的事情?我是否需要编写函数来查看这些4字节字节数组并移位并组合它们的值以产生我想要的数字?恩赐会让我在这里搞砸吗?任何指针都会非常有用。

4 个答案:

答案 0 :(得分:14)

查看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'

答案 1 :(得分:9)

Kaitai Struct project解决了这个问题。首先,您使用.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

他们有growing repository of file format specs。它没有Mach-O文件格式规范(但是?),但是有一些复杂的格式,比如Java .class或者那里描述的Microsoft的PE可执行文件,所以我想这不应该是编写规范的主要问题Mach-O格式也是如此。

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

PE executable format

答案 2 :(得分:3)

我建议使用Construct模块。它提供了一个非常高级的界面。

答案 3 :(得分:2)

我前段时间写了一个代码配方,旨在简化这种语法。看看它是否有帮助:

http://code.activestate.com/recipes/577610-decoding-binary-files/?in=user-4175703