From 1276c7e2bc987cdab62027899d51f68098b3a874 Mon Sep 17 00:00:00 2001 From: 3fault Date: Tue, 1 Jul 2025 19:04:22 -0400 Subject: [PATCH] Update occurances of memory_permission to nt_memory_permission where needed --- .../icicle_x86_64_emulator.cpp | 8 ++--- .../unicorn_x86_64_emulator.cpp | 8 ++--- src/emulator/memory_interface.hpp | 4 +-- src/windows-emulator/memory_manager.cpp | 36 ++++++++++++------- src/windows-emulator/memory_manager.hpp | 18 +++++----- src/windows-emulator/syscalls/memory.cpp | 2 +- 6 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp b/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp index cb759e3a..6bb1d6fa 100644 --- a/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp +++ b/src/backends/icicle-emulator/icicle_x86_64_emulator.cpp @@ -193,9 +193,9 @@ namespace icicle icicle_map_mmio(this->emu_, address, size, read_wrapper, ptr, write_wrapper, ptr); } - void map_memory(const uint64_t address, const size_t size, memory_permission permissions) override + void map_memory(const uint64_t address, const size_t size, nt_memory_permission permissions) override { - const auto res = icicle_map_memory(this->emu_, address, size, static_cast(permissions)); + const auto res = icicle_map_memory(this->emu_, address, size, static_cast(permissions.common)); ice(res, "Failed to map memory"); } @@ -222,9 +222,9 @@ namespace icicle ice(res, "Failed to write memory"); } - void apply_memory_protection(const uint64_t address, const size_t size, memory_permission permissions) override + void apply_memory_protection(const uint64_t address, const size_t size, nt_memory_permission permissions) override { - const auto res = icicle_protect_memory(this->emu_, address, size, static_cast(permissions)); + const auto res = icicle_protect_memory(this->emu_, address, size, static_cast(permissions.common)); ice(res, "Failed to apply permissions"); } diff --git a/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp b/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp index 52629f76..d1e48259 100644 --- a/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp +++ b/src/backends/unicorn-emulator/unicorn_x86_64_emulator.cpp @@ -335,9 +335,9 @@ namespace unicorn this->mmio_[address] = std::move(cb); } - void map_memory(const uint64_t address, const size_t size, memory_permission permissions) override + void map_memory(const uint64_t address, const size_t size, nt_memory_permission permissions) override { - uce(uc_mem_map(*this, address, size, static_cast(permissions))); + uce(uc_mem_map(*this, address, size, static_cast(permissions.common))); } void unmap_memory(const uint64_t address, const size_t size) override @@ -367,9 +367,9 @@ namespace unicorn } void apply_memory_protection(const uint64_t address, const size_t size, - memory_permission permissions) override + nt_memory_permission permissions) override { - uce(uc_mem_protect(*this, address, size, static_cast(permissions))); + uce(uc_mem_protect(*this, address, size, static_cast(permissions.common))); } emulator_hook* hook_instruction(const int instruction_type, instruction_hook_callback callback) override diff --git a/src/emulator/memory_interface.hpp b/src/emulator/memory_interface.hpp index 3f472040..b8e67096 100644 --- a/src/emulator/memory_interface.hpp +++ b/src/emulator/memory_interface.hpp @@ -22,10 +22,10 @@ class memory_interface private: virtual void map_mmio(uint64_t address, size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb) = 0; - virtual void map_memory(uint64_t address, size_t size, memory_permission permissions) = 0; + virtual void map_memory(uint64_t address, size_t size, nt_memory_permission permissions) = 0; virtual void unmap_memory(uint64_t address, size_t size) = 0; - virtual void apply_memory_protection(uint64_t address, size_t size, memory_permission permissions) = 0; + virtual void apply_memory_protection(uint64_t address, size_t size, nt_memory_permission permissions) = 0; public: template diff --git a/src/windows-emulator/memory_manager.cpp b/src/windows-emulator/memory_manager.cpp index 98268bef..14c0ca55 100644 --- a/src/windows-emulator/memory_manager.cpp +++ b/src/windows-emulator/memory_manager.cpp @@ -1,8 +1,10 @@ +#include "memory_permission.hpp" #include "std_include.hpp" #include "memory_manager.hpp" #include "memory_region.hpp" #include "address_utils.hpp" +#include "windows-emulator/memory_permission_ext.hpp" #include #include @@ -73,7 +75,7 @@ namespace utils static void deserialize(buffer_deserializer& buffer, memory_manager::committed_region& region) { region.length = static_cast(buffer.read()); - region.permissions = buffer.read(); + region.permissions = buffer.read(); } static void serialize(buffer_serializer& buffer, const memory_manager::reserved_region& region) @@ -170,8 +172,8 @@ void memory_manager::deserialize_memory_state(utils::buffer_deserializer& buffer } } -bool memory_manager::protect_memory(const uint64_t address, const size_t size, const memory_permission permissions, - memory_permission* old_permissions) +bool memory_manager::protect_memory(const uint64_t address, const size_t size, const nt_memory_permission permissions, + nt_memory_permission* old_permissions) { const auto entry = this->find_reserved_region(address); if (entry == this->reserved_regions_.end()) @@ -249,7 +251,7 @@ bool memory_manager::allocate_mmio(const uint64_t address, const size_t size, mm return true; } -bool memory_manager::allocate_memory(const uint64_t address, const size_t size, const memory_permission permissions, +bool memory_manager::allocate_memory(const uint64_t address, const size_t size, const nt_memory_permission permissions, const bool reserve_only) { if (this->overlaps_reserved_region(address, size)) @@ -268,7 +270,13 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size, if (!reserve_only) { this->map_memory(address, size, permissions); - entry->second.committed_regions[address] = committed_region{size, memory_permission::read_write}; + + auto common = memory_permission::read_write; + auto extended = permissions.is_guarded() + ? memory_permission_ext::guard + : memory_permission_ext::none; + + entry->second.committed_regions[address] = committed_region{size, nt_memory_permission{common, extended}}; } this->update_layout_version(); @@ -276,7 +284,7 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size, return true; } -bool memory_manager::commit_memory(const uint64_t address, const size_t size, const memory_permission permissions) +bool memory_manager::commit_memory(const uint64_t address, const size_t size, const nt_memory_permission permissions) { const auto entry = this->find_reserved_region(address); if (entry == this->reserved_regions_.end()) @@ -454,7 +462,7 @@ void memory_manager::unmap_all_memory() this->reserved_regions_.clear(); } -uint64_t memory_manager::allocate_memory(const size_t size, const memory_permission permissions, +uint64_t memory_manager::allocate_memory(const size_t size, const nt_memory_permission permissions, const bool reserve_only) { const auto allocation_base = this->find_free_allocation_base(size); @@ -500,8 +508,8 @@ region_info memory_manager::get_region_info(const uint64_t address) region_info result{}; result.start = MIN_ALLOCATION_ADDRESS; result.length = static_cast(MAX_ALLOCATION_ADDRESS - result.start); - result.permissions = memory_permission::none; - result.initial_permissions = memory_permission::none; + result.permissions = nt_memory_permission(); + result.initial_permissions = nt_memory_permission(); result.allocation_base = {}; result.allocation_length = result.length; result.is_committed = false; @@ -624,9 +632,13 @@ void memory_manager::map_mmio(const uint64_t address, const size_t size, mmio_re this->memory_->map_mmio(address, size, std::move(read_cb), std::move(write_cb)); } -void memory_manager::map_memory(const uint64_t address, const size_t size, const memory_permission permissions) +void memory_manager::map_memory(const uint64_t address, const size_t size, const nt_memory_permission permissions) { - this->memory_->map_memory(address, size, permissions); + auto perms = permissions.is_guarded() + ? nt_memory_permission(memory_permission::none) + : permissions; + + this->memory_->map_memory(address, size, perms); } void memory_manager::unmap_memory(const uint64_t address, const size_t size) @@ -635,7 +647,7 @@ void memory_manager::unmap_memory(const uint64_t address, const size_t size) } void memory_manager::apply_memory_protection(const uint64_t address, const size_t size, - const memory_permission permissions) + const nt_memory_permission permissions) { this->memory_->apply_memory_protection(address, size, permissions); } diff --git a/src/windows-emulator/memory_manager.hpp b/src/windows-emulator/memory_manager.hpp index 4b5f087e..a67d383f 100644 --- a/src/windows-emulator/memory_manager.hpp +++ b/src/windows-emulator/memory_manager.hpp @@ -18,7 +18,7 @@ struct region_info : basic_memory_region size_t allocation_length{}; bool is_reserved{}; bool is_committed{}; - memory_permission initial_permissions{}; + nt_memory_permission initial_permissions{}; }; using mmio_read_callback = std::function; @@ -35,7 +35,7 @@ class memory_manager : public memory_interface struct committed_region { size_t length{}; - memory_permission permissions{}; + nt_memory_permission permissions{}; }; using committed_region_map = std::map; @@ -54,20 +54,20 @@ class memory_manager : public memory_interface bool try_read_memory(uint64_t address, void* data, size_t size) const final; void write_memory(uint64_t address, const void* data, size_t size) final; - bool protect_memory(uint64_t address, size_t size, memory_permission permissions, - memory_permission* old_permissions = nullptr); + bool protect_memory(uint64_t address, size_t size, nt_memory_permission permissions, + nt_memory_permission* old_permissions = nullptr); bool allocate_mmio(uint64_t address, size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb); - bool allocate_memory(uint64_t address, size_t size, memory_permission permissions, bool reserve_only = false); + bool allocate_memory(uint64_t address, size_t size, nt_memory_permission permissions, bool reserve_only = false); - bool commit_memory(uint64_t address, size_t size, memory_permission permissions); + bool commit_memory(uint64_t address, size_t size, nt_memory_permission permissions); bool decommit_memory(uint64_t address, size_t size); bool release_memory(uint64_t address, size_t size); void unmap_all_memory(); - uint64_t allocate_memory(size_t size, memory_permission permissions, bool reserve_only = false); + uint64_t allocate_memory(size_t size, nt_memory_permission permissions, bool reserve_only = false); uint64_t find_free_allocation_base(size_t size, uint64_t start = 0) const; @@ -96,9 +96,9 @@ class memory_manager : public memory_interface std::atomic layout_version_{0}; void map_mmio(uint64_t address, size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb) final; - void map_memory(uint64_t address, size_t size, memory_permission permissions) final; + void map_memory(uint64_t address, size_t size, nt_memory_permission permissions) final; void unmap_memory(uint64_t address, size_t size) final; - void apply_memory_protection(uint64_t address, size_t size, memory_permission permissions) final; + void apply_memory_protection(uint64_t address, size_t size, nt_memory_permission permissions) final; void update_layout_version(); }; diff --git a/src/windows-emulator/syscalls/memory.cpp b/src/windows-emulator/syscalls/memory.cpp index efd5e2f2..0f08c057 100644 --- a/src/windows-emulator/syscalls/memory.cpp +++ b/src/windows-emulator/syscalls/memory.cpp @@ -148,7 +148,7 @@ namespace syscalls c.win_emu.callbacks.on_memory_protect(aligned_start, aligned_length, requested_protection); - memory_permission old_protection_value{}; + nt_memory_permission old_protection_value{}; try {