0

我有一个大学项目,我必须在其中反汇编二进制文件。因此,我尝试了 Capstone。我用 Java 尝试了几个星期,但它没有用,所以从昨天开始我自学了一点 Python。要阅读我试过的二进制文件:

file = open('binary_file')
content = file.readlines()

从此链接:Reading Binary File (.out) in Python and disassemble with Capstone 以及从 capstone 反汇编的说明http://www.capstone-engine.org/lang_python.html

我有来自在线反汇编程序的解决方案,结果超过 13000 行。当我开始我的时候,我只得到一个(0x1000:sc 0x2b)。我找不到错误,因为在我看来这没问题,但我没有任何 Python 或 Capstone 计划。

顺便说一句,Capstone 页面中的测试代码工作正常,所以我认为安装没有问题。

代码:

from capstone import *

file = open('C:/...sth', 'rb')
content = file.read()

ergebnism = open("C:/.../ergebnis.txt", "w")
mi = Cs(CS_ARCH_MIPS, CS_MODE_MIPS32)
for i in mi.disasm(content, 0x1000):    
    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    #for (address, size, mnemonic, op_str) in mi.disasm_lite(content,0x1000):    
    # print("0x%x:\t%s\t%s" %(address, mnemonic, op_str))
    ergebnism.write("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    ergebnism.write("\n")
ergebnism.close()

file2 = open('C:/...erdb', 'rb')
content2 = file2.read()

ergebnisp = open("C:/.../ergebnisp.txt", "w")
pp = Cs(CS_ARCH_PPC, CS_MODE_64)
for i in pp.disasm(content, 0x1000):
    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    #for (address, size, mnemonic, op_str) in pp.disasm_lite(content2, 0x1000):
    #print("0x%x:\t%s\t%s" %(address, mnemonic, op_str))
    ergebnisp.write("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
    ergebnisp.write("\n")
ergebnisp.close()
4

1 回答 1

1

像 Capstone 这样的反汇编程序库将您提供给它们的所有内容都视为指令字节,但正常的二进制文件往往包含许多除指令之外的其他内容。它们中的大多数都以某种标题开头,而不是代码。

因此,需要进行一些分析来确定二进制文件的哪些部分是代码、数据、资源、重定位表等等,并且只将实际代码(即指令字节)提供给反汇编引擎。还需要这种分析来确定要反汇编的代码的某些环境参数,例如操作系统将加载代码的地址、入口点的地址或需要应用的重定位。

这种分析是由像 IDA 这样的程序自动完成的(其中有一个免费版本);这些通常被称为“反汇编程序”,但实际上原始指令反汇编逻辑仅占其分析能力的一小部分。有关更多信息,请查看逆向工程上的主题Disassembler for batch/automated processing 。

当然,如果您的二进制文件只包含原始指令流,那么这一切都是没有意义的......

于 2016-05-03T06:35:24.083 回答