diff --git a/src/emulator/emulator.hpp b/src/emulator/emulator.hpp index e2100e57..d1fad6c2 100644 --- a/src/emulator/emulator.hpp +++ b/src/emulator/emulator.hpp @@ -34,6 +34,7 @@ public: virtual void read_raw_register(int reg, void* value, size_t size) = 0; virtual void write_raw_register(int reg, const void* value, size_t size) = 0; + virtual bool try_map_memory(uint64_t address, size_t size, memory_permission permissions) = 0; virtual void map_memory(uint64_t address, size_t size, memory_permission permissions) = 0; virtual void unmap_memory(uint64_t address, size_t size) = 0; diff --git a/src/unicorn_emulator/unicorn_hook.hpp b/src/unicorn_emulator/unicorn_hook.hpp index 558eed1d..6b23b6ee 100644 --- a/src/unicorn_emulator/unicorn_hook.hpp +++ b/src/unicorn_emulator/unicorn_hook.hpp @@ -53,10 +53,11 @@ namespace unicorn this->uc_ = obj.uc_; this->hook_ = obj.hook_; + + obj.hook_ = {}; obj.uc_ = {}; } - return *this; } diff --git a/src/unicorn_emulator/unicorn_x64_emulator.cpp b/src/unicorn_emulator/unicorn_x64_emulator.cpp index 4cbc98fc..eb821544 100644 --- a/src/unicorn_emulator/unicorn_x64_emulator.cpp +++ b/src/unicorn_emulator/unicorn_x64_emulator.cpp @@ -148,6 +148,7 @@ namespace unicorn ~unicorn_x64_emulator() override { + this->hooks_.clear(); uc_close(this->uc_); } @@ -196,6 +197,11 @@ namespace unicorn uce(uc_mem_map(*this, address, size, static_cast(permissions))); } + bool try_map_memory(const uint64_t address, const size_t size, memory_permission permissions) override + { + return uc_mem_map(*this, address, size, static_cast(permissions)) == UC_ERR_OK; + } + void unmap_memory(const uint64_t address, const size_t size) override { uce(uc_mem_unmap(*this, address, size)); diff --git a/src/windows_emulator/syscalls.cpp b/src/windows_emulator/syscalls.cpp index 7c4d87b1..04ccdf21 100644 --- a/src/windows_emulator/syscalls.cpp +++ b/src/windows_emulator/syscalls.cpp @@ -400,21 +400,13 @@ namespace while (true) { - try + succeeded = emu.try_map_memory(allocation_base, allocation_bytes, protection); + if (succeeded || !allocate_anywhere) { - emu.map_memory(allocation_base, allocation_bytes, protection); - succeeded = true; break; } - catch (...) - { - if (!allocate_anywhere) - { - break; - } - allocation_base += allocation_granularity; - } + allocation_base += allocation_granularity; } base_address.write(allocation_base); @@ -463,22 +455,13 @@ namespace while (true) { - try + succeeded = emu.try_map_memory(allocation_base, allocation_bytes, protection); + if (succeeded || !allocate_anywhere) { - emu.map_memory(allocation_base, allocation_bytes, protection); - succeeded = true; break; } - catch (...) - { - succeeded = false; - if (!allocate_anywhere) - { - break; - } - allocation_base += allocation_granularity; - } + allocation_base += allocation_granularity; } base_address.write(allocation_base);