From c81d66670c4fd78475ef064b1b637ecd17f06917 Mon Sep 17 00:00:00 2001 From: elicn Date: Mon, 30 Aug 2021 03:41:21 +0300 Subject: [PATCH] Bring back utils assembler for qltool --- qiling/arch/utils.py | 38 +++++++++++++++++++++++++++++++++++++- qltool | 5 ++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/qiling/arch/utils.py b/qiling/arch/utils.py index bb5a5b36..c3485704 100644 --- a/qiling/arch/utils.py +++ b/qiling/arch/utils.py @@ -10,8 +10,12 @@ This module is intended for general purpose functions that are only used in qili from typing import Tuple from os.path import basename +from keystone import (Ks, KS_ARCH_ARM, KS_ARCH_ARM64, KS_ARCH_MIPS, KS_ARCH_X86, + KS_MODE_ARM, KS_MODE_THUMB, KS_MODE_MIPS32, KS_MODE_16, KS_MODE_32, KS_MODE_64, + KS_MODE_LITTLE_ENDIAN, KS_MODE_BIG_ENDIAN) + from qiling import Qiling -from qiling.const import QL_VERBOSE +from qiling.const import QL_ARCH, QL_ENDIAN, QL_VERBOSE class QlArchUtils: def __init__(self, ql: Qiling): @@ -57,3 +61,35 @@ class QlArchUtils: if self.ql.verbose >= QL_VERBOSE.DUMP: self._block_hook = self.ql.hook_block(ql_hook_block_disasm) self._disasm_hook = self.ql.hook_code(self.disassembler) + +# used by qltool prior to ql instantiation. to get an assembler object +# after ql instantiation, use the appropriate ql.arch method +def assembler(arch: QL_ARCH, endianess: QL_ENDIAN) -> Ks: + """Instantiate an assembler object for a specified architecture. + + Args: + arch: architecture type + endianess: architecture endianess + + Returns: an assembler object + """ + + endian = { + QL_ENDIAN.EL : KS_MODE_LITTLE_ENDIAN, + QL_ENDIAN.EB : KS_MODE_BIG_ENDIAN + }[endianess] + + asm_map = { + QL_ARCH.ARM : (KS_ARCH_ARM, KS_MODE_ARM), + QL_ARCH.ARM64 : (KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN), + QL_ARCH.ARM_THUMB : (KS_ARCH_ARM, KS_MODE_THUMB), + QL_ARCH.MIPS : (KS_ARCH_MIPS, KS_MODE_MIPS32 + endian), + QL_ARCH.A8086 : (KS_ARCH_X86, KS_MODE_16), + QL_ARCH.X86 : (KS_ARCH_X86, KS_MODE_32), + QL_ARCH.X8664 : (KS_ARCH_X86, KS_MODE_64) + } + + if arch in asm_map: + return Ks(*asm_map[arch]) + + raise NotImplementedError diff --git a/qltool b/qltool index 9bb0c4dc..8555423f 100755 --- a/qltool +++ b/qltool @@ -11,7 +11,7 @@ import pickle import unicorn from qiling import Qiling -from qiling.arch.utils import ql_create_assembler +from qiling.arch import utils as arch_utils from qiling.debugger.qdb import QlQdb from qiling.utils import arch_convert from qiling.const import QL_VERBOSE, QL_ENDIAN, os_map, arch_map, verbose_map @@ -69,8 +69,7 @@ def handle_code(options: argparse.Namespace): 'big' : QL_ENDIAN.EB }[options.endian] - # TODO: Thumb support. - assembler = ql_create_assembler(archtype, archendian, 0) + assembler = arch_utils.assembler(archtype, archendian) code, _ = assembler.asm(assembly) code = bytes(code)