用Python玩玩反彙編

今天要給大家介紹一款全能型的反彙編引擎Capstone。這一款引擎不僅能夠跨平台,還跨多種語言,其中就有我們喜愛的Python。

我們利用Capstone也能輕鬆寫出高大上的反彙編工具啦~~~

Capstone 能輕鬆反彙編多種平台的機器碼,例如:x86(普通PC機)、ARM(手機用得比較多)、MIPS(路由) //括弧中僅作舉例。

實驗環境:

macOS

Python 2.7

step 0x0 安裝Capstone 庫

Mac OSX 系統:

brew install capstonen

Ubuntu :

sudo apt-get install libcapstone3n

其它系統或方法可以參考:

Documentation

step 0x1 Clone

我們去git上Clone 一份Capstone 源碼,其中包含了大量示範代碼和文檔

git clone https://github.com/aquynh/capstone.gitn

切換到Python 示範代碼的目錄:bindings/python,這裡你能找到大量的py演示代碼。

比如,我是做ARM逆向分析的,所以對ARM反彙編比較關心,就看test_arm.py 這一份代碼了。

python test_arm.pyn

step 0x2 最簡單的例子

# test1.pynfrom capstone import *nCODE = b"x55x48x8bx05xb8x13x00x00"nmd = Cs(CS_ARCH_X86, CS_MODE_64)nfor i in md.disasm(CODE, 0x1000):n print("0x%x:t%st%s" %(i.address, i.mnemonic, i.op_str)n

以上代碼片段的輸出結果為:

$ python test1.pynn0x1000: push rbpn0x1001: mov rax, qword ptr [rip + 0x13b8]n

代碼的第二行導入了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)nmd.detail = Truen

如果不使用可,就及時關閉:

md.detail = Falsen

完整的測試代碼:

1 from capstone import *n 2 from capstone.arm import *n 3 n 4 CODE = b"xf1x02x03x0ex00x00xa0xe3x02x30xc1xe7x00x00x53xe3"n 5 n 6 md = Cs(CS_ARCH_ARM, CS_MODE_ARM)n 7 md.detail = Truen 8 n 9 for i in md.disasm(CODE, 0x1000):n10 if i.id in (ARM_INS_BL, ARM_INS_CMP):n11 print("0x%x:t%st%s" %(i.address, i.mnemonic, i.op_str))n12 n13 if len(i.regs_read) > 0:n14 print("tImplicit registers read: "),n15 for r in i.regs_read:n16 print("%s " %i.reg_name(r)),n17 printn18 n19 if len(i.groups) > 0:n20 print("tThis instruction belongs to groups:"),n21 for g in i.groups:n22 print("%u" %g),n23 printn

輸出的結果:

0x1000: bl #0x104cn Implicit registers read: pcn This instruction belongs to groups: 20n0x101c: cmp r3, #0n This instruction belongs to groups: 20n

推薦閱讀:

如何看待微軟中國關於微軟產品最近傳言的五點聲明?
0xB6 入口流量分析平台搭建與流量分析那些事兒
11月安卓系統漏洞小結:31個不得不修復的漏洞

TAG:Python库 | 白帽子 | 信息安全 |