1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Nguyen Anh Quynnh <[email protected]> 4*9a0e4156SSadaf Ebrahimifrom __future__ import print_function 5*9a0e4156SSadaf Ebrahimifrom capstone import * 6*9a0e4156SSadaf Ebrahimifrom capstone.mips import * 7*9a0e4156SSadaf Ebrahimifrom xprint import to_hex, to_x 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf Ebrahimi 10*9a0e4156SSadaf EbrahimiMIPS_CODE = b"\x0C\x10\x00\x97\x00\x00\x00\x00\x24\x02\x00\x0c\x8f\xa2\x00\x00\x34\x21\x34\x56" 11*9a0e4156SSadaf EbrahimiMIPS_CODE2 = b"\x56\x34\x21\x34\xc2\x17\x01\x00" 12*9a0e4156SSadaf EbrahimiMIPS_32R6M = b"\x00\x07\x00\x07\x00\x11\x93\x7c\x01\x8c\x8b\x7c\x00\xc7\x48\xd0" 13*9a0e4156SSadaf EbrahimiMIPS_32R6 = b"\xec\x80\x00\x19\x7c\x43\x22\xa0" 14*9a0e4156SSadaf Ebrahimi 15*9a0e4156SSadaf Ebrahimiall_tests = ( 16*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS32 + CS_MODE_BIG_ENDIAN, MIPS_CODE, "MIPS-32 (Big-endian)"), 17*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS64 + CS_MODE_LITTLE_ENDIAN, MIPS_CODE2, "MIPS-64-EL (Little-endian)"), 18*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS32R6 + CS_MODE_MICRO + CS_MODE_BIG_ENDIAN, MIPS_32R6M, "MIPS-32R6 | Micro (Big-endian)"), 19*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS32R6 + CS_MODE_BIG_ENDIAN, MIPS_32R6, "MIPS-32R6 (Big-endian)"), 20*9a0e4156SSadaf Ebrahimi) 21*9a0e4156SSadaf Ebrahimi 22*9a0e4156SSadaf Ebrahimi 23*9a0e4156SSadaf Ebrahimidef print_insn_detail(insn): 24*9a0e4156SSadaf Ebrahimi # print address, mnemonic and operands 25*9a0e4156SSadaf Ebrahimi print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str)) 26*9a0e4156SSadaf Ebrahimi 27*9a0e4156SSadaf Ebrahimi # "data" instruction generated by SKIPDATA option has no detail 28*9a0e4156SSadaf Ebrahimi if insn.id == 0: 29*9a0e4156SSadaf Ebrahimi return 30*9a0e4156SSadaf Ebrahimi 31*9a0e4156SSadaf Ebrahimi if len(insn.operands) > 0: 32*9a0e4156SSadaf Ebrahimi print("\top_count: %u" % len(insn.operands)) 33*9a0e4156SSadaf Ebrahimi c = -1 34*9a0e4156SSadaf Ebrahimi for i in insn.operands: 35*9a0e4156SSadaf Ebrahimi c += 1 36*9a0e4156SSadaf Ebrahimi if i.type == MIPS_OP_REG: 37*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: REG = %s" % (c, insn.reg_name(i.reg))) 38*9a0e4156SSadaf Ebrahimi if i.type == MIPS_OP_IMM: 39*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: IMM = 0x%s" % (c, to_x(i.imm))) 40*9a0e4156SSadaf Ebrahimi if i.type == MIPS_OP_MEM: 41*9a0e4156SSadaf Ebrahimi print("\t\toperands[%u].type: MEM" % c) 42*9a0e4156SSadaf Ebrahimi if i.mem.base != 0: 43*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.base: REG = %s" \ 44*9a0e4156SSadaf Ebrahimi % (c, insn.reg_name(i.mem.base))) 45*9a0e4156SSadaf Ebrahimi if i.mem.disp != 0: 46*9a0e4156SSadaf Ebrahimi print("\t\t\toperands[%u].mem.disp: 0x%s" \ 47*9a0e4156SSadaf Ebrahimi % (c, to_x(i.mem.disp))) 48*9a0e4156SSadaf Ebrahimi 49*9a0e4156SSadaf Ebrahimi 50*9a0e4156SSadaf Ebrahimi# ## Test class Cs 51*9a0e4156SSadaf Ebrahimidef test_class(): 52*9a0e4156SSadaf Ebrahimi for (arch, mode, code, comment) in all_tests: 53*9a0e4156SSadaf Ebrahimi print("*" * 16) 54*9a0e4156SSadaf Ebrahimi print("Platform: %s" % comment) 55*9a0e4156SSadaf Ebrahimi print("Code: %s" % to_hex(code)) 56*9a0e4156SSadaf Ebrahimi print("Disasm:") 57*9a0e4156SSadaf Ebrahimi 58*9a0e4156SSadaf Ebrahimi try: 59*9a0e4156SSadaf Ebrahimi md = Cs(arch, mode) 60*9a0e4156SSadaf Ebrahimi md.detail = True 61*9a0e4156SSadaf Ebrahimi for insn in md.disasm(code, 0x1000): 62*9a0e4156SSadaf Ebrahimi print_insn_detail(insn) 63*9a0e4156SSadaf Ebrahimi print() 64*9a0e4156SSadaf Ebrahimi 65*9a0e4156SSadaf Ebrahimi print("0x%x:\n" % (insn.address + insn.size)) 66*9a0e4156SSadaf Ebrahimi except CsError as e: 67*9a0e4156SSadaf Ebrahimi print("ERROR: %s" % e) 68*9a0e4156SSadaf Ebrahimi 69*9a0e4156SSadaf Ebrahimi 70*9a0e4156SSadaf Ebrahimiif __name__ == '__main__': 71*9a0e4156SSadaf Ebrahimi test_class() 72