python调用汇编_用Python玩玩反汇编

陆涵畅
2023-12-01

今天要给大家介绍一款全能型的反汇编引擎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

 类似资料: