|
10 | 10 | from typing import Tuple |
11 | 11 | from os.path import basename |
12 | 12 |
|
| 13 | +from keystone import (Ks, KS_ARCH_ARM, KS_ARCH_ARM64, KS_ARCH_MIPS, KS_ARCH_X86, |
| 14 | + KS_MODE_ARM, KS_MODE_THUMB, KS_MODE_MIPS32, KS_MODE_16, KS_MODE_32, KS_MODE_64, |
| 15 | + KS_MODE_LITTLE_ENDIAN, KS_MODE_BIG_ENDIAN) |
| 16 | + |
13 | 17 | from qiling import Qiling |
14 | | -from qiling.const import QL_VERBOSE |
| 18 | +from qiling.const import QL_ARCH, QL_ENDIAN, QL_VERBOSE |
15 | 19 |
|
16 | 20 | class QlArchUtils: |
17 | 21 | def __init__(self, ql: Qiling): |
@@ -57,3 +61,35 @@ def ql_hook_block_disasm(ql, address, size): |
57 | 61 | if self.ql.verbose >= QL_VERBOSE.DUMP: |
58 | 62 | self._block_hook = self.ql.hook_block(ql_hook_block_disasm) |
59 | 63 | self._disasm_hook = self.ql.hook_code(self.disassembler) |
| 64 | + |
| 65 | +# used by qltool prior to ql instantiation. to get an assembler object |
| 66 | +# after ql instantiation, use the appropriate ql.arch method |
| 67 | +def assembler(arch: QL_ARCH, endianess: QL_ENDIAN) -> Ks: |
| 68 | + """Instantiate an assembler object for a specified architecture. |
| 69 | +
|
| 70 | + Args: |
| 71 | + arch: architecture type |
| 72 | + endianess: architecture endianess |
| 73 | +
|
| 74 | + Returns: an assembler object |
| 75 | + """ |
| 76 | + |
| 77 | + endian = { |
| 78 | + QL_ENDIAN.EL : KS_MODE_LITTLE_ENDIAN, |
| 79 | + QL_ENDIAN.EB : KS_MODE_BIG_ENDIAN |
| 80 | + }[endianess] |
| 81 | + |
| 82 | + asm_map = { |
| 83 | + QL_ARCH.ARM : (KS_ARCH_ARM, KS_MODE_ARM), |
| 84 | + QL_ARCH.ARM64 : (KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN), |
| 85 | + QL_ARCH.ARM_THUMB : (KS_ARCH_ARM, KS_MODE_THUMB), |
| 86 | + QL_ARCH.MIPS : (KS_ARCH_MIPS, KS_MODE_MIPS32 + endian), |
| 87 | + QL_ARCH.A8086 : (KS_ARCH_X86, KS_MODE_16), |
| 88 | + QL_ARCH.X86 : (KS_ARCH_X86, KS_MODE_32), |
| 89 | + QL_ARCH.X8664 : (KS_ARCH_X86, KS_MODE_64) |
| 90 | + } |
| 91 | + |
| 92 | + if arch in asm_map: |
| 93 | + return Ks(*asm_map[arch]) |
| 94 | + |
| 95 | + raise NotImplementedError |
0 commit comments