作为一个副项目,我想尝试解析二进制文件(特别是Mach-O文件) . 我知道已存在的工具(otool),所以请考虑这是一个学习练习 .
我遇到的问题是我不明白如何将发现的二进制元素转换为python表示 . 例如,Mach-O文件格式以 Headers 开头, Headers 由C Struct定义 . 第一项是uint_32'魔数'字段 . 当我做
magic = f.read(4)
我明白了
b'\xcf\xfa\xed\xfe'
这开始对我有意义 . 它实际上是一个4字节的字节数组 . 但是我想把它当作一个4字节的int来表示原始的幻数 . 另一个例子是numberOfSections字段 . 我只想要由4字节字段表示的数字,而不是文字字节数组 .
也许我正在考虑这一切都错了 . 有没有人在做类似的事情?我是否需要编写函数来查看这些4字节字节数组并移位并组合它们的值以产生我想要的数字?恩赐会让我在这里搞砸吗?任何指针都会非常有用 .
4 回答
看看struct模块:
有Kaitai Struct project解决了这个问题 . 首先,使用.ksy规范描述某种文件格式,然后将其编译成Python库(或者,实际上是任何其他主要编程语言的库),
import
它,瞧,解析归结为:他们有growing repository of file format specs . 它没有Mach-O文件格式规范(但是?),但是像Java
.class
或Microsoft _1715795这样的复杂格式也是为Mach-O格式编写规范的主要问题 .它实际上比Construct或Hachoir更好,因为它更快,并且它包括许多其他有用的工具,如可视化工具或格式图制作者 . 例如,这是PE可执行格式的生成说明图:
我会采用Construct模块 . 它提供了一个非常高级别的界面 .
我前段时间写了一个代码配方,旨在简化这种语法 . 看看它是否有帮助:
http://code.activestate.com/recipes/577610-decoding-binary-files/?in=user-4175703