首页 文章

使用Python解析二进制文件

提问于
浏览
10

作为一个副项目,我想尝试解析二进制文件(特别是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 回答

  • 3

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

    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 _1715795这样的复杂格式也是为Mach-O格式编写规范的主要问题 .

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

    PE executable format

  • 13

    我会采用Construct模块 . 它提供了一个非常高级别的界面 .

  • 2

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

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

相关问题