71 lines
1.9 KiB
Python
71 lines
1.9 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_MIPS, UC_MODE_MIPS32, UC_MODE_BIG_ENDIAN, UC_MODE_LITTLE_ENDIAN
|
||
|
from capstone import Cs, CS_ARCH_MIPS, CS_MODE_MIPS32, CS_MODE_BIG_ENDIAN, CS_MODE_LITTLE_ENDIAN
|
||
|
from keystone import Ks, KS_ARCH_MIPS, KS_MODE_MIPS32, KS_MODE_BIG_ENDIAN, KS_MODE_LITTLE_ENDIAN
|
||
|
|
||
|
from qiling import Qiling
|
||
|
from qiling.arch.arch import QlArch
|
||
|
from qiling.arch import mips_const
|
||
|
from qiling.arch.register import QlRegisterManager
|
||
|
from qiling.const import QL_ARCH, QL_ENDIAN
|
||
|
|
||
|
|
||
|
class QlArchMIPS(QlArch):
|
||
|
type = QL_ARCH.MIPS
|
||
|
bits = 32
|
||
|
|
||
|
def __init__(self, ql: Qiling, endian: QL_ENDIAN):
|
||
|
super().__init__(ql)
|
||
|
|
||
|
self._init_endian = endian
|
||
|
|
||
|
@cached_property
|
||
|
def uc(self) -> Uc:
|
||
|
endian = {
|
||
|
QL_ENDIAN.EB: UC_MODE_BIG_ENDIAN,
|
||
|
QL_ENDIAN.EL: UC_MODE_LITTLE_ENDIAN
|
||
|
}[self.endian]
|
||
|
|
||
|
return Uc(UC_ARCH_MIPS, UC_MODE_MIPS32 + endian)
|
||
|
|
||
|
@cached_property
|
||
|
def regs(self) -> QlRegisterManager:
|
||
|
regs_map = dict(
|
||
|
**mips_const.reg_map,
|
||
|
**mips_const.reg_map_afpr128,
|
||
|
**mips_const.reg_map_fpu
|
||
|
)
|
||
|
|
||
|
pc_reg = 'pc'
|
||
|
sp_reg = 'sp'
|
||
|
|
||
|
return QlRegisterManager(self.uc, regs_map, pc_reg, sp_reg)
|
||
|
|
||
|
@cached_property
|
||
|
def disassembler(self) -> Cs:
|
||
|
endian = {
|
||
|
QL_ENDIAN.EL: CS_MODE_LITTLE_ENDIAN,
|
||
|
QL_ENDIAN.EB: CS_MODE_BIG_ENDIAN
|
||
|
}[self.endian]
|
||
|
|
||
|
return Cs(CS_ARCH_MIPS, CS_MODE_MIPS32 + endian)
|
||
|
|
||
|
@cached_property
|
||
|
def assembler(self) -> Ks:
|
||
|
endian = {
|
||
|
QL_ENDIAN.EL: KS_MODE_LITTLE_ENDIAN,
|
||
|
QL_ENDIAN.EB: KS_MODE_BIG_ENDIAN
|
||
|
}[self.endian]
|
||
|
|
||
|
return Ks(KS_ARCH_MIPS, KS_MODE_MIPS32 + endian)
|
||
|
|
||
|
@property
|
||
|
def endian(self) -> QL_ENDIAN:
|
||
|
return self._init_endian
|