用python拆解 - 没有简单的解决方案?

时间:2010-02-07 13:02:20

标签: python swig disassembly

我正在尝试创建一个python脚本,它将反汇编二进制文件(确切地说是一个Windows exe)并分析其代码。 我需要能够获取某个缓冲区,并提取某种包含有关其中指令信息的结构。

我之前在C中使用过libdisasm,我发现它的界面非常直观和舒适。 问题是,它的Python接口只能通过SWIG获得,我无法在Windows下正确编译。

在可用性方面,diStorm提供了一个非常好的开箱即用接口,但它只提供每条指令的助记符,而不是一个二进制结构,其枚举定义了指令类型,而不是。 这对我的目的来说非常不舒服,并且需要很多我所看到的用于包装界面的时间以使其符合我的需要。

我也看过BeaEngine,它实际上提供了我需要的输出,一个带有关于每条指令的二进制信息的结构,但它的界面非常奇怪且反直觉,当它提供时它会立即崩溃错误的论点。 CTypes类似于终极死亡到你的python崩溃。

所以,我很高兴听到其他解决方案,这比使用djgcc或mingw来制作SWIGed libdisasm或为diStorm编写OOP包装器要少一些时间。 如果有人对如何编译SWIGed libdisasm或者更好的编译二进制文件(pyd或dll + py)有一些指导,我很乐意听到/拥有它。 :)

非常感谢。

4 个答案:

答案 0 :(得分:2)

好吧,经过多次干预,我设法编译了SWIGed libdisasm! 不幸的是,它似乎在不正确(有时是正确的)用法上崩溃python。 我是怎么做到的:

  1. 我使用Visual Studio 6编译了libdisasm.lib,你唯一需要的就是你使用的libdisasm版本中的源代码,以及stdint.h和inttypes.h(Visual C ++兼容版本,google)。
  2. 我使用以下命令行SWIGed给定的libdisasm_oop.i文件

    swig -python -shadow -o x86disasm_wrap.c -outdir。 libdisasm_oop.i

  3. 使用Cygwin在libdisasm根目录中运行./configure。你从中得到的唯一真实的东西是config.h

  4. 然后我创建了一个新的DLL项目,向其中添加了x86disasm_wrap.c,将c:\ PythonXX \ libs和c:\ PythonXX \ Include文件夹添加到相应的变量中,设置为Release配置(重要的,要么这个或在包含python.h之前做#undef _DEBUG)。 此外,您可能需要修复config.h的路径。

  5. 编译DLL项目,并将输出命名为_x86disasm.dll。 将它放在与SWIG生成的x86disasm.py相同的文件夹中,然后就完成了。

  6. 有关python的其他更少崩溃的灾难库的建议吗?

答案 1 :(得分:2)

您可以尝试使用ctypes直接与libdisasm接口,而不是通过SWIG层。可能需要更多的开发时间,但AFAIK应该能够使用ctypes访问底层功能。

答案 2 :(得分:2)

我建议您查看Pym's disassembly library,它也是Pym's online disassembler的后端。

答案 3 :(得分:1)