diff options
| author | Mark Rowe <mark@vector35.com> | 2026-03-24 13:46:57 -0700 |
|---|---|---|
| committer | Mark Rowe <mark@vector35.com> | 2026-03-30 13:22:34 -0700 |
| commit | 0a356578e65cf54c5b654b59a509c2ebe29ab54b (patch) | |
| tree | 36ddeae516b824e77e3369599ba796d9eef7f7a9 /view | |
| parent | ddd7aa4e7cd5a1aa07a16c3895d1f91ebf49347b (diff) | |
[DSC] Process Objective-C metadata when loading view from .bndb
The processed Objective-C metadata is not saved to the .bdnb. It must be
recomputed when the view is loaded.
Fixes https://github.com/Vector35/binaryninja-api/issues/8030.
Diffstat (limited to 'view')
| -rw-r--r-- | view/sharedcache/core/SharedCacheController.cpp | 24 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCacheController.h | 3 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCacheView.cpp | 8 | ||||
| -rw-r--r-- | view/sharedcache/core/SharedCacheView.h | 1 |
4 files changed, 36 insertions, 0 deletions
diff --git a/view/sharedcache/core/SharedCacheController.cpp b/view/sharedcache/core/SharedCacheController.cpp index 8886748f..8ed011bd 100644 --- a/view/sharedcache/core/SharedCacheController.cpp +++ b/view/sharedcache/core/SharedCacheController.cpp @@ -292,3 +292,27 @@ void SharedCacheController::LoadMetadata(const Metadata& metadata) m_loadedImages.insert(region); } } + + +void SharedCacheController::ProcessObjCForLoadedImages(BinaryView& view) +{ + if (!m_processObjC || m_loadedImages.empty()) + return; + + for (const auto& headerAddress : m_loadedImages) + { + auto image = m_cache.GetImageAt(headerAddress); + if (!image) + continue; + + auto objcProcessor = DSCObjC::SharedCacheObjCProcessor(&view, image->headerAddress); + try + { + objcProcessor.ProcessObjCData(); + } + catch (std::exception& e) + { + m_logger->LogErrorForExceptionF(e, "Failed to restore ObjC metadata for image at {:#x}: {}", headerAddress, e.what()); + } + } +} diff --git a/view/sharedcache/core/SharedCacheController.h b/view/sharedcache/core/SharedCacheController.h index ff859321..c468bee5 100644 --- a/view/sharedcache/core/SharedCacheController.h +++ b/view/sharedcache/core/SharedCacheController.h @@ -63,5 +63,8 @@ namespace BinaryNinja::DSC { Ref<Metadata> GetMetadata() const; void LoadMetadata(const Metadata& metadata); + + // Re-run the ObjC processor for loaded images to restore Objective-C metadata. + void ProcessObjCForLoadedImages(BinaryView& view); }; } // namespace BinaryNinja::DSC diff --git a/view/sharedcache/core/SharedCacheView.cpp b/view/sharedcache/core/SharedCacheView.cpp index 746bd7eb..2f2ec9f2 100644 --- a/view/sharedcache/core/SharedCacheView.cpp +++ b/view/sharedcache/core/SharedCacheView.cpp @@ -981,6 +981,14 @@ bool SharedCacheView::InitController() return true; } + +void SharedCacheView::OnAfterSnapshotDataApplied() +{ + if (auto controller = SharedCacheController::FromView(*this)) + controller->ProcessObjCForLoadedImages(*this); +} + + void SharedCacheView::SetPrimaryFileName(std::string primaryFileName) { m_primaryFileName = std::move(primaryFileName); diff --git a/view/sharedcache/core/SharedCacheView.h b/view/sharedcache/core/SharedCacheView.h index 5f916b30..ce592519 100644 --- a/view/sharedcache/core/SharedCacheView.h +++ b/view/sharedcache/core/SharedCacheView.h @@ -25,6 +25,7 @@ public: ~SharedCacheView() override = default; bool Init() override; + void OnAfterSnapshotDataApplied() override; // Initialized the shared cache controller for this view. This is what allows us to load images and regions. bool InitController(); |
