1、基本案例——disasm函数
capstone有非常简单的API,所以使用该框架编写工具非常简单。接下来,下面的代码实现的功能是反汇编一些X86二进制文件,并打印出其对应的汇编语句。
代码展示:
from capstone import * #将capstone模块中函数全部导入
code=b"\x55\x48\x8b\x13\x00\x00" #设置需要进行反汇编的十六进制机器码
#创建Cs类对象md,我们需要给这个类传两个参数:硬件架构,硬件模式(位长)
md=Cs(CS_ARCH_X86,CS_MODE_64) #表示此时md对象对采用x86架构64位,对机器码进行汇编
for i in md.disasm(code,0x1000): #循环遍历disasm函数返回的列表
print("0x%x:\t %s\t%s" %(i.address,i.mnemonic,i.op_str))
代码解释:(此时的行数是不计注释和空行)
代码的前两行的作用分别是导入模块中需要使用的函数(或类)和设置需要进行反汇编的机器码。第三的作用是为Cs类创建一个类对象md,便于在后续代码中调用Cs类中定义的方法。
反汇编二进制文件(机器码)实际上使用的是Cs类中定义的成员函数disasm()。因为我们在代码的第三行已经初始了一个类对象md,所以当我们要使用disasm()这个函数的时候,直接使用类对象调用即可---md.disasm()。disasm需要传两个参数:
①第一个参数:需要进行反汇编的机器码;
②第二个参数:反汇编的开始地址,默认情况下,disasm会反汇编传入的所有机器码,直到没有代码或断开为止。本例中,第二个参数设置为0x1000。
disasm函数的执行完成后,会返回一个CsInsn类的指令列表。
代码的第四行使用for循环遍历disasm函数返回的列表,第五行打印该指令的一些内部信息。
执行结果:
类CsInsn公开了我们要访问的反汇编指令的所有内部信息。以下是一些常用的字段: id 汇编指令的id
address 汇编指令的地址
mnemonic 指令的助记符
op_str 汇编指令的操作码
size 汇编指令的大小,以字节为单位
bytes 指令的字节序列
验证代码如下:
2.更精简的API——disasm_lite函数
刚刚我介绍了capstone模块中的Cs类中的成员函数disasm()。这个函数处理后会返回一个CsInsn类列表。返回结果提供了反汇编指令的全部可用信息。但是当我只需要汇编代码的基本信息,如:地址、大小、助记符等基本的数据,我们可以使用disasm_lite()函数,该函数返回一个元组,元组包括:地址、大小、助记符、op_str。这个函数的执行速度相比于disasm函数会更快。
代码展示:
from capstone import *
code=b"\x55\x48\x8b\x13\x00\x00"
md=Cs(CS_ARCH_X86,CS_MODE_64)
for (address,size,mnemonic,op_str) in md.disasm_lite(code,0x1000):
print("0x"+str(address),size,mnemonic,op_str)