Unicorn emulator: get uc_arch & uc_mode values just once (#779)

This commit is contained in:
Disconnect3d 2018-03-02 06:24:27 +07:00 committed by Yan Ivnitskiy
parent 20cb97f7ae
commit 9b75a1f0fe

View File

@ -34,24 +34,33 @@ class UnicornEmulator(object):
# instruction # instruction
self._should_be_written = {} self._should_be_written = {}
def reset(self):
self._emu = self._unicorn()
self._to_raise = None
def _unicorn(self):
if self._cpu.arch == CS_ARCH_ARM: if self._cpu.arch == CS_ARCH_ARM:
if self._cpu.mode == CS_MODE_ARM: self._uc_arch = UC_ARCH_ARM
return Uc(UC_ARCH_ARM, UC_MODE_ARM) self._uc_mode = {
elif self._cpu.mode == CS_MODE_THUMB: CS_MODE_ARM: UC_MODE_ARM,
return Uc(UC_ARCH_ARM, UC_MODE_THUMB) CS_MODE_THUMB: UC_MODE_THUMB
}[self._cpu.mode]
elif self._cpu.arch == CS_ARCH_ARM64:
self._uc_arch = UC_ARCH_ARM64
self._uc_mode = {
CS_MODE_ARM: UC_MODE_ARM,
CS_MODE_THUMB: UC_MODE_THUMB
}[self._cpu.mode]
elif self._cpu.arch == CS_ARCH_X86: elif self._cpu.arch == CS_ARCH_X86:
if self._cpu.mode == CS_MODE_32: self._uc_arch = UC_ARCH_X86
return Uc(UC_ARCH_X86, UC_MODE_32) self._uc_mode = {
elif self._cpu.mode == CS_MODE_64: CS_MODE_32: UC_MODE_32,
return Uc(UC_ARCH_X86, UC_MODE_64) CS_MODE_64: UC_MODE_64
}[self._cpu.mode]
raise RuntimeError("Unsupported architecture") else:
raise NotImplementedError('Unsupported architecture: %s' % self._cpu.arch)
def reset(self):
self._emu = Uc(self._uc_arch, self._uc_mode)
self._to_raise = None
def _create_emulated_mapping(self, uc, address): def _create_emulated_mapping(self, uc, address):
''' '''