blob: f389fe0a5b32d26c0d720ed1797aa53bf42cdac7 [file] [log] [blame]
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08001#!/usr/bin/env python
2
3# Capstone Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
fenuks110ab1d2014-04-11 11:00:33 +02004from __future__ import print_function
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08005from capstone import *
6from capstone.x86 import *
Nguyen Anh Quynh10983292014-05-17 09:51:15 +08007from xprint import to_hex, to_x, to_x_32
8
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +08009
fenuks110ab1d2014-04-11 11:00:33 +020010X86_CODE64 = b"\x55\x48\x8b\x05\xb8\x13\x00\x00"
11X86_CODE16 = b"\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00\x05\x23\x01\x00\x00\x36\x8b\x84\x91\x23\x01\x00\x00\x41\x8d\x84\x39\x89\x67\x00\x00\x8d\x87\x89\x67\x00\x00\xb4\xc6"
12X86_CODE32 = b"\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00\x05\x23\x01\x00\x00\x36\x8b\x84\x91\x23\x01\x00\x00\x41\x8d\x84\x39\x89\x67\x00\x00\x8d\x87\x89\x67\x00\x00\xb4\xc6"
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080013
14all_tests = (
Nguyen Anh Quynh46490712013-12-06 00:44:44 +080015 (CS_ARCH_X86, CS_MODE_16, X86_CODE16, "X86 16bit (Intel syntax)", 0),
16 (CS_ARCH_X86, CS_MODE_32, X86_CODE32, "X86 32 (AT&T syntax)", CS_OPT_SYNTAX_ATT),
17 (CS_ARCH_X86, CS_MODE_32, X86_CODE32, "X86 32 (Intel syntax)", 0),
18 (CS_ARCH_X86, CS_MODE_64, X86_CODE64, "X86 64 (Intel syntax)", 0),
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080019 )
20
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080021
22def print_insn_detail(mode, insn):
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080023 def print_string_hex(comment, str):
fenuks110ab1d2014-04-11 11:00:33 +020024 print(comment, end=' '),
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080025 for c in str:
Nguyen Anh Quynhe96e34d2014-05-22 12:33:29 +080026 print("0x%02x " % c, end=''),
fenuks110ab1d2014-04-11 11:00:33 +020027 print()
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080028
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080029 # print address, mnemonic and operands
30 print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080031
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080032 # "data" instruction generated by SKIPDATA option has no detail
33 if insn.id == 0:
34 return
Nguyen Anh Quynh49f8f222014-04-10 17:40:10 +080035
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080036 # print instruction prefix
37 print_string_hex("\tPrefix:", insn.prefix)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080038
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080039 # print instruction's opcode
40 print_string_hex("\tOpcode:", insn.opcode)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080041
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080042 # print operand's size, address size, displacement size & immediate size
Nguyen Anh Quynhe7924512014-06-18 12:27:54 +080043 print("\taddr_size: %u" % (insn.addr_size))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080044
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080045 # print modRM byte
46 print("\tmodrm: 0x%x" % (insn.modrm))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080047
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080048 # print displacement value
49 print("\tdisp: 0x%s" % to_x_32(insn.disp))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080050
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080051 # SIB is not available in 16-bit mode
52 if (mode & CS_MODE_16 == 0):
53 # print SIB byte
54 print("\tsib: 0x%x" % (insn.sib))
55 if (insn.sib):
Nguyen Anh Quynh688efe32014-05-17 11:08:08 +080056 if insn.sib_base != 0:
Nguyen Anh Quynhcb2c4f92014-05-17 13:12:29 +080057 print("\t\tsib_base: %s" % (insn.reg_name(insn.sib_base)))
Nguyen Anh Quynh688efe32014-05-17 11:08:08 +080058 if insn.sib_index != 0:
Nguyen Anh Quynhcb2c4f92014-05-17 13:12:29 +080059 print("\t\tsib_index: %s" % (insn.reg_name(insn.sib_index)))
Nguyen Anh Quynh688efe32014-05-17 11:08:08 +080060 if insn.sib_scale != 0:
Nguyen Anh Quynhcb2c4f92014-05-17 13:12:29 +080061 print("\t\tsib_scale: %d" % (insn.sib_scale))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080062
Nguyen Anh Quynh4c5eabc2014-06-24 23:50:41 +080063 # SSE CC type
64 if insn.sse_cc != X86_SSE_CC_INVALID:
65 print("\tsse_cc: %u" % (insn.sse_cc))
66
67 # AVX CC type
68 if insn.avx_cc != X86_AVX_CC_INVALID:
69 print("\tavx_cc: %u" % (insn.avx_cc))
70
Nguyen Anh Quynh1a66fec2014-06-26 12:09:15 +080071 # AVX Suppress All Exception
72 if insn.avx_sae:
73 print("\tavx_sae: TRUE")
74
75 # AVX Rounding Mode type
76 if insn.avx_rm != X86_AVX_RM_INVALID:
77 print("\tavx_rm: %u" % (insn.avx_rm))
78
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080079 count = insn.op_count(X86_OP_IMM)
80 if count > 0:
81 print("\timm_count: %u" % count)
82 for i in range(count):
83 op = insn.op_find(X86_OP_IMM, i + 1)
84 print("\t\timms[%u]: 0x%s" % (i + 1, to_x(op.imm)))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +080085
Nguyen Anh Quynh10983292014-05-17 09:51:15 +080086 if len(insn.operands) > 0:
87 print("\top_count: %u" % len(insn.operands))
88 c = -1
89 for i in insn.operands:
90 c += 1
91 if i.type == X86_OP_REG:
92 print("\t\toperands[%u].type: REG = %s" % (c, insn.reg_name(i.reg)))
93 if i.type == X86_OP_IMM:
94 print("\t\toperands[%u].type: IMM = 0x%s" % (c, to_x(i.imm)))
95 if i.type == X86_OP_FP:
96 print("\t\toperands[%u].type: FP = %f" % (c, i.fp))
97 if i.type == X86_OP_MEM:
98 print("\t\toperands[%u].type: MEM" % c)
Nguyen Anh Quynh14ba46b2014-06-24 14:32:01 +080099 if i.mem.segment != 0:
100 print("\t\t\toperands[%u].mem.segment: REG = %s" % (c, insn.reg_name(i.mem.segment)))
Nguyen Anh Quynh10983292014-05-17 09:51:15 +0800101 if i.mem.base != 0:
102 print("\t\t\toperands[%u].mem.base: REG = %s" % (c, insn.reg_name(i.mem.base)))
103 if i.mem.index != 0:
104 print("\t\t\toperands[%u].mem.index: REG = %s" % (c, insn.reg_name(i.mem.index)))
105 if i.mem.scale != 1:
106 print("\t\t\toperands[%u].mem.scale: %u" % (c, i.mem.scale))
107 if i.mem.disp != 0:
108 print("\t\t\toperands[%u].mem.disp: 0x%s" % (c, to_x(i.mem.disp)))
Nguyen Anh Quynh83800cd2014-06-18 14:21:36 +0800109
Nguyen Anh Quynh0d716452014-06-24 22:51:56 +0800110 # AVX broadcast type
111 if i.avx_bcast != X86_AVX_BCAST_INVALID:
112 print("\t\toperands[%u].avx_bcast: %u" % (c, i.avx_bcast))
113
Nguyen Anh Quynh92a3d4c2014-06-25 23:10:39 +0800114 # AVX zero opmask {z}
Nguyen Anh Quynh7de200a2014-06-26 11:31:36 +0800115 if i.avx_zero_opmask:
116 print("\t\toperands[%u].avx_zero_opmask: TRUE" % (c))
Nguyen Anh Quynh92a3d4c2014-06-25 23:10:39 +0800117
Nguyen Anh Quynhf1ec5262014-06-25 22:03:18 +0800118 print("\t\toperands[%u].size: %u" % (c, i.size))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +0800119
120
Nguyen Anh Quynh10983292014-05-17 09:51:15 +0800121# ## Test class Cs
122def test_class():
123
Nguyen Anh Quynh46490712013-12-06 00:44:44 +0800124 for (arch, mode, code, comment, syntax) in all_tests:
danghvu1a7c4492013-11-27 22:51:11 -0600125 print("*" * 16)
fenuks110ab1d2014-04-11 11:00:33 +0200126 print("Platform: %s" % comment)
danghvu1a7c4492013-11-27 22:51:11 -0600127 print("Code: %s" % to_hex(code))
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +0800128 print("Disasm:")
danghvu1a7c4492013-11-27 22:51:11 -0600129
Nguyen Anh Quynhf1618bc2013-12-06 20:58:04 +0800130 try:
131 md = Cs(arch, mode)
Nguyen Anh Quynh428fdcd2014-01-07 23:39:40 +0800132 md.detail = True
Nguyen Anh Quynhc618db42013-12-04 00:05:04 +0800133
Nguyen Anh Quynhf1618bc2013-12-06 20:58:04 +0800134 if syntax != 0:
135 md.syntax = syntax
Nguyen Anh Quynhdaaed132013-12-03 22:18:28 +0800136
Nguyen Anh Quynhf1618bc2013-12-06 20:58:04 +0800137 for insn in md.disasm(code, 0x1000):
138 print_insn_detail(mode, insn)
danghvucdf6b822014-05-14 02:36:45 -0500139 print ()
Nguyen Anh Quynhf1618bc2013-12-06 20:58:04 +0800140 print ("0x%x:\n" % (insn.address + insn.size))
141 except CsError as e:
fenuks110ab1d2014-04-11 11:00:33 +0200142 print("ERROR: %s" % e)
Nguyen Anh Quynh26ee41a2013-11-27 12:11:31 +0800143
144
fenuks110ab1d2014-04-11 11:00:33 +0200145if __name__ == '__main__':
146 test_class()