From cb09df3027aefac37ab464dfcb2d12debd0d7541 Mon Sep 17 00:00:00 2001 From: Ryan Hileman Date: Sat, 29 Aug 2015 09:42:36 -0700 Subject: [PATCH] fix invalid memory hook in Go bindings --- bindings/go/unicorn/hook.c | 4 ++-- bindings/go/unicorn/hook.go | 13 +++++++++---- bindings/go/unicorn/hook.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bindings/go/unicorn/hook.c b/bindings/go/unicorn/hook.c index b928ae77..e715e1a2 100644 --- a/bindings/go/unicorn/hook.c +++ b/bindings/go/unicorn/hook.c @@ -9,8 +9,8 @@ void hookCode_cgo(uch handle, uint64_t addr, uint32_t size, void *user) { hookCode(handle, addr, size, user); } -bool hookMemInvalid_cgo(uch handle, uc_mem_type type, uint64_t addr, int64_t value, void *user) { - return hookMemInvalid(handle, type, addr, value, user); +bool hookMemInvalid_cgo(uch handle, uc_mem_type type, uint64_t addr, int size, int64_t value, void *user) { + return hookMemInvalid(handle, type, addr, size, value, user); } void hookMemAccess_cgo(uch handle, uc_mem_type type, uint64_t addr, int size, int64_t value, void *user) { diff --git a/bindings/go/unicorn/hook.go b/bindings/go/unicorn/hook.go index ac4d8dcf..b9e3c14b 100644 --- a/bindings/go/unicorn/hook.go +++ b/bindings/go/unicorn/hook.go @@ -23,15 +23,15 @@ func hookCode(handle C.uch, addr C.uint64_t, size C.uint32_t, user unsafe.Pointe } //export hookMemInvalid -func hookMemInvalid(handle C.uch, typ C.uc_mem_type, addr C.uint64_t, value C.int64_t, user unsafe.Pointer) C.bool { +func hookMemInvalid(handle C.uch, typ C.uc_mem_type, addr C.uint64_t, size int, value C.int64_t, user unsafe.Pointer) C.bool { hook := (*HookData)(user) - return C.bool(hook.Callback.(func(*Uc, int, uint64, int64) bool)(hook.Uc, int(typ), uint64(addr), int64(value))) + return C.bool(hook.Callback.(func(*Uc, int, uint64, int, int64) bool)(hook.Uc, int(typ), uint64(addr), size, int64(value))) } //export hookMemAccess func hookMemAccess(handle C.uch, typ C.uc_mem_type, addr C.uint64_t, size int, value C.int64_t, user unsafe.Pointer) { hook := (*HookData)(user) - hook.Callback.(func(*Uc, int, uint64, uint32, int64))(hook.Uc, int(typ), uint64(addr), uint32(size), int64(value)) + hook.Callback.(func(*Uc, int, uint64, int, int64))(hook.Uc, int(typ), uint64(addr), size, int64(value)) } //export hookX86In @@ -52,6 +52,8 @@ func hookX86Syscall(handle C.uch, user unsafe.Pointer) { hook.Callback.(func(*Uc))(hook.Uc) } +var hookRetain = make(map[C.uch]*HookData) + func (u *Uc) HookAdd(htype int, cb interface{}, insn ...int) (C.uch, error) { var callback unsafe.Pointer var extra C.int @@ -78,10 +80,13 @@ func (u *Uc) HookAdd(htype int, cb interface{}, insn ...int) (C.uch, error) { return 0, errors.New("Unknown hook type.") } var h2 C.uch - C.uc_hook_add2(u.Handle, &h2, C.uc_hook_t(htype), callback, unsafe.Pointer(&HookData{u, cb}), extra) + data := &HookData{u, cb} + C.uc_hook_add2(u.Handle, &h2, C.uc_hook_t(htype), callback, unsafe.Pointer(data), extra) + hookRetain[h2] = data return h2, nil } func (u *Uc) HookDel(hook *C.uch) error { + delete(hookRetain, *hook) return errReturn(C.uc_hook_del(u.Handle, hook)) } diff --git a/bindings/go/unicorn/hook.h b/bindings/go/unicorn/hook.h index 8bafb526..a89d8ec0 100644 --- a/bindings/go/unicorn/hook.h +++ b/bindings/go/unicorn/hook.h @@ -1,6 +1,6 @@ uc_err uc_hook_add2(uch handle, uch *h2, uc_hook_t type, void *callback, void *user_data, int extra); void hookCode_cgo(uch handle, uint64_t addr, uint32_t size, void *user); -bool hookMemInvalid_cgo(uch handle, uc_mem_type type, uint64_t addr, int64_t value, void *user); +bool hookMemInvalid_cgo(uch handle, uc_mem_type type, uint64_t addr, int size, int64_t value, void *user); void hookMemAccess_cgo(uch handle, uc_mem_type type, uint64_t addr, int size, int64_t value, void *user); uint32_t hookX86In_cgo(uch handle, uint32_t port, uint32_t size, void *user); void hookX86Out_cgo(uch handle, uint32_t port, uint32_t size, uint32_t value, void *user);