7

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

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

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

我还查看了 BeaEngine,它实际上提供了我需要的输出,一个包含有关每条指令的二进制信息的结构,但它的接口非常奇怪且违反直觉,并且当提供错误的参数时它会立即崩溃。CTypes 会导致你的 python 崩溃。

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

提前谢谢。

4

4 回答 4

2

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

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

    痛饮 -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 文件夹添加到相应的变量中,设置为发布配置(重要的是,无论是这个还是执行 #undef _DEBUG在包括 python.h 之前)。此外,您可能需要修复 config.h 的路径。

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

对 python 的其他不那么崩溃的 disasm 库有什么建议吗?

于 2010-02-07T15:25:52.257 回答
2

我建议您查看Pym 的反汇编库,它也是Pym 在线反汇编程序的后端。

于 2010-05-11T10:12:42.067 回答
2

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

于 2010-02-07T18:35:21.343 回答
1

您可以使用 distorm 库:https ://code.google.com/p/distorm/

这是另一个构建:http ://breakcode.wordpress.com/2009/08/31/using-distorm-with-python-2-6-and-python-3-x-revisited/

还有 BeaEngine:http ://www.beaengine.org/

这是 BeaEngine 的 Windows 安装程序:http: //breakcode.wordpress.com/2012/04/08/quickpost-installer-for-beaenginepython/

于 2012-04-08T19:58:57.490 回答