From 69598bf4de54956512b0cfa64d9451779a01d30f Mon Sep 17 00:00:00 2001 From: kat Date: Mon, 4 Nov 2024 10:20:37 -0500 Subject: [SharedCache] Add load option to disable automatic loading of libsystem_c --- view/sharedcache/core/DSCView.cpp | 8 ++++++++ view/sharedcache/core/SharedCache.cpp | 24 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) (limited to 'view/sharedcache') diff --git a/view/sharedcache/core/DSCView.cpp b/view/sharedcache/core/DSCView.cpp index 80456fc7..3eb40b7e 100644 --- a/view/sharedcache/core/DSCView.cpp +++ b/view/sharedcache/core/DSCView.cpp @@ -814,6 +814,14 @@ Ref DSCViewType::GetLoadSettingsForData(BinaryView* data) "description" : "Processes CoreFoundation strings, applying string values from encoded metadata" })"); + settings->RegisterSetting("loader.dsc.autoLoadLibSystem", + R"({ + "title" : "Auto-Load libSystem", + "type" : "boolean", + "default" : true, + "description" : "Whether to automatically load libsystem_c.dylib. This image contains frequently used noreturn symbols, and not loading it will result in frequently incorrect control flows." + })"); + settings->RegisterSetting("loader.dsc.processObjC", R"({ "title" : "Process Objective-C Metadata", diff --git a/view/sharedcache/core/SharedCache.cpp b/view/sharedcache/core/SharedCache.cpp index 40ccea6c..bc3b9321 100644 --- a/view/sharedcache/core/SharedCache.cpp +++ b/view/sharedcache/core/SharedCache.cpp @@ -1392,18 +1392,26 @@ SharedCache::SharedCache(BinaryNinja::Ref dscView) : m_ m_logger->LogError("Failed to perform initial load of Shared Cache"); } - for (const auto& [_, header] : m_headers) + auto settings = m_dscView->GetLoadSettings(VIEW_NAME); + bool autoLoadLibsystem = true; + if (settings && settings->Contains("loader.dsc.autoLoadLibSystem")) { - if (header.installName.find("libsystem_c.dylib") != std::string::npos) + autoLoadLibsystem = settings->Get("loader.dsc.autoLoadLibSystem", m_dscView); + } + if (autoLoadLibsystem) + { + for (const auto& [_, header] : m_headers) { - lock.unlock(); - m_logger->LogInfo("Loading core libsystem_c.dylib library"); - LoadImageWithInstallName(header.installName); - lock.lock(); - break ; + if (header.installName.find("libsystem_c.dylib") != std::string::npos) + { + lock.unlock(); + m_logger->LogInfo("Loading core libsystem_c.dylib library"); + LoadImageWithInstallName(header.installName); + lock.lock(); + break; + } } } - m_viewState = DSCViewStateLoaded; SaveToDSCView(); } -- cgit v1.3.1