作为一个副项目,我想尝试解析二进制文件(具体是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字节字节数组并移位并组合它们的值以产生我想要的数字?恩赐会让我在这里搞砸吗?任何指针都会非常有用。
答案 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格式也是如此。
它实际上比Construct或Hachoir更好,因为它是编译的(而不是解释的),因此它更快,并且它包括许多其他有用的工具,如可视化工具或格式图制作者。例如,这是PE可执行格式的生成说明图:
答案 2 :(得分:3)
我建议使用Construct模块。它提供了一个非常高级的界面。
答案 3 :(得分:2)
我前段时间写了一个代码配方,旨在简化这种语法。看看它是否有帮助:
http://code.activestate.com/recipes/577610-decoding-binary-files/?in=user-4175703