1*9a0e4156SSadaf Ebrahimi#!/usr/bin/python 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimi# Simple benchmark for Capstone by disassembling random code. By Nguyen Anh Quynh, 2014 4*9a0e4156SSadaf Ebrahimi# Syntax: 5*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py --> Benchmark all archs 6*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py x86 --> Benchmark all X86 (all 16bit, 32bit, 64bit) 7*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py x86-32 --> Benchmark X86-32 arch only 8*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py arm --> Benchmark all ARM (arm, thumb) 9*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py aarch64 --> Benchmark ARM-64 10*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py mips --> Benchmark all Mips (32bit, 64bit) 11*9a0e4156SSadaf Ebrahimi# ./suite/benchmark.py ppc --> Benchmark PPC 12*9a0e4156SSadaf Ebrahimi 13*9a0e4156SSadaf Ebrahimifrom capstone import * 14*9a0e4156SSadaf Ebrahimi 15*9a0e4156SSadaf Ebrahimifrom time import time 16*9a0e4156SSadaf Ebrahimifrom random import randint 17*9a0e4156SSadaf Ebrahimiimport sys 18*9a0e4156SSadaf Ebrahimi 19*9a0e4156SSadaf Ebrahimi 20*9a0e4156SSadaf Ebrahimi# file providing code to disassemble 21*9a0e4156SSadaf EbrahimiFILE = '/usr/bin/python' 22*9a0e4156SSadaf Ebrahimi 23*9a0e4156SSadaf Ebrahimi 24*9a0e4156SSadaf Ebrahimiall_tests = ( 25*9a0e4156SSadaf Ebrahimi (CS_ARCH_X86, CS_MODE_16, "X86-16 (Intel syntax)", 0), 26*9a0e4156SSadaf Ebrahimi (CS_ARCH_X86, CS_MODE_32, "X86-32 (ATT syntax)", CS_OPT_SYNTAX_ATT), 27*9a0e4156SSadaf Ebrahimi (CS_ARCH_X86, CS_MODE_32, "X86-32 (Intel syntax)", 0), 28*9a0e4156SSadaf Ebrahimi (CS_ARCH_X86, CS_MODE_64, "X86-64 (Intel syntax)", 0), 29*9a0e4156SSadaf Ebrahimi (CS_ARCH_ARM, CS_MODE_ARM, "ARM", 0), 30*9a0e4156SSadaf Ebrahimi (CS_ARCH_ARM, CS_MODE_THUMB, "THUMB (ARM)", 0), 31*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS32 + CS_MODE_BIG_ENDIAN, "MIPS-32 (Big-endian)", 0), 32*9a0e4156SSadaf Ebrahimi (CS_ARCH_MIPS, CS_MODE_MIPS64 + CS_MODE_LITTLE_ENDIAN, "MIPS-64-EL (Little-endian)", 0), 33*9a0e4156SSadaf Ebrahimi (CS_ARCH_ARM64, CS_MODE_ARM, "ARM-64 (AArch64)", 0), 34*9a0e4156SSadaf Ebrahimi (CS_ARCH_PPC, CS_MODE_BIG_ENDIAN, "PPC", 0), 35*9a0e4156SSadaf Ebrahimi (CS_ARCH_PPC, CS_MODE_BIG_ENDIAN, "PPC, print register with number only", CS_OPT_SYNTAX_NOREGNAME), 36*9a0e4156SSadaf Ebrahimi (CS_ARCH_SPARC, CS_MODE_BIG_ENDIAN, "Sparc", 0), 37*9a0e4156SSadaf Ebrahimi (CS_ARCH_SYSZ, 0, "SystemZ", 0), 38*9a0e4156SSadaf Ebrahimi (CS_ARCH_XCORE, 0, "XCore", 0), 39*9a0e4156SSadaf Ebrahimi (CS_ARCH_M68K, 0, "M68K", 0), 40*9a0e4156SSadaf Ebrahimi ) 41*9a0e4156SSadaf Ebrahimi 42*9a0e4156SSadaf Ebrahimi 43*9a0e4156SSadaf Ebrahimi# for debugging 44*9a0e4156SSadaf Ebrahimidef to_hex(s): 45*9a0e4156SSadaf Ebrahimi return " ".join("0x" + "{0:x}".format(ord(c)).zfill(2) for c in s) # <-- Python 3 is OK 46*9a0e4156SSadaf Ebrahimi 47*9a0e4156SSadaf Ebrahimidef get_code(f, size): 48*9a0e4156SSadaf Ebrahimi code = f.read(size) 49*9a0e4156SSadaf Ebrahimi if len(code) != size: # reached end-of-file? 50*9a0e4156SSadaf Ebrahimi # then reset file position to begin-of-file 51*9a0e4156SSadaf Ebrahimi f.seek(0) 52*9a0e4156SSadaf Ebrahimi code = f.read(size) 53*9a0e4156SSadaf Ebrahimi 54*9a0e4156SSadaf Ebrahimi return code 55*9a0e4156SSadaf Ebrahimi 56*9a0e4156SSadaf Ebrahimi 57*9a0e4156SSadaf Ebrahimidef cs(md, code): 58*9a0e4156SSadaf Ebrahimi insns = md.disasm(code, 0) 59*9a0e4156SSadaf Ebrahimi # uncomment below line to speed up this function 200 times! 60*9a0e4156SSadaf Ebrahimi # return 61*9a0e4156SSadaf Ebrahimi for i in insns: 62*9a0e4156SSadaf Ebrahimi if i.address == 0x100000: 63*9a0e4156SSadaf Ebrahimi print i 64*9a0e4156SSadaf Ebrahimi 65*9a0e4156SSadaf Ebrahimi 66*9a0e4156SSadaf Ebrahimidef cs_lite(md, code): 67*9a0e4156SSadaf Ebrahimi insns = md.disasm_lite(code, 0) 68*9a0e4156SSadaf Ebrahimi for (addr, size, mnem, ops) in insns: 69*9a0e4156SSadaf Ebrahimi if addr == 0x100000: 70*9a0e4156SSadaf Ebrahimi print i 71*9a0e4156SSadaf Ebrahimi 72*9a0e4156SSadaf Ebrahimi 73*9a0e4156SSadaf Ebrahimicfile = open(FILE) 74*9a0e4156SSadaf Ebrahimi 75*9a0e4156SSadaf Ebrahimifor (arch, mode, comment, syntax) in all_tests: 76*9a0e4156SSadaf Ebrahimi try: 77*9a0e4156SSadaf Ebrahimi request = sys.argv[1] 78*9a0e4156SSadaf Ebrahimi if not request in comment.lower(): 79*9a0e4156SSadaf Ebrahimi continue 80*9a0e4156SSadaf Ebrahimi except: 81*9a0e4156SSadaf Ebrahimi pass 82*9a0e4156SSadaf Ebrahimi 83*9a0e4156SSadaf Ebrahimi print("Platform: %s" %comment) 84*9a0e4156SSadaf Ebrahimi 85*9a0e4156SSadaf Ebrahimi try: 86*9a0e4156SSadaf Ebrahimi md = Cs(arch, mode) 87*9a0e4156SSadaf Ebrahimi #md.detail = True 88*9a0e4156SSadaf Ebrahimi 89*9a0e4156SSadaf Ebrahimi if syntax != 0: 90*9a0e4156SSadaf Ebrahimi md.syntax = syntax 91*9a0e4156SSadaf Ebrahimi 92*9a0e4156SSadaf Ebrahimi # warm up few times 93*9a0e4156SSadaf Ebrahimi cfile.seek(0) 94*9a0e4156SSadaf Ebrahimi for i in xrange(3): 95*9a0e4156SSadaf Ebrahimi code = get_code(cfile, 128) 96*9a0e4156SSadaf Ebrahimi #print to_hex(code) 97*9a0e4156SSadaf Ebrahimi #print 98*9a0e4156SSadaf Ebrahimi cs(md, code) 99*9a0e4156SSadaf Ebrahimi 100*9a0e4156SSadaf Ebrahimi # start real benchmark 101*9a0e4156SSadaf Ebrahimi c_t = 0 102*9a0e4156SSadaf Ebrahimi for i in xrange(50000): 103*9a0e4156SSadaf Ebrahimi code = get_code(cfile, 128) 104*9a0e4156SSadaf Ebrahimi #print to_hex(code) 105*9a0e4156SSadaf Ebrahimi #print 106*9a0e4156SSadaf Ebrahimi 107*9a0e4156SSadaf Ebrahimi t1 = time() 108*9a0e4156SSadaf Ebrahimi cs(md, code) 109*9a0e4156SSadaf Ebrahimi c_t += time() - t1 110*9a0e4156SSadaf Ebrahimi 111*9a0e4156SSadaf Ebrahimi print "Benchmark - full obj:", c_t, "seconds" 112*9a0e4156SSadaf Ebrahimi print 113*9a0e4156SSadaf Ebrahimi 114*9a0e4156SSadaf Ebrahimi cfile.seek(0) 115*9a0e4156SSadaf Ebrahimi c_t = 0 116*9a0e4156SSadaf Ebrahimi for i in xrange(50000): 117*9a0e4156SSadaf Ebrahimi code = get_code(cfile, 128) 118*9a0e4156SSadaf Ebrahimi #print to_hex(code) 119*9a0e4156SSadaf Ebrahimi #print 120*9a0e4156SSadaf Ebrahimi 121*9a0e4156SSadaf Ebrahimi t1 = time() 122*9a0e4156SSadaf Ebrahimi cs_lite(md, code) 123*9a0e4156SSadaf Ebrahimi c_t += time() - t1 124*9a0e4156SSadaf Ebrahimi 125*9a0e4156SSadaf Ebrahimi print "Benchmark - lite:", c_t, "seconds" 126*9a0e4156SSadaf Ebrahimi print 127*9a0e4156SSadaf Ebrahimi except CsError as e: 128*9a0e4156SSadaf Ebrahimi print("ERROR: %s" %e) 129