make i386 instructions RDTSC and RDTSCP hookable (#2066)
* instruction hooks for RDTSC and RDTSCP Signed-off-by: Pedro Tôrres <t0rr3sp3dr0@gmail.com> * update hookable instruction list Signed-off-by: Pedro Tôrres <t0rr3sp3dr0@gmail.com> * test RDTSC and RDTSCP instruction hooks Signed-off-by: Pedro Tôrres <t0rr3sp3dr0@gmail.com> --------- Signed-off-by: Pedro Tôrres <t0rr3sp3dr0@gmail.com> Co-authored-by: mio <mio@lazym.io>
This commit is contained in:
@@ -40,3 +40,7 @@ void hookX86Out_cgo(uc_engine *handle, uint32_t port, uint32_t size, uint32_t va
|
||||
void hookX86Syscall_cgo(uc_engine *handle, uintptr_t user) {
|
||||
hookX86Syscall(handle, (void *)user);
|
||||
}
|
||||
|
||||
int hookX86Cpuid_cgo(uc_engine *handle, uintptr_t user) {
|
||||
return hookX86Cpuid(handle, (void *)user);
|
||||
}
|
||||
|
||||
@@ -98,6 +98,12 @@ func hookX86Syscall(handle unsafe.Pointer, user unsafe.Pointer) {
|
||||
hook.Callback.(func(Unicorn))(hook.Uc)
|
||||
}
|
||||
|
||||
//export hookX86Cpuid
|
||||
func hookX86Cpuid(handle unsafe.Pointer, user unsafe.Pointer) bool {
|
||||
hook := hookMap.get(user)
|
||||
return hook.Callback.(func(Unicorn) bool)(hook.Uc)
|
||||
}
|
||||
|
||||
func (u *uc) HookAdd(htype int, cb interface{}, begin, end uint64, extra ...int) (Hook, error) {
|
||||
var callback unsafe.Pointer
|
||||
var insn C.int
|
||||
@@ -119,6 +125,8 @@ func (u *uc) HookAdd(htype int, cb interface{}, begin, end uint64, extra ...int)
|
||||
callback = C.hookX86Out_cgo
|
||||
case X86_INS_SYSCALL, X86_INS_SYSENTER:
|
||||
callback = C.hookX86Syscall_cgo
|
||||
case X86_INS_CPUID, X86_INS_RDTSC, X86_INS_RDTSCP:
|
||||
callback = C.hookX86Cpuid_cgo
|
||||
default:
|
||||
return 0, errors.New("Unknown instruction type.")
|
||||
}
|
||||
|
||||
@@ -7,3 +7,4 @@ void hookInterrupt_cgo(uc_engine *handle, uint32_t intno, uintptr_t user);
|
||||
uint32_t hookX86In_cgo(uc_engine *handle, uint32_t port, uint32_t size, uintptr_t user);
|
||||
void hookX86Out_cgo(uc_engine *handle, uint32_t port, uint32_t size, uint32_t value, uintptr_t user);
|
||||
void hookX86Syscall_cgo(uc_engine *handle, uintptr_t user);
|
||||
int hookX86Cpuid_cgo(uc_engine *handle, uintptr_t user);
|
||||
|
||||
Reference in New Issue
Block a user