Skip to content

Commit c81d666

Browse files
committed
Bring back utils assembler for qltool
1 parent 7cacad9 commit c81d666

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

qiling/arch/utils.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@
1010
from typing import Tuple
1111
from os.path import basename
1212

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+
1317
from qiling import Qiling
14-
from qiling.const import QL_VERBOSE
18+
from qiling.const import QL_ARCH, QL_ENDIAN, QL_VERBOSE
1519

1620
class QlArchUtils:
1721
def __init__(self, ql: Qiling):
@@ -57,3 +61,35 @@ def ql_hook_block_disasm(ql, address, size):
5761
if self.ql.verbose >= QL_VERBOSE.DUMP:
5862
self._block_hook = self.ql.hook_block(ql_hook_block_disasm)
5963
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

qltool

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import pickle
1111
import unicorn
1212

1313
from qiling import Qiling
14-
from qiling.arch.utils import ql_create_assembler
14+
from qiling.arch import utils as arch_utils
1515
from qiling.debugger.qdb import QlQdb
1616
from qiling.utils import arch_convert
1717
from qiling.const import QL_VERBOSE, QL_ENDIAN, os_map, arch_map, verbose_map
@@ -69,8 +69,7 @@ def handle_code(options: argparse.Namespace):
6969
'big' : QL_ENDIAN.EB
7070
}[options.endian]
7171

72-
# TODO: Thumb support.
73-
assembler = ql_create_assembler(archtype, archendian, 0)
72+
assembler = arch_utils.assembler(archtype, archendian)
7473
code, _ = assembler.asm(assembly)
7574
code = bytes(code)
7675

0 commit comments

Comments
 (0)