1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Nicolas PLANEL <[email protected]> 4*9a0e4156SSadaf Ebrahimifrom __future__ import print_function 5*9a0e4156SSadaf Ebrahimifrom capstone import * 6*9a0e4156SSadaf Ebrahimifrom capstone.m68k import * 7*9a0e4156SSadaf Ebrahimifrom xprint import to_hex, to_x 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf EbrahimiM68K_CODE = b"\x4c\x00\x54\x04\x48\xe7\xe0\x30\x4c\xdf\x0c\x07\xd4\x40\x87\x5a\x4e\x71\x02\xb4\xc0\xde\xc0\xde\x5c\x00\x1d\x80\x71\x12\x01\x23\xf2\x3c\x44\x22\x40\x49\x0e\x56\x54\xc5\xf2\x3c\x44\x00\x44\x7a\x00\x00\xf2\x00\x0a\x28\x4e\xb9\x00\x00\x00\x12\x4e\x75" 10*9a0e4156SSadaf Ebrahimi 11*9a0e4156SSadaf Ebrahimiall_tests = ( 12*9a0e4156SSadaf Ebrahimi (CS_ARCH_M68K, CS_MODE_BIG_ENDIAN | CS_MODE_M68K_040, M68K_CODE, "M68K"), 13*9a0e4156SSadaf Ebrahimi) 14*9a0e4156SSadaf Ebrahimi 15*9a0e4156SSadaf Ebrahimis_addressing_modes = { 16*9a0e4156SSadaf Ebrahimi 0: "<invalid mode>", 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimi 1: "Register Direct - Data", 19*9a0e4156SSadaf Ebrahimi 2: "Register Direct - Address", 20*9a0e4156SSadaf Ebrahimi 21*9a0e4156SSadaf Ebrahimi 3: "Register Indirect - Address", 22*9a0e4156SSadaf Ebrahimi 4: "Register Indirect - Address with Postincrement", 23*9a0e4156SSadaf Ebrahimi 5: "Register Indirect - Address with Predecrement", 24*9a0e4156SSadaf Ebrahimi 6: "Register Indirect - Address with Displacement", 25*9a0e4156SSadaf Ebrahimi 26*9a0e4156SSadaf Ebrahimi 7: "Address Register Indirect With Index - 8-bit displacement", 27*9a0e4156SSadaf Ebrahimi 8: "Address Register Indirect With Index - Base displacement", 28*9a0e4156SSadaf Ebrahimi 29*9a0e4156SSadaf Ebrahimi 9: "Memory indirect - Postindex", 30*9a0e4156SSadaf Ebrahimi 10: "Memory indirect - Preindex", 31*9a0e4156SSadaf Ebrahimi 32*9a0e4156SSadaf Ebrahimi 11: "Program Counter Indirect - with Displacement", 33*9a0e4156SSadaf Ebrahimi 34*9a0e4156SSadaf Ebrahimi 12: "Program Counter Indirect with Index - with 8-Bit Displacement", 35*9a0e4156SSadaf Ebrahimi 13: "Program Counter Indirect with Index - with Base Displacement", 36*9a0e4156SSadaf Ebrahimi 37*9a0e4156SSadaf Ebrahimi 14: "Program Counter Memory Indirect - Postindexed", 38*9a0e4156SSadaf Ebrahimi 15: "Program Counter Memory Indirect - Preindexed", 39*9a0e4156SSadaf Ebrahimi 40*9a0e4156SSadaf Ebrahimi 16: "Absolute Data Addressing - Short", 41*9a0e4156SSadaf Ebrahimi 17: "Absolute Data Addressing - Long", 42*9a0e4156SSadaf Ebrahimi 18: "Immediate value", 43*9a0e4156SSadaf Ebrahimi 44*9a0e4156SSadaf Ebrahimi 19: "Branch Displacement", 45*9a0e4156SSadaf Ebrahimi} 46*9a0e4156SSadaf Ebrahimi 47*9a0e4156SSadaf Ebrahimidef print_read_write_regs(insn): 48*9a0e4156SSadaf Ebrahimi for m in insn.regs_read: 49*9a0e4156SSadaf Ebrahimi print("\treading from reg: %s" % insn.reg_name(m)) 50*9a0e4156SSadaf Ebrahimi 51*9a0e4156SSadaf Ebrahimi for m in insn.regs_write: 52*9a0e4156SSadaf Ebrahimi print("\twriting to reg: %s" % insn.reg_name(m)) 53*9a0e4156SSadaf Ebrahimi 54*9a0e4156SSadaf Ebrahimidef print_insn_detail(insn): 55*9a0e4156SSadaf Ebrahimi if len(insn.operands) > 0: 56*9a0e4156SSadaf Ebrahimi print("\top_count: %u" % (len(insn.operands))) 57*9a0e4156SSadaf Ebrahimi print("\tgroups_count: %u" % len(insn.groups)) 58*9a0e4156SSadaf Ebrahimi 59*9a0e4156SSadaf Ebrahimi print_read_write_regs(insn) 60*9a0e4156SSadaf Ebrahimi 61*9a0e4156SSadaf Ebrahimi for i, op in enumerate(insn.operands): 62*9a0e4156SSadaf Ebrahimi if op.type == M68K_OP_REG: 63*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: REG = %s" % (i, insn.reg_name(op.reg))) 64*9a0e4156SSadaf Ebrahimi elif op.type == M68K_OP_IMM: 65*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: IMM = 0x%x" % (i, op.imm & 0xffffffff)) 66*9a0e4156SSadaf Ebrahimi elif op.type == M68K_OP_MEM: 67*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: MEM" % (i)) 68*9a0e4156SSadaf Ebrahimi if op.mem.base_reg != M68K_REG_INVALID: 69*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.base: REG = %s" % (i, insn.reg_name(op.mem.base_reg))) 70*9a0e4156SSadaf Ebrahimi if op.mem.index_reg != M68K_REG_INVALID: 71*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.index: REG = %s" % (i, insn.reg_name(op.mem.index_reg))) 72*9a0e4156SSadaf Ebrahimi mem_index_str = "w" 73*9a0e4156SSadaf Ebrahimi if op.mem.index_size > 0: 74*9a0e4156SSadaf Ebrahimi mem_index_str = "l" 75*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.index: size = %s" % (i, mem_index_str)) 76*9a0e4156SSadaf Ebrahimi if op.mem.disp != 0: 77*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.disp: 0x%x" % (i, op.mem.disp)) 78*9a0e4156SSadaf Ebrahimi if op.mem.scale != 0: 79*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.scale: %d" % (i, op.mem.scale)) 80*9a0e4156SSadaf Ebrahimi print("\t\taddress mode: %s" % (s_addressing_modes[op.address_mode])) 81*9a0e4156SSadaf Ebrahimi elif op.type == M68K_OP_FP_SINGLE: 82*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: FP_SINGLE" % i) 83*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].simm: %f", i, op.simm) 84*9a0e4156SSadaf Ebrahimi elif op.type == M68K_OP_FP_DOUBLE: 85*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: FP_DOUBLE" % i) 86*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].dimm: %lf", i, op.dimm) 87*9a0e4156SSadaf Ebrahimi elif op.type == M68K_OP_BR_DISP: 88*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].br_disp.disp: 0x%x" % (i, op.br_disp.disp)) 89*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].br_disp.disp_size: %d" % (i, op.br_disp.disp_size)) 90*9a0e4156SSadaf Ebrahimi print() 91*9a0e4156SSadaf Ebrahimi 92*9a0e4156SSadaf Ebrahimi# ## Test class Cs 93*9a0e4156SSadaf Ebrahimidef test_class(): 94*9a0e4156SSadaf Ebrahimi address = 0x01000 95*9a0e4156SSadaf Ebrahimi for (arch, mode, code, comment) in all_tests: 96*9a0e4156SSadaf Ebrahimi print("*" * 16) 97*9a0e4156SSadaf Ebrahimi print("Platform: %s" % comment) 98*9a0e4156SSadaf Ebrahimi print("Code: %s " % to_hex(code)) 99*9a0e4156SSadaf Ebrahimi print("Disasm:") 100*9a0e4156SSadaf Ebrahimi 101*9a0e4156SSadaf Ebrahimi try: 102*9a0e4156SSadaf Ebrahimi md = Cs(arch, mode) 103*9a0e4156SSadaf Ebrahimi md.detail = True 104*9a0e4156SSadaf Ebrahimi last_address = 0 105*9a0e4156SSadaf Ebrahimi for insn in md.disasm(code, address): 106*9a0e4156SSadaf Ebrahimi last_address = insn.address + insn.size 107*9a0e4156SSadaf Ebrahimi print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str)) 108*9a0e4156SSadaf Ebrahimi print_insn_detail(insn) 109*9a0e4156SSadaf Ebrahimi print("0x%x:\n" % (last_address)) 110*9a0e4156SSadaf Ebrahimi 111*9a0e4156SSadaf Ebrahimi except CsError as e: 112*9a0e4156SSadaf Ebrahimi print("ERROR: %s" % e.__str__()) 113*9a0e4156SSadaf Ebrahimi 114*9a0e4156SSadaf Ebrahimiif __name__ == '__main__': 115*9a0e4156SSadaf Ebrahimi test_class() 116*9a0e4156SSadaf Ebrahimi 117*9a0e4156SSadaf Ebrahimi 118*9a0e4156SSadaf Ebrahimi 119*9a0e4156SSadaf Ebrahimi 120*9a0e4156SSadaf Ebrahimi 121