blob: 8500a296fc41bc172f250f4604feccdede9e73ba [file] [log] [blame]
Nguyen Anh Quynh50d12052015-08-19 09:34:33 +08001#!/usr/bin/env python
2
3# Capstone Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
4from __future__ import print_function
5import sys
6from capstone import *
7
8all_tests = (
9 # arch, mode, syntax, address, hexcode, expected output
10 # issue 456 https://github.com/aquynh/capstone/issues/456
11
12 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_INTEL, 0xfc16, b"\xE8\x35\x64", "call 0x604e"),
13 (CS_ARCH_X86, CS_MODE_32, CS_OPT_SYNTAX_INTEL, 0x9123fc1b, b"\x66\xE8\x35\x64", "call 0x6054"),
14 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_INTEL, 0x9123fc1b, b"\x66\xE8\x35\x64", "call 0x6054"),
15
16 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_INTEL, 0xfc26, b"\xE9\x35\x64", "jmp 0x605e"),
17
18 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_INTEL, 0xfff6, b"\x66\xE9\x35\x64\x93\x53", "jmp 0x53946431"),
19 (CS_ARCH_X86, CS_MODE_32, CS_OPT_SYNTAX_INTEL, 0x9123fff1, b"\xE9\x35\x64\x93\x53", "jmp 0xe4b7642b"),
20 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_INTEL, 0x649123fff1, b"\xE9\x35\x64\x93\x53", "jmp 0x64e4b7642b"),
21
22 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_INTEL, 0xffe1, b"\x66\xe8\x35\x64\x93\x53", "call 0x5394641c"),
23 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_INTEL, 0x649123ffe1, b"\x66\xe8\x35\x64", "call 0x641a"),
24 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_INTEL, 0x649123ffe1, b"\x66\xe9\x35\x64", "jmp 0x641a"),
25 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_INTEL, 0xffe1, b"\x66\xe9\x35\x64\x93\x53", "jmp 0x5394641c"),
26
27 # AT&T syntax
28 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_ATT, 0xfc16, b"\xE8\x35\x64", "callw 0x604e"),
29 (CS_ARCH_X86, CS_MODE_32, CS_OPT_SYNTAX_ATT, 0x9123fc1b, b"\x66\xE8\x35\x64", "callw 0x6054"),
30 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT, 0x9123fc1b, b"\x66\xE8\x35\x64", "callw 0x6054"),
31
32 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_ATT, 0xfc26, b"\xE9\x35\x64", "jmp 0x605e"),
33
34 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_ATT, 0xfff6, b"\x66\xE9\x35\x64\x93\x53", "jmp 0x53946431"),
35 (CS_ARCH_X86, CS_MODE_32, CS_OPT_SYNTAX_ATT, 0x9123fff1, b"\xE9\x35\x64\x93\x53", "jmp 0xe4b7642b"),
36 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT, 0x649123fff1, b"\xE9\x35\x64\x93\x53", "jmp 0x64e4b7642b"),
37
38 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_ATT, 0xffe1, b"\x66\xe8\x35\x64\x93\x53", "calll 0x5394641c"),
39 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT, 0x649123ffe1, b"\x66\xe8\x35\x64", "callw 0x641a"),
40 (CS_ARCH_X86, CS_MODE_64, CS_OPT_SYNTAX_ATT, 0x649123ffe1, b"\x66\xe9\x35\x64", "jmp 0x641a"),
41 (CS_ARCH_X86, CS_MODE_16, CS_OPT_SYNTAX_ATT, 0xffe1, b"\x66\xe9\x35\x64\x93\x53", "jmp 0x5394641c"),
42)
43
44_python3 = sys.version_info.major == 3
45
46
47def to_hex(s):
48 if _python3:
49 return " ".join("0x{0:02x}".format(c) for c in s) # <-- Python 3 is OK
50 else:
51 return " ".join("0x{0:02x}".format(ord(c)) for c in s)
52
53
54def str_syntax(syntax):
55 slist = {
56 0: "",
57 CS_OPT_SYNTAX_INTEL: "intel",
58 CS_OPT_SYNTAX_ATT: "att",
59 }
60
61 return slist[syntax]
62
63
64def str_arch_mode(a, m):
65 amlist = {
66 (CS_ARCH_X86, CS_MODE_16): "X86-16bit",
67 (CS_ARCH_X86, CS_MODE_32): "X86-32bit",
68 (CS_ARCH_X86, CS_MODE_64): "X86-64bit",
69 }
70
71 return amlist[(a, m)]
72
73
74# ## Test cs_disasm_quick()
75def test_regression():
76 for (arch, mode, syntax, address, code, expected_output) in all_tests:
77 print("%s %s: %s = " %(str_arch_mode(arch, mode), str_syntax(syntax), to_hex(code)), end=""),
78 md = Cs(arch, mode)
79 if syntax != 0:
80 md.syntax = syntax
81 insn = list(md.disasm(code, address))[0]
82 output = "%s %s" % (insn.mnemonic, insn.op_str)
83 print(output)
84 if output != expected_output:
85 print("\t --> ERROR: expected output = %s" %(expected_output))
86
87 print()
88
89
90if __name__ == '__main__':
91 test_regression()