summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/SharedCache.cpp
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2024-10-30 08:39:09 -0400
committerkat <kat@vector35.com>2024-11-05 09:03:12 -0500
commitf4a4b17b9e30cf603eb614e153d68226a3b24520 (patch)
treee33d18742c1a9e9b47af04df24bf88248c17f06a /view/sharedcache/core/SharedCache.cpp
parentfd8eb478a7a3bbc848da37bd33e62c2d8cf26b99 (diff)
[SharedCache] Implement LoadedImage API, Fix serialized image names, more robust system for out-of-date databases
Diffstat (limited to 'view/sharedcache/core/SharedCache.cpp')
-rw-r--r--view/sharedcache/core/SharedCache.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp
index 49aa3174..ec0db6e7 100644
--- a/view/sharedcache/core/SharedCache.cpp
+++ b/view/sharedcache/core/SharedCache.cpp
@@ -164,7 +164,14 @@ uint64_t readValidULEB128(DataBuffer& buffer, size_t& cursor)
uint64_t SharedCache::FastGetBackingCacheCount(BinaryNinja::Ref<BinaryNinja::BinaryView> dscView)
{
- auto baseFile = MMappedFileAccessor::Open(dscView->GetFile()->GetSessionId(), dscView->GetFile()->GetOriginalFilename())->lock();
+ std::shared_ptr<MMappedFileAccessor> baseFile;
+ try {
+ baseFile = MMappedFileAccessor::Open(dscView->GetFile()->GetSessionId(), dscView->GetFile()->GetOriginalFilename())->lock();
+ }
+ catch (...){
+ LogError("SharedCache preload: Failed to open file");
+ return 0;
+ }
dyld_cache_header header {};
size_t header_size = baseFile->ReadUInt32(16);
@@ -749,7 +756,7 @@ void SharedCache::PerformInitialLoad()
memcpy(segName, segment.segname, 16);
segName[16] = 0;
MemoryRegion sectionRegion;
- sectionRegion.prettyName = std::string(segName);
+ sectionRegion.prettyName = imageHeader.value().identifierPrefix + "::" + std::string(segName);
sectionRegion.start = segment.vmaddr;
sectionRegion.size = segment.vmsize;
uint32_t flags = 0;
@@ -983,14 +990,21 @@ void SharedCache::DeserializeFromRawView()
m_baseFilePath = c.m_baseFilePath;
m_exportInfos = c.m_exportInfos;
m_symbolInfos = c.m_symbolInfos;
+ m_metadataValid = true;
}
else
{
LoadFromString(m_dscView->GetStringMetadata(SharedCacheMetadataTag));
}
+ if (!m_metadataValid)
+ {
+ m_logger->LogError("Failed to deserialize Shared Cache metadata");
+ m_viewState = DSCViewStateUnloaded;
+ }
}
else
{
+ m_metadataValid = true;
m_viewState = DSCViewStateUnloaded;
m_images.clear(); // fixme ??
}
@@ -1343,6 +1357,8 @@ SharedCache::SharedCache(BinaryNinja::Ref<BinaryNinja::BinaryView> dscView) : m_
INIT_SHAREDCACHE_API_OBJECT()
m_logger = LogRegistry::GetLogger("SharedCache", dscView->GetFile()->GetSessionId());
DeserializeFromRawView();
+ if (!m_metadataValid)
+ return;
if (m_viewState == DSCViewStateUnloaded)
{
if (m_viewState == DSCViewStateUnloaded)
@@ -2935,6 +2951,8 @@ bool SharedCache::SaveToDSCView()
c.m_symbolInfos = m_symbolInfos;
viewStateCache[m_dscView->GetFile()->GetSessionId()] = c;
+ m_metadataValid = true;
+
return true;
}
return false;