capstone官网
The Ultimate Disassembly Framework
官方教程(python)
Programming with Python language
官方教程(C)
官方教程(Java)
Programming with Java language
capstone是一个反汇编工具,其可以将字节码翻译为汇编代码
在python下的示例使用方法如下(以arm64汇编为例)
from capstone import *
code =b'\x01\x10\xa0\xe3\x02 \xa0\xe3\x010B\xe0'
CS = Cs(CS_ARCH_ARM, CS_MODE_LITTLE_ENDIAN)
a=CS.disasm(code,0)
for i in a:
print(i.mnemonic,i.op_str)
# 执行输出如下
# mov r1, #1
# mov r2, #2
# sub r3, r2, r1
上述代码中code为需要翻译字节码的bytes串
CS = Cs(CS_ARCH_ARM, CS_MODE_LITTLE_ENDIAN) 一行用于初始化Capstone类,其参数分别为硬件架构和硬件模式
a=CS.disasm(code,0) 一行的作用为将字节码翻译为汇编指令,其参数分别为待翻译的字节码和代码偏移地址
其函数原型为disasm(code, offset, count=0)
code:待翻译的字节码
offset:代码的偏移量
count:代码数量(未找到官方解释)
其返回值为CsInsn 对象,可以迭代,其部分方法如下
CsInsn.id # 指令的id
CsInsn.address # 指令的地址
CsInsn.op_str # 指令的助记符
CsInsn.mnemonic # 指令的操作数
CsInsn.size # 指令的大小
CsInsn.bytes # 指令的bytes流,应有size个字节
除此之外,还可以使用disasm_lite 函数进行翻译,其使用方式与disasm 相同,但是该函数并不会返回一个CsInsn对象,而是会返回一个仅包含address, size, mnemonic 和 op_str的元组,其执行速度也比disasm 快大约30%。其使用方式如下
from capstone import *
code =b'\x01\x10\xa0\xe3\x02 \xa0\xe3\x010B\xe0'
CS = Cs(CS_ARCH_ARM, CS_MODE_LITTLE_ENDIAN)
for (address, size, mnemonic, op_str) in Cs.disasm_lite(CS,code,0x40000000):
print(hex(address), mnemonic, op_str)
# 执行输出如下
# 0x40000000 mov r1, #1
# 0x40000004 mov r2, #2
# 0x40000008 sub r3, r2, r1
或
from capstone import *
code =b'\x01\x10\xa0\xe3\x02 \xa0\xe3\x010B\xe0'
CS = Cs(CS_ARCH_ARM, CS_MODE_LITTLE_ENDIAN)
a=CS.disasm_lite(code,0x40000000)
for (address, size, mnemonic, op_str) in a:
print(hex(address), mnemonic, op_str)
# 执行输出如下
# 0x40000000 mov r1, #1
# 0x40000004 mov r2, #2
# 0x40000008 sub r3, r2, r1
如果需要使用不同语法的指令集,需要按照如下方式进行指定(以AT&T语法的x86指令集为例)
cs = cs(CS_ARCH_X86, CS_MODE_32)
cs.syntax = CS_OPT_SYNTAX_ATT
如果需要在运行时动态的更换其解析模式,可以使用如下写法
md = Cs(CS_ARCH_ARM, CS_MODE_ARM) # 使用arm模式
# ....
md.mode = CS_MODE_THUMB # 切换到Thumb模式
# ....
md.mode = CS_MODE_ARM # 切换回Arm模式
# ....
更多关于details模式使用教程见官方教程页面
支持的架构和对应的模式如下(参考keystone)

可以结合的模式如下

若要结合模式,可以使用+来连接两个模式,如下面为在小端序模式下反汇编Mips64的代码 Cs(CS_ARCH_MIPS, CS_MODE_MIPS64 + CS_MODE_LITTLE_ENDIAN)




