From 8267ab475cb2ac82fd3724c009f21e8e30143f6b Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Mon, 28 Apr 2025 18:28:26 -0400 Subject: [SharedCache] Improve support for older shared cache versions Fixed branch island regions being skipped --- view/sharedcache/core/VirtualMemory.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'view/sharedcache/core/VirtualMemory.cpp') diff --git a/view/sharedcache/core/VirtualMemory.cpp b/view/sharedcache/core/VirtualMemory.cpp index 60ed1481..71dafd0c 100644 --- a/view/sharedcache/core/VirtualMemory.cpp +++ b/view/sharedcache/core/VirtualMemory.cpp @@ -46,7 +46,7 @@ bool VirtualMemory::IsAddressMapped(uint64_t address) return m_regions.find(address) != m_regions.end(); } -void VirtualMemory::WritePointer(size_t address, size_t pointer) +void VirtualMemory::WritePointer(uint64_t address, size_t pointer) { uint64_t offset; auto region = GetRegionAtAddress(address, offset); @@ -55,6 +55,21 @@ void VirtualMemory::WritePointer(size_t address, size_t pointer) region->fileAccessor.lock()->WritePointer(offset, pointer); } +uint64_t VirtualMemory::ReadPointer(uint64_t address) +{ + switch (m_addressSize) + { + case 8: + return ReadUInt64(address); + case 4: + return ReadUInt32(address); + case 2: + return ReadUInt16(address); + default: + throw std::runtime_error("Unsupported address size"); + } +} + std::string VirtualMemory::ReadCString(uint64_t address) { uint64_t offset; @@ -145,7 +160,7 @@ BinaryNinja::DataBuffer VirtualMemory::ReadBuffer(uint64_t address, size_t lengt return region->fileAccessor.lock()->ReadBuffer(offset, length); } -std::pair VirtualMemory::ReadSpan(size_t address, size_t length) +std::pair VirtualMemory::ReadSpan(uint64_t address, size_t length) { uint64_t offset; auto region = GetRegionAtAddress(address, offset); @@ -177,7 +192,7 @@ std::string VirtualMemoryReader::ReadCString(uint64_t address, size_t maxLength) if (!region.has_value()) throw UnmappedRegionException(address); // TODO: Advance cursor? - return region->fileAccessor.lock()->ReadNullTermString(offset); + return region->fileAccessor.lock()->ReadNullTermString(offset, maxLength); } uint64_t VirtualMemoryReader::ReadULEB128(size_t cursorLimit) @@ -250,12 +265,8 @@ uint64_t VirtualMemoryReader::ReadPointer() uint64_t VirtualMemoryReader::ReadPointer(uint64_t address) { - if (m_addressSize == 8) - return ReadUInt64(address); - if (m_addressSize == 4) - return ReadUInt32(address); - // TODO: Throw here or assert. - return 0; + m_cursor = m_memory->GetAddressSize(); + return m_memory->ReadPointer(address); } uint8_t VirtualMemoryReader::ReadUInt8() -- cgit v1.3.1