diff --git a/bindings/python/unicorn/unicorn.py b/bindings/python/unicorn/unicorn.py index e4140c21..b880eb39 100644 --- a/bindings/python/unicorn/unicorn.py +++ b/bindings/python/unicorn/unicorn.py @@ -199,6 +199,7 @@ UC_HOOK_INSN_OUT_CB = ctypes.CFUNCTYPE( ) UC_HOOK_INSN_SYSCALL_CB = ctypes.CFUNCTYPE(None, uc_engine, ctypes.c_void_p) UC_HOOK_INSN_SYS_CB = ctypes.CFUNCTYPE(ctypes.c_uint32, uc_engine, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p) +UC_HOOK_INSN_CPUID_CB = ctypes.CFUNCTYPE(ctypes.c_uint32, uc_engine, ctypes.c_void_p) UC_MMIO_READ_CB = ctypes.CFUNCTYPE( ctypes.c_uint64, uc_engine, ctypes.c_uint64, ctypes.c_int, ctypes.c_void_p ) @@ -714,6 +715,12 @@ class Uc(object): (cb, data) = self._callbacks[user_data] cb(self, data) + @_catch_hook_exception + def _hook_insn_cpuid_cb(self, handle: int, user_data: int) -> int: + # call user's callback with self object + (cb, data) = self._callbacks[user_data] + return cb(self, data) + def ctl(self, control: int, *args): status = _uc.uc_ctl(self._uch, control, *args) if status != uc.UC_ERR_OK: @@ -817,6 +824,8 @@ class Uc(object): cb = ctypes.cast(UC_HOOK_INSN_OUT_CB(self._hook_insn_out_cb), UC_HOOK_INSN_OUT_CB) if arg1 in (x86_const.UC_X86_INS_SYSCALL, x86_const.UC_X86_INS_SYSENTER): # SYSCALL/SYSENTER instruction cb = ctypes.cast(UC_HOOK_INSN_SYSCALL_CB(self._hook_insn_syscall_cb), UC_HOOK_INSN_SYSCALL_CB) + if arg1 == x86_const.UC_X86_INS_CPUID: # CPUID instruction + cb = ctypes.cast(UC_HOOK_INSN_CPUID_CB(self._hook_insn_cpuid_cb), UC_HOOK_INSN_CPUID_CB) if arg1 in (arm64_const.UC_ARM64_INS_MRS, arm64_const.UC_ARM64_INS_MSR, arm64_const.UC_ARM64_INS_SYS, arm64_const.UC_ARM64_INS_SYSL): cb = ctypes.cast(UC_HOOK_INSN_SYS_CB(self._hook_insn_sys_cb), UC_HOOK_INSN_SYS_CB) status = _uc.uc_hook_add(