From 6a0ad227744bc7035452af9f21147383a4bab123 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Thu, 9 Dec 2021 21:10:24 +0100 Subject: [PATCH] fix: Inconsistent provider address reading --- .../content/providers/file_provider.cpp | 17 ++++------ .../source/content/providers/gdb_provider.cpp | 14 +++----- .../builtin/source/content/views/view_gdb.cpp | 7 +++- .../source/content/views/view_hexeditor.cpp | 32 ++++++++++--------- .../source/content/views/view_information.cpp | 2 +- .../source/content/views/view_strings.cpp | 2 +- .../source/content/views/view_yara.cpp | 2 +- .../include/hex/providers/provider.hpp | 3 +- plugins/libimhex/source/helpers/magic.cpp | 4 +-- .../libimhex/source/providers/provider.cpp | 20 +++++------- 10 files changed, 47 insertions(+), 56 deletions(-) diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index d624afb57..b293c0a59 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -44,11 +44,10 @@ namespace hex::plugin::builtin::prv { void FileProvider::read(u64 offset, void *buffer, size_t size, bool overlays) { - - if ((offset - this->getBaseAddress()) > (this->getSize() - size) || buffer == nullptr || size == 0) + if ((offset - this->getBaseAddress()) > (this->getActualSize() - size) || buffer == nullptr || size == 0) return; - std::memcpy(buffer, reinterpret_cast(this->m_mappedFile) + PageSize * this->m_currPage + offset - this->getBaseAddress(), size); + this->readRaw(offset - this->getBaseAddress(), buffer, size); for (u64 i = 0; i < size; i++) if (getPatches().contains(offset + i)) @@ -59,25 +58,21 @@ namespace hex::plugin::builtin::prv { } void FileProvider::write(u64 offset, const void *buffer, size_t size) { - if (((offset - this->getBaseAddress()) + size) > this->getSize() || buffer == nullptr || size == 0) + if ((offset - this->getBaseAddress()) > (this->getActualSize() - size) || buffer == nullptr || size == 0) return; addPatch(offset, buffer, size); } void FileProvider::readRaw(u64 offset, void *buffer, size_t size) { - offset -= this->getBaseAddress(); - - if ((offset + size) > this->getSize() || buffer == nullptr || size == 0) + if ((offset + size) > this->getActualSize() || buffer == nullptr || size == 0) return; std::memcpy(buffer, reinterpret_cast(this->m_mappedFile) + PageSize * this->m_currPage + offset, size); } void FileProvider::writeRaw(u64 offset, const void *buffer, size_t size) { - offset -= this->getBaseAddress(); - - if ((offset + size) > this->getSize() || buffer == nullptr || size == 0) + if ((offset + size) > this->getActualSize() || buffer == nullptr || size == 0) return; std::memcpy(reinterpret_cast(this->m_mappedFile) + PageSize * this->m_currPage + offset, buffer, size); @@ -100,7 +95,7 @@ namespace hex::plugin::builtin::prv { if (bufferSize > provider->getActualSize() - offset) bufferSize = provider->getActualSize() - offset; - provider->readRelative(offset, buffer.data(), bufferSize); + provider->read(offset + this->getBaseAddress(), buffer.data(), bufferSize); file.write(buffer); } } diff --git a/plugins/builtin/source/content/providers/gdb_provider.cpp b/plugins/builtin/source/content/providers/gdb_provider.cpp index 7b0a80faf..e6d43e67b 100644 --- a/plugins/builtin/source/content/providers/gdb_provider.cpp +++ b/plugins/builtin/source/content/providers/gdb_provider.cpp @@ -130,9 +130,11 @@ namespace hex::plugin::builtin::prv { void GDBProvider::read(u64 offset, void *buffer, size_t size, bool overlays) { - if ((offset - this->getBaseAddress()) > (this->getSize() - size) || buffer == nullptr || size == 0) + if ((offset - this->getBaseAddress()) > (this->getActualSize() - size) || buffer == nullptr || size == 0) return; + offset -= this->getBaseAddress(); + u64 alignedOffset = offset - (offset & 0xFFF); { @@ -164,16 +166,11 @@ namespace hex::plugin::builtin::prv { } void GDBProvider::write(u64 offset, const void *buffer, size_t size) { - if (((offset - this->getBaseAddress()) + size) > this->getSize() || buffer == nullptr || size == 0) - return; - addPatch(offset, buffer, size); } void GDBProvider::readRaw(u64 offset, void *buffer, size_t size) { - offset -= this->getBaseAddress(); - - if ((offset + size) > this->getSize() || buffer == nullptr || size == 0) + if ((offset - this->getBaseAddress()) > (this->getActualSize() - size) || buffer == nullptr || size == 0) return; auto data = gdb::readMemory(this->m_socket, offset, size); @@ -181,10 +178,7 @@ namespace hex::plugin::builtin::prv { } void GDBProvider::writeRaw(u64 offset, const void *buffer, size_t size) { - offset -= this->getBaseAddress(); - if ((offset + size) > this->getSize() || buffer == nullptr || size == 0) - return; } void GDBProvider::save() { diff --git a/plugins/builtin/source/content/views/view_gdb.cpp b/plugins/builtin/source/content/views/view_gdb.cpp index 05c42cc72..c5c23b39c 100644 --- a/plugins/builtin/source/content/views/view_gdb.cpp +++ b/plugins/builtin/source/content/views/view_gdb.cpp @@ -13,7 +13,12 @@ namespace hex::plugin::builtin { if (ImGui::Begin(View::toWindowName("hex.builtin.view.gdb.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { ImGui::Header("hex.builtin.view.gdb.settings"_lang); ImGui::InputText("hex.builtin.view.gdb.ip"_lang, this->m_address.data(), this->m_address.capacity(), ImGuiInputTextFlags_CallbackEdit, ImGui::UpdateStringSizeCallback, &this->m_address); - ImGui::InputInt("hex.builtin.view.gdb.port"_lang, &this->m_port, 1, 0xFFFF); + ImGui::InputInt("hex.builtin.view.gdb.port"_lang, &this->m_port, 0, 0); + + if (this->m_port < 0) + this->m_port = 0; + else if (this->m_port > 0xFFFF) + this->m_port = 0xFFFF; ImGui::NewLine(); diff --git a/plugins/builtin/source/content/views/view_hexeditor.cpp b/plugins/builtin/source/content/views/view_hexeditor.cpp index 7e19c29b7..986c90644 100644 --- a/plugins/builtin/source/content/views/view_hexeditor.cpp +++ b/plugins/builtin/source/content/views/view_hexeditor.cpp @@ -41,7 +41,7 @@ namespace hex::plugin::builtin { return 0x00; ImU8 byte; - provider->readRelative(off, &byte, sizeof(ImU8)); + provider->read(off + provider->getBaseAddress() + provider->getCurrentPageAddress(), &byte, sizeof(ImU8)); return byte; }; @@ -51,7 +51,7 @@ namespace hex::plugin::builtin { if (!provider->isAvailable() || !provider->isWritable()) return; - provider->writeRelative(off, &d, sizeof(ImU8)); + provider->write(off + provider->getBaseAddress() + provider->getCurrentPageAddress(), &d, sizeof(ImU8)); EventManager::post(); ProjectFile::markDirty(); }; @@ -61,7 +61,9 @@ namespace hex::plugin::builtin { std::optional currColor, prevColor; - off += ImHexApi::Provider::get()->getBaseAddress(); + auto provider = ImHexApi::Provider::get(); + + off += provider->getBaseAddress() + provider->getCurrentPageAddress(); u32 alpha = static_cast(_this->m_highlightAlpha) << 24; @@ -125,7 +127,7 @@ namespace hex::plugin::builtin { size_t size = std::min(_this->m_currEncodingFile.getLongestSequence(), provider->getActualSize() - addr); std::vector buffer(size); - provider->readRelative(addr, buffer.data(), size); + provider->read(addr + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), size); auto [decoded, advance] = _this->m_currEncodingFile.getEncodingFor(buffer); @@ -153,8 +155,8 @@ namespace hex::plugin::builtin { if (region.size != 0) { provider->setCurrentPage(page.value()); - u64 start = region.address; - this->m_memoryEditor.GotoAddrAndSelect(start - provider->getBaseAddress(), start + region.size - provider->getBaseAddress() - 1); + u64 start = region.address - provider->getBaseAddress() - provider->getCurrentPageAddress(); + this->m_memoryEditor.GotoAddrAndSelect(start, start + region.size - 1); } EventManager::post(Region { this->m_memoryEditor.DataPreviewAddr, (this->m_memoryEditor.DataPreviewAddrEnd - this->m_memoryEditor.DataPreviewAddr) + 1}); @@ -284,7 +286,7 @@ namespace hex::plugin::builtin { size_t dataSize = (!ImHexApi::Provider::isValid() || !provider->isReadable()) ? 0x00 : provider->getSize(); - this->m_memoryEditor.DrawWindow(View::toWindowName("hex.builtin.view.hexeditor.name").c_str(), &this->getWindowOpenState(), this, dataSize, dataSize == 0 ? 0x00 : provider->getBaseAddress()); + this->m_memoryEditor.DrawWindow(View::toWindowName("hex.builtin.view.hexeditor.name").c_str(), &this->getWindowOpenState(), this, dataSize, dataSize == 0 ? 0x00 : provider->getBaseAddress() + provider->getCurrentPageAddress()); if (dataSize != 0x00) { if (ImGui::Begin(View::toWindowName("hex.builtin.view.hexeditor.name").c_str())) { @@ -758,7 +760,7 @@ namespace hex::plugin::builtin { size_t copySize = (end - start) + 1; std::vector buffer(copySize, 0x00); - provider->readRelative(start, buffer.data(), buffer.size()); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), buffer.size()); std::string str; for (const auto &byte : buffer) @@ -807,7 +809,7 @@ namespace hex::plugin::builtin { } // Write bytes - provider->writeRelative(start, buffer.data(), std::min(end - start + 1, buffer.size())); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), std::min(end - start + 1, buffer.size())); } void ViewHexEditor::copyString() const { @@ -820,7 +822,7 @@ namespace hex::plugin::builtin { std::string buffer(copySize, 0x00); buffer.reserve(copySize + 1); - provider->readRelative(start, buffer.data(), copySize); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), copySize); ImGui::SetClipboardText(buffer.c_str()); } @@ -834,7 +836,7 @@ namespace hex::plugin::builtin { size_t copySize = (end - start) + 1; std::vector buffer(copySize, 0x00); - provider->readRelative(start, buffer.data(), buffer.size()); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), buffer.size()); std::string str; switch (language) { @@ -936,7 +938,7 @@ namespace hex::plugin::builtin { size_t copySize = (end - start) + 1; std::vector buffer(copySize, 0x00); - provider->readRelative(start, buffer.data(), buffer.size()); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), buffer.size()); std::string str = "Hex View 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n\n"; @@ -983,7 +985,7 @@ namespace hex::plugin::builtin { size_t copySize = (end - start) + 1; std::vector buffer(copySize, 0x00); - provider->readRelative(start, buffer.data(), buffer.size()); + provider->read(start + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), buffer.size()); std::string str = R"( @@ -1048,7 +1050,7 @@ R"( size_t dataSize = provider->getSize(); for (u64 offset = 0; offset < dataSize; offset += 1024) { size_t usedBufferSize = std::min(u64(buffer.size()), dataSize - offset); - provider->readRelative(offset, buffer.data(), usedBufferSize); + provider->read(offset + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), usedBufferSize); for (u64 i = 0; i < usedBufferSize; i++) { if (buffer[i] == string[foundCharacters]) @@ -1086,7 +1088,7 @@ R"( size_t dataSize = provider->getSize(); for (u64 offset = 0; offset < dataSize; offset += 1024) { size_t usedBufferSize = std::min(u64(buffer.size()), dataSize - offset); - provider->readRelative(offset, buffer.data(), usedBufferSize); + provider->read(offset + provider->getBaseAddress() + provider->getCurrentPageAddress(), buffer.data(), usedBufferSize); for (u64 i = 0; i < usedBufferSize; i++) { if (buffer[i] == hex[foundCharacters]) diff --git a/plugins/builtin/source/content/views/view_information.cpp b/plugins/builtin/source/content/views/view_information.cpp index 79496b185..cc78766c1 100644 --- a/plugins/builtin/source/content/views/view_information.cpp +++ b/plugins/builtin/source/content/views/view_information.cpp @@ -87,7 +87,7 @@ namespace hex::plugin::builtin { for (u64 i = 0; i < provider->getSize(); i += this->m_blockSize) { std::array blockValueCounts = { 0 }; - provider->readRelative(i, buffer.data(), std::min(u64(this->m_blockSize), provider->getSize() - i)); + provider->read(i + provider->getBaseAddress(), buffer.data(), std::min(u64(this->m_blockSize), provider->getSize() - i)); for (size_t j = 0; j < this->m_blockSize; j++) { blockValueCounts[buffer[j]]++; diff --git a/plugins/builtin/source/content/views/view_strings.cpp b/plugins/builtin/source/content/views/view_strings.cpp index 945e9364c..e2d51b795 100644 --- a/plugins/builtin/source/content/views/view_strings.cpp +++ b/plugins/builtin/source/content/views/view_strings.cpp @@ -71,7 +71,7 @@ namespace hex::plugin::builtin { for (u64 offset = 0; offset < provider->getSize(); offset += buffer.size()) { size_t readSize = std::min(u64(buffer.size()), provider->getSize() - offset); - provider->readRelative(offset, buffer.data(), readSize); + provider->read(offset + provider->getBaseAddress(), buffer.data(), readSize); for (u32 i = 0; i < readSize; i++) { if (buffer[i] >= ' ' && buffer[i] <= '~' && offset < provider->getSize() - 1) diff --git a/plugins/builtin/source/content/views/view_yara.cpp b/plugins/builtin/source/content/views/view_yara.cpp index 42fb49b64..ee2943c32 100644 --- a/plugins/builtin/source/content/views/view_yara.cpp +++ b/plugins/builtin/source/content/views/view_yara.cpp @@ -207,7 +207,7 @@ namespace hex::plugin::builtin { if (context.buffer.empty()) return nullptr; - provider->readRelative(context.currBlock.base, context.buffer.data(), context.buffer.size()); + provider->read(context.currBlock.base + provider->getBaseAddress() + provider->getCurrentPageAddress(), context.buffer.data(), context.buffer.size()); return context.buffer.data(); }; diff --git a/plugins/libimhex/include/hex/providers/provider.hpp b/plugins/libimhex/include/hex/providers/provider.hpp index 1ca5f2acb..6051d9611 100644 --- a/plugins/libimhex/include/hex/providers/provider.hpp +++ b/plugins/libimhex/include/hex/providers/provider.hpp @@ -26,9 +26,7 @@ namespace hex::prv { virtual bool isSavable() const = 0; virtual void read(u64 offset, void *buffer, size_t size, bool overlays = true); - virtual void readRelative(u64 offset, void *buffer, size_t size, bool overlays = true); virtual void write(u64 offset, const void *buffer, size_t size); - virtual void writeRelative(u64 offset, const void *buffer, size_t size); virtual void resize(ssize_t newSize); @@ -55,6 +53,7 @@ namespace hex::prv { virtual void setBaseAddress(u64 address); virtual u64 getBaseAddress() const; + virtual u64 getCurrentPageAddress() const; virtual size_t getSize() const; virtual std::optional getPageOfAddress(u64 address) const; diff --git a/plugins/libimhex/source/helpers/magic.cpp b/plugins/libimhex/source/helpers/magic.cpp index 96563f007..c58290242 100644 --- a/plugins/libimhex/source/helpers/magic.cpp +++ b/plugins/libimhex/source/helpers/magic.cpp @@ -65,7 +65,7 @@ namespace hex::magic { std::string getDescription(prv::Provider *provider, size_t size) { std::vector buffer(std::min(provider->getSize(), size), 0x00); - provider->readRelative(0x00, buffer.data(), buffer.size()); + provider->read(provider->getBaseAddress(), buffer.data(), buffer.size()); return getDescription(buffer); } @@ -86,7 +86,7 @@ namespace hex::magic { std::string getMIMEType(prv::Provider *provider, size_t size) { std::vector buffer(std::min(provider->getSize(), size), 0x00); - provider->readRelative(0x00, buffer.data(), buffer.size()); + provider->read(provider->getBaseAddress(), buffer.data(), buffer.size()); return getMIMEType(buffer); } diff --git a/plugins/libimhex/source/providers/provider.cpp b/plugins/libimhex/source/providers/provider.cpp index b10ad138f..233228c82 100644 --- a/plugins/libimhex/source/providers/provider.cpp +++ b/plugins/libimhex/source/providers/provider.cpp @@ -20,19 +20,11 @@ namespace hex::prv { } void Provider::read(u64 offset, void *buffer, size_t size, bool overlays) { - this->readRaw(offset, buffer, size); - } - - void Provider::readRelative(u64 offset, void *buffer, size_t size, bool overlays) { - this->read(offset + this->getBaseAddress(), buffer, size); + this->readRaw(offset - this->getBaseAddress(), buffer, size); } void Provider::write(u64 offset, const void *buffer, size_t size) { - this->writeRaw(offset, buffer, size); - } - - void Provider::writeRelative(u64 offset, const void *buffer, size_t size) { - this->write(offset + this->getBaseAddress(), buffer, size); + this->writeRaw(offset - this->getBaseAddress(), buffer, size); } void Provider::save() { } @@ -63,7 +55,7 @@ namespace hex::prv { void Provider::applyPatches() { for (auto &[patchAddress, patch] : getPatches()) - this->writeRaw(patchAddress, &patch, 1); + this->writeRaw( - this->getBaseAddress(), &patch, 1); } @@ -100,7 +92,11 @@ namespace hex::prv { } u64 Provider::getBaseAddress() const { - return this->m_baseAddress + PageSize * this->m_currPage; + return this->m_baseAddress; + } + + u64 Provider::getCurrentPageAddress() const { + return PageSize * this->getCurrentPage(); } size_t Provider::getSize() const {