keystone官网
官方使用教程
keystone
keystone为一款汇编引擎,可以将汇编指令翻译为字节码
在python下的示例使用方法如下(以arm64汇编为例)
from keystone import *
code =
"""
mov x1,1;
mov x2,2;
sub x3,x2,x1;
"""
KS = Ks(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN)
code,count=KS.asm(code)
print(code)
# 执行输出如下
# [1, 16, 160, 227, 2, 32, 160, 227, 1, 48, 66, 224]
上述代码中code为汇编代码,其有两中代码分隔方式,即;或/n
Ks(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN) 一行用于初始化Keystone类,其有两个参数:硬件架构和硬件模式
如果需要使用不同语法的指令集,需要按照如下方式进行指定(以AT&T语法的x86指令集为例)
ks = Ks(KS_ARCH_X86, KS_MODE_32)
ks.syntax = KS_OPT_SYNTAX_ATT
code,count=KS.asm(code) 一句的含义为调用Ks类的asm方法来将给定的汇编代码解析为字节码,其参数为汇编指令。
其函数原型为asm(string, addr=0, as_bytes=False)
string:需要解析的指令
addr:第一条指令的地址(某些架构下可以忽略),默认为0
as_bytes:是否返回bytes串,默认返回list
该函数有两个返回值,第一个为解析的结果(根据参数不同返回为list或bytes串),第二个为语句数量(未找到详细的官方说明)
其支持的架构如下
KS_ARCH_ARM = 1 # ARM 架构 (包括 Thumb, Thumb-2)
KS_ARCH_ARM64 = 2 # ARM-64, 也称 AArch64
KS_ARCH_MIPS = 3 # Mips 架构
KS_ARCH_X86 = 4 # X86 架构 (包括 x86 & x86-64)
KS_ARCH_PPC = 5 # PowerPC 架构
KS_ARCH_SPARC = 6 # Sparc 架构
KS_ARCH_SYSTEMZ = 7 # SystemZ 架构
KS_ARCH_HEXAGON = 8
KS_ARCH_EVM = 9
KS_ARCH_MAX = 10
其支持的模式如下
KS_MODE_LITTLE_ENDIAN = 0, # 小端序模式
KS_MODE_BIG_ENDIAN = 1 << 30, # 大端序模式
# arm / arm64
KS_MODE_ARM = 0, # ARM 模式
KS_MODE_THUMB = 1 << 4, # THUMB 模式 (包括 Thumb-2)
KS_MODE_MCLASS = 1 << 5, # ARM's Cortex-M 系列
KS_MODE_V8 = 1 << 6, # ARMv8 A32 encodings for ARM
# arm (32bit) cpu 类型
KS_MODE_ARM926 = 1 << 7, # ARM926 CPU 类型
KS_MODE_ARM946 = 1 << 8, # ARM946 CPU 类型
KS_MODE_ARM1176 = 1 << 9, # ARM1176 CPU 类型
# mips
KS_MODE_MICRO = 1 << 4, # MicroMips 模式
KS_MODE_MIPS3 = 1 << 5, # Mips III ISA
KS_MODE_MIPS32R6 = 1 << 6, # Mips32r6 ISA
KS_MODE_MIPS32 = 1 << 2, # Mips32 ISA
KS_MODE_MIPS64 = 1 << 3, # Mips64 ISA
# x86 / x64
KS_MODE_16 = 1 << 1, # 16-bit 模式
KS_MODE_32 = 1 << 2, # 32-bit 模式
KS_MODE_64 = 1 << 3, # 64-bit 模式
# ppc
KS_MODE_PPC32 = 1 << 2, # 32-bit 模式
KS_MODE_PPC64 = 1 << 3, # 64-bit 模式
KS_MODE_QPX = 1 << 4, # Quad Processing eXtensions 模式
# sparc
KS_MODE_SPARC32 = 1 << 2, # 32-bit
KS_MODE_SPARC64 = 1 << 3, # 64-bit
KS_MODE_V9 = 1 << 4, # SparcV9 模式
常见的架构与模式组合如下
# X86
Ks(KS_ARCH_X86, KS_MODE_16)
Ks(KS_ARCH_X86, KS_MODE_32)
Ks(KS_ARCH_X86, KS_MODE_64)
# RADIX16 syntax Intel (default syntax)
Ks(KS_ARCH_X86, KS_MODE_32).syntax=KS_OPT_SYNTAX_RADIX16
# ARM
Ks(KS_ARCH_ARM, KS_MODE_ARM)
Ks(KS_ARCH_ARM, KS_MODE_ARM + KS_MODE_BIG_ENDIAN)
Ks(KS_ARCH_ARM, KS_MODE_THUMB)
Ks(KS_ARCH_ARM, KS_MODE_THUMB + KS_MODE_BIG_ENDIAN)
# ARM64
Ks(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN)
# Hexagon
Ks(KS_ARCH_HEXAGON, KS_MODE_BIG_ENDIAN)
# Mips
Ks(KS_ARCH_MIPS, KS_MODE_MIPS32)
Ks(KS_ARCH_MIPS, KS_MODE_MIPS32 + KS_MODE_BIG_ENDIAN)
Ks(KS_ARCH_MIPS, KS_MODE_MIPS64)
Ks(KS_ARCH_MIPS, KS_MODE_MIPS64 + KS_MODE_BIG_ENDIAN)
# PowerPC
Ks(KS_ARCH_PPC, KS_MODE_PPC32 + KS_MODE_BIG_ENDIAN)
Ks(KS_ARCH_PPC, KS_MODE_PPC64)
Ks(KS_ARCH_PPC, KS_MODE_PPC64 + KS_MODE_BIG_ENDIAN)
# Sparc
Ks(KS_ARCH_SPARC, KS_MODE_SPARC32 + KS_MODE_LITTLE_ENDIAN)
Ks(KS_ARCH_SPARC, KS_MODE_SPARC32 + KS_MODE_BIG_ENDIAN)
# SystemZ
Ks(KS_ARCH_SYSTEMZ, KS_MODE_BIG_ENDIAN)
其支持的所有语法如下
KS_OPT_SYNTAX_INTEL = 1<<0
KS_OPT_SYNTAX_ATT = 1<<1 #AT&T
KS_OPT_SYNTAX_NASM = 1<<2
KS_OPT_SYNTAX_MASM = 1<<3
KS_OPT_SYNTAX_GAS = 1<<4
KS_OPT_SYNTAX_RADIX16 = 1<<5 #Radix16




