使用Python反汇编 - 没有简单的解决方案?
我正在尝试创建一个Python脚本,用来拆解一个二进制文件(具体来说是Windows的exe文件)并分析它的代码。 我需要能够处理某个缓冲区,并提取出一种结构体,里面包含关于指令的信息。
我之前在C语言中使用过libdisasm,觉得它的接口非常直观和舒适。 问题是,它在Python中的接口只能通过SWIG来使用,而我在Windows下无法正确编译它。
在可用性方面,diStorm提供了一个很不错的现成接口,但它只提供每条指令的助记符,并没有一个包含指令类型等定义的二进制结构体。 这对我来说很不方便,我觉得这会浪费很多时间去包装这个接口,以便让它符合我的需求。
我还看过BeaEngine,它确实提供了我需要的输出,包含每条指令的二进制信息的结构体,但它的接口真的很奇怪,不太直观,而且当提供错误的参数时几乎会立刻崩溃。 这就像是CTypes那种让你的Python崩溃的终极方式。
所以,我很想听听其他解决方案,这些方案比折腾djgcc或mingw来制作SWIG的libdisasm,或者为diStorm编写一个面向对象的包装器要省时一些。 如果有人能指导我如何编译SWIG的libdisasm,或者更好的是,提供一个已经编译好的二进制文件(pyd或dll+py),我会非常感激。:)
提前谢谢大家。
4 个回答
我建议你看看 Pym的反汇编库,这个库也是 Pym在线反汇编工具 的后台支持。
经过一番折腾,我终于成功编译了SWIG的libdisasm库!不过不幸的是,它在使用不当(有时候即使使用正确)时会导致Python崩溃。下面是我怎么做到的:
- 我使用Visual Studio 6编译了libdisasm.lib,所需的只是你所用的libdisasm版本的源代码,还有两个文件:stdint.h和inttypes.h(要找与Visual C++兼容的版本,可以在网上搜索一下)。
我用以下命令行对提供的libdisasm_oop.i文件进行了SWIG处理:
swig -python -shadow -o x86disasm_wrap.c -outdir . libdisasm_oop.i
然后我使用Cygwin在libdisasm的根目录下运行了./configure。这个步骤主要是为了生成一个config.h文件。
接着我创建了一个新的DLL项目,把x86disasm_wrap.c添加进去,并将c:\PythonXX\libs和c:\PythonXX\Include文件夹添加到相应的变量中,设置为Release配置(这很重要,或者在包含python.h之前加上#undef _DEBUG)。另外,你可能还需要修正config.h的路径。
编译了DLL项目,并将输出命名为_x86disasm.dll。把这个文件放在与SWIG生成的x86disasm.py同一个文件夹里,这样就完成了。
有没有其他建议,推荐一些崩溃率低的Python反汇编库呢?
你可以试试用 ctypes 直接和 libdisasm 进行交互,而不是通过 SWIG 这个中间层。这样可能需要花更多的时间来开发,但据我所知,你应该可以通过 ctypes 访问到底层的功能。