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