capstone

capstone官网

The Ultimate Disassembly Framework

官方教程(python)

Programming with Python language

官方教程(C)

Programming with C language

官方教程(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)

Untitled/

可以结合的模式如下

Untitled/

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇