| 110 | |
| 111 | ## Main Keypatch class |
| 112 | class Keypatch_Asm: |
| 113 | # supported architectures |
| 114 | arch_lists = { |
| 115 | "X86 16-bit": (KS_ARCH_X86, KS_MODE_16), # X86 16-bit |
| 116 | "X86 32-bit": (KS_ARCH_X86, KS_MODE_32), # X86 32-bit |
| 117 | "X86 64-bit": (KS_ARCH_X86, KS_MODE_64), # X86 64-bit |
| 118 | "ARM": (KS_ARCH_ARM, KS_MODE_ARM), # ARM |
| 119 | "ARM Thumb": (KS_ARCH_ARM, KS_MODE_THUMB), # ARM Thumb |
| 120 | "ARM64 (ARMV8)": (KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN),# ARM64 |
| 121 | "Hexagon": (KS_ARCH_HEXAGON, KS_MODE_BIG_ENDIAN), # Hexagon |
| 122 | "Mips32": (KS_ARCH_MIPS, KS_MODE_MIPS32), # Mips32 |
| 123 | "Mips64": (KS_ARCH_MIPS, KS_MODE_MIPS64), # Mips64 |
| 124 | "PowerPC 32": (KS_ARCH_PPC, KS_MODE_PPC32), # PPC32 |
| 125 | "PowerPC 64": (KS_ARCH_PPC, KS_MODE_PPC64), # PPC64 |
| 126 | "Sparc 32": (KS_ARCH_SPARC, KS_MODE_SPARC32), # Sparc32 |
| 127 | "Sparc 64": (KS_ARCH_SPARC, KS_MODE_SPARC64), # Sparc64 |
| 128 | "SystemZ": (KS_ARCH_SYSTEMZ, KS_MODE_BIG_ENDIAN), # SystemZ |
| 129 | } |
| 130 | |
| 131 | endian_lists = { |
| 132 | "Little Endian": KS_MODE_LITTLE_ENDIAN, # little endian |
| 133 | "Big Endian": KS_MODE_BIG_ENDIAN, # big endian |
| 134 | } |
| 135 | |
| 136 | syntax_lists = { |
| 137 | "Intel": KS_OPT_SYNTAX_INTEL, |
| 138 | "Nasm": KS_OPT_SYNTAX_NASM, |
| 139 | "AT&T": KS_OPT_SYNTAX_ATT |
| 140 | } |
| 141 | |
| 142 | def __init__(self, arch=None, mode=None): |
| 143 | # update current arch and mode |
| 144 | self.update_hardware_mode() |
| 145 | |
| 146 | # override arch & mode if provided |
| 147 | if arch is not None: |
| 148 | self.arch = arch |
| 149 | if mode is not None: |
| 150 | self.mode = mode |
| 151 | |
| 152 | # IDA uses Intel syntax by default |
| 153 | self.syntax = KS_OPT_SYNTAX_INTEL |
| 154 | |
| 155 | # return Keystone arch & mode (with endianess included) |
| 156 | @staticmethod |
| 157 | def get_hardware_mode(): |
| 158 | (arch, mode) = (None, None) |
| 159 | |
| 160 | # heuristically detect hardware setup |
| 161 | info = idaapi.get_inf_structure() |
| 162 | cpuname = info.procName.lower() |
| 163 | if cpuname == "metapc": |
| 164 | arch = KS_ARCH_X86 |
| 165 | if info.is_64bit(): |
| 166 | mode = KS_MODE_64 |
| 167 | elif info.is_32bit(): |
| 168 | mode = KS_MODE_32 |
| 169 | else: |