diff --git a/bindings/go/unicorn/unicorn.go b/bindings/go/unicorn/unicorn.go index 2cabac74..ca210c43 100644 --- a/bindings/go/unicorn/unicorn.go +++ b/bindings/go/unicorn/unicorn.go @@ -28,6 +28,7 @@ func errReturn(err C.uc_err) error { type Unicorn interface { MemMap(addr, size uint64) error MemMapProt(addr, size uint64, prot int) error + MemMapPtr(addr, size uint64, ptr unsafe.Pointer) error MemUnmap(addr, size uint64) error MemRead(addr, size uint64) ([]byte, error) MemReadInto(dst []byte, addr uint64) error @@ -128,6 +129,10 @@ func (u *uc) MemMap(addr, size uint64) error { return u.MemMapProt(addr, size, PROT_ALL) } +func (u *uc) MemMapPtr(addr, size uint64, ptr unsafe.Pointer) error { + return errReturn(C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.size_t(size), ptr)) +} + func (u *uc) MemUnmap(addr, size uint64) error { return errReturn(C.uc_mem_unmap(u.handle, C.uint64_t(addr), C.size_t(size))) } diff --git a/bindings/python/unicorn/unicorn.py b/bindings/python/unicorn/unicorn.py index 553d2176..2ccb02ae 100644 --- a/bindings/python/unicorn/unicorn.py +++ b/bindings/python/unicorn/unicorn.py @@ -104,6 +104,7 @@ _setup_prototype(_uc, "uc_emu_start", ucerr, uc_engine, ctypes.c_uint64, ctypes. _setup_prototype(_uc, "uc_emu_stop", ucerr, uc_engine) _setup_prototype(_uc, "uc_hook_del", ucerr, uc_engine, uc_hook_h) _setup_prototype(_uc, "uc_mem_map", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32) +_setup_prototype(_uc, "uc_mem_map_ptr", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_void_p) _setup_prototype(_uc, "uc_mem_unmap", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t) _setup_prototype(_uc, "uc_mem_protect", ucerr, uc_engine, ctypes.c_uint64, ctypes.c_size_t, ctypes.c_uint32) @@ -241,6 +242,13 @@ class Uc(object): raise UcError(status) + # map a range of memory from a raw host memory address + def mem_map_ptr(self, address, size, ptr): + status = _uc.uc_mem_map_ptr(self._uch, address, size, ptr) + if status != UC_ERR_OK: + raise UcError(status) + + # unmap a range of memory def mem_unmap(self, address, size): status = _uc.uc_mem_unmap(self._uch, address, size)