今天要给大家介绍一款全能型的反汇编引擎Capstone。这一款引擎不仅能够跨平台,还跨多种语言,其中就有我们喜爱的Python。
我们利用Capstone也能轻松写出高大上的反汇编工具啦~~~
Capstone 能轻松反汇编多种平台的机器码,例如:x86(普通PC机)、ARM(手机用得比较多)、MIPS(路由) //括号中仅作举例。
实验环境:
macOS
Python 2.7
step 0x0 安装Capstone 库
Mac OSX 系统:
brew install capstone
Ubuntu :
sudo apt-get install libcapstone3
其它系统或方法可以参考:
step 0x1 Clone
我们去git上Clone 一份Capstone 源码,其中包含了大量示范代码和文档
git clone https://github.com/aquynh/capstone.git
切换到Python 示范代码的目录:bindings/python,这里你能找到大量的py演示代码。
比如,我是做ARM逆向分析的,所以对ARM反汇编比较关心,就看test_arm.py 这一份代码了。
python test_arm.py
step 0x2 最简单的例子
# test1.py
from capstone import *
CODE = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"
md = Cs(CS_ARCH_X86, CS_MODE_64)
for i in md.disasm(CODE, 0x1000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str)
以上代码片段的输出结果为:
$ python test1.py
0x1000: push rbp
0x1001: mov rax, qword ptr [rip + 0x13b8]
代码的第二行导入了Capstone的库,第三行是一段十六进制表示的机器码。
第四行初始化了Capstone的Cs类,初始化需要两个参数,分别是平台的架构和模式。
在这一段代码中,我们想反汇编的是一段x86的64位汇编代码。
第五行,通过Cs类的disasm对二进制的机器码进行反汇编,第一个参数是机器码Byte数据,第二个参数是这段代码的“基地址”。该函数为反汇编到一条错误的指令为止。
第六行,输出地址信息、助记符、操作数字符串。
step 0x3 详细信息
Capstone有一项非常强大的技能,它能分析汇编指令的隐含信息,比如“call xxx”是调用xxx这个函数,实质是把下一条指令地址入栈后修改EIP寄存器至XXX地址,Capstone就能将这种隐含信息分析出来。
因为分析需要花费更多的时间,所以默认是关闭的,需要开发者自己打开。
打开方法:
md = Cs(CS_ARCH_X86, CS_MODE_32)
md.detail = True
如果不使用可,就及时关闭:
md.detail = False
完整的测试代码:
1 from capstone import *
2 from capstone.arm import *
3
4 CODE = b"\xf1\x02\x03\x0e\x00\x00\xa0\xe3\x02\x30\xc1\xe7\x00\x00\x53\xe3"
5
6 md = Cs(CS_ARCH_ARM, CS_MODE_ARM)
7 md.detail = True
8
9 for i in md.disasm(CODE, 0x1000):
10 if i.id in (ARM_INS_BL, ARM_INS_CMP):
11 print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
12
13 if len(i.regs_read) > 0:
14 print("\tImplicit registers read: "),
15 for r in i.regs_read:
16 print("%s" %i.reg_name(r)),
17 print
18
19 if len(i.groups) > 0:
20 print("\tThis instruction belongs to groups:"),
21 for g in i.groups:
22 print("%u" %g),
23 print
输出的结果:
0x1000: bl #0x104c
Implicit registers read: pc
This instruction belongs to groups: 20
0x101c: cmp r3, #0
This instruction belongs to groups: 20