136 lines
3.4 KiB
Python
136 lines
3.4 KiB
Python
|
#!/usr/bin/env python3
|
||
|
#
|
||
|
# Cross Platform and Multi Architecture Advanced Binary Emulation Framework
|
||
|
#
|
||
|
|
||
|
from functools import cached_property
|
||
|
|
||
|
from unicorn import Uc, UC_ARCH_X86, UC_MODE_16, UC_MODE_32, UC_MODE_64
|
||
|
from capstone import Cs, CS_ARCH_X86, CS_MODE_16, CS_MODE_32, CS_MODE_64
|
||
|
from keystone import Ks, KS_ARCH_X86, KS_MODE_16, KS_MODE_32, KS_MODE_64
|
||
|
|
||
|
from qiling.arch.arch import QlArch
|
||
|
from qiling.arch.msr import QlMsrManager
|
||
|
from qiling.arch.register import QlRegisterManager
|
||
|
from qiling.arch import x86_const
|
||
|
from qiling.const import QL_ARCH, QL_ENDIAN
|
||
|
|
||
|
|
||
|
class QlArchIntel(QlArch):
|
||
|
@property
|
||
|
def endian(self) -> QL_ENDIAN:
|
||
|
return QL_ENDIAN.EL
|
||
|
|
||
|
@cached_property
|
||
|
def msr(self) -> QlMsrManager:
|
||
|
"""Model-Specific Registers.
|
||
|
"""
|
||
|
|
||
|
return QlMsrManager(self.uc)
|
||
|
|
||
|
|
||
|
class QlArchA8086(QlArchIntel):
|
||
|
type = QL_ARCH.A8086
|
||
|
bits = 16
|
||
|
|
||
|
@cached_property
|
||
|
def uc(self) -> Uc:
|
||
|
return Uc(UC_ARCH_X86, UC_MODE_16)
|
||
|
|
||
|
@cached_property
|
||
|
def regs(self) -> QlRegisterManager:
|
||
|
regs_map = dict(
|
||
|
**x86_const.reg_map_8,
|
||
|
**x86_const.reg_map_16,
|
||
|
**x86_const.reg_map_misc
|
||
|
)
|
||
|
|
||
|
pc_reg = 'ip'
|
||
|
sp_reg = 'sp'
|
||
|
|
||
|
return QlRegisterManager(self.uc, regs_map, pc_reg, sp_reg)
|
||
|
|
||
|
@cached_property
|
||
|
def disassembler(self) -> Cs:
|
||
|
return Cs(CS_ARCH_X86, CS_MODE_16)
|
||
|
|
||
|
@cached_property
|
||
|
def assembler(self) -> Ks:
|
||
|
return Ks(KS_ARCH_X86, KS_MODE_16)
|
||
|
|
||
|
|
||
|
class QlArchX86(QlArchIntel):
|
||
|
type = QL_ARCH.X86
|
||
|
bits = 32
|
||
|
|
||
|
@cached_property
|
||
|
def uc(self) -> Uc:
|
||
|
return Uc(UC_ARCH_X86, UC_MODE_32)
|
||
|
|
||
|
@cached_property
|
||
|
def regs(self) -> QlRegisterManager:
|
||
|
regs_map = dict(
|
||
|
**x86_const.reg_map_8,
|
||
|
**x86_const.reg_map_16,
|
||
|
**x86_const.reg_map_32,
|
||
|
**x86_const.reg_map_cr,
|
||
|
**x86_const.reg_map_dr,
|
||
|
**x86_const.reg_map_st,
|
||
|
**x86_const.reg_map_misc
|
||
|
)
|
||
|
|
||
|
pc_reg = 'eip'
|
||
|
sp_reg = 'esp'
|
||
|
|
||
|
return QlRegisterManager(self.uc, regs_map, pc_reg, sp_reg)
|
||
|
|
||
|
@cached_property
|
||
|
def disassembler(self) -> Cs:
|
||
|
return Cs(CS_ARCH_X86, CS_MODE_32)
|
||
|
|
||
|
@cached_property
|
||
|
def assembler(self) -> Ks:
|
||
|
return Ks(KS_ARCH_X86, KS_MODE_32)
|
||
|
|
||
|
|
||
|
class QlArchX8664(QlArchIntel):
|
||
|
type = QL_ARCH.X8664
|
||
|
bits = 64
|
||
|
|
||
|
@cached_property
|
||
|
def uc(self) -> Uc:
|
||
|
return Uc(UC_ARCH_X86, UC_MODE_64)
|
||
|
|
||
|
@cached_property
|
||
|
def regs(self) -> QlRegisterManager:
|
||
|
regs_map = dict(
|
||
|
**x86_const.reg_map_8,
|
||
|
**x86_const.reg_map_16,
|
||
|
**x86_const.reg_map_32,
|
||
|
**x86_const.reg_map_64,
|
||
|
**x86_const.reg_map_cr,
|
||
|
**x86_const.reg_map_dr,
|
||
|
**x86_const.reg_map_st,
|
||
|
**x86_const.reg_map_misc,
|
||
|
**x86_const.reg_map_64_b,
|
||
|
**x86_const.reg_map_64_w,
|
||
|
**x86_const.reg_map_64_d,
|
||
|
**x86_const.reg_map_seg_base,
|
||
|
**x86_const.reg_map_xmm,
|
||
|
**x86_const.reg_map_ymm,
|
||
|
**x86_const.reg_map_zmm
|
||
|
)
|
||
|
|
||
|
pc_reg = 'rip'
|
||
|
sp_reg = 'rsp'
|
||
|
|
||
|
return QlRegisterManager(self.uc, regs_map, pc_reg, sp_reg)
|
||
|
|
||
|
@cached_property
|
||
|
def disassembler(self) -> Cs:
|
||
|
return Cs(CS_ARCH_X86, CS_MODE_64)
|
||
|
|
||
|
@cached_property
|
||
|
def assembler(self) -> Ks:
|
||
|
return Ks(KS_ARCH_X86, KS_MODE_64)
|