我正在尝试创建一个python脚本,它将反汇编二进制文件(确切地说是一个Windows exe)并分析其代码。 我需要能够获取某个缓冲区,并提取某种包含有关其中指令信息的结构。
我之前在C中使用过libdisasm,我发现它的界面非常直观和舒适。 问题是,它的Python接口只能通过SWIG获得,我无法在Windows下正确编译。
在可用性方面,diStorm提供了一个非常好的开箱即用接口,但它只提供每条指令的助记符,而不是一个二进制结构,其枚举定义了指令类型,而不是。 这对我的目的来说非常不舒服,并且需要很多我所看到的用于包装界面的时间以使其符合我的需要。
我也看过BeaEngine,它实际上提供了我需要的输出,一个带有关于每条指令的二进制信息的结构,但它的界面非常奇怪且反直觉,当它提供时它会立即崩溃错误的论点。 CTypes类似于终极死亡到你的python崩溃。
所以,我很高兴听到其他解决方案,这比使用djgcc或mingw来制作SWIGed libdisasm或为diStorm编写OOP包装器要少一些时间。 如果有人对如何编译SWIGed libdisasm或者更好的编译二进制文件(pyd或dll + py)有一些指导,我很乐意听到/拥有它。 :)
非常感谢。
答案 0 :(得分:2)
好吧,经过多次干预,我设法编译了SWIGed libdisasm! 不幸的是,它似乎在不正确(有时是正确的)用法上崩溃python。 我是怎么做到的:
我使用以下命令行SWIGed给定的libdisasm_oop.i文件
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的其他更少崩溃的灾难库的建议吗?
答案 1 :(得分:2)
您可以尝试使用ctypes直接与libdisasm接口,而不是通过SWIG层。可能需要更多的开发时间,但AFAIK应该能够使用ctypes访问底层功能。
答案 2 :(得分:2)
我建议您查看Pym's disassembly library,它也是Pym's online disassembler的后端。
答案 3 :(得分:1)
您可以使用distorm库:https://code.google.com/p/distorm/
这是另一个版本:http://breakingcode.wordpress.com/2009/08/31/using-distorm-with-python-2-6-and-python-3-x-revisited/
还有BeaEngine:http://www.beaengine.org/
以下是BeaEngine的Windows安装程序:http://breakingcode.wordpress.com/2012/04/08/quickpost-installer-for-beaenginepython/