summaryrefslogtreecommitdiff
path: root/view/macho/machoview.cpp
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2024-06-16 10:36:16 -0400
committerkat <kat@vector35.com>2024-06-17 11:46:17 -0400
commita29b3227ded18cf7f8e0e31968d410eeb99dd8e3 (patch)
treef2de930943f84e84ed7c11456bdca51b0d7519ae /view/macho/machoview.cpp
parent1daa4f494a3915c01a4b9cd915ff7682c10cbe31 (diff)
[Objective-C] Parse CFStrings seperately from main Objective-C Processing.
Diffstat (limited to 'view/macho/machoview.cpp')
-rw-r--r--view/macho/machoview.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/view/macho/machoview.cpp b/view/macho/machoview.cpp
index ac3ab884..17165aa0 100644
--- a/view/macho/machoview.cpp
+++ b/view/macho/machoview.cpp
@@ -1834,13 +1834,21 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_
Ref<Platform> platform = m_plat ? m_plat : g_machoViewType->GetPlatform(0, m_arch);
bool parseObjCStructs = true;
+ bool parseCFStrings = true;
if (settings && settings->Contains("loader.macho.processObjectiveC"))
parseObjCStructs = settings->Get<bool>("loader.macho.processObjectiveC", this);
+ if (settings && settings->Contains("loader.macho.processCFStrings"))
+ parseCFStrings = settings->Get<bool>("loader.macho.processCFStrings", this);
if (!ObjCProcessor::ViewHasObjCMetadata(this))
parseObjCStructs = false;
- if (parseObjCStructs)
+ if (!GetSectionByName("__cfstring"))
+ parseCFStrings = false;
+ if (parseObjCStructs || parseCFStrings)
{
m_objcProcessor = new ObjCProcessor(this, m_backedByDatabase);
+ }
+ if (parseObjCStructs)
+ {
if (!settings) // Add our defaults
{
@@ -2297,6 +2305,18 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_
}
}
+ if (parseCFStrings)
+ {
+ try {
+ m_objcProcessor->ProcessCFStrings();
+ }
+ catch (std::exception& ex)
+ {
+ m_logger->LogError("Failed to process CFStrings. Binary may be malformed");
+ m_logger->LogError("Error: %s", ex.what());
+ }
+ }
+
if (parseObjCStructs)
{
try {
@@ -3632,6 +3652,16 @@ Ref<Settings> MachoViewType::GetLoadSettingsForData(BinaryView* data)
programSettings->Set("workflows.functionWorkflow", "core.function.objectiveC", viewRef);
}
}
+ if (viewRef->GetSectionByName("__cfstring"))
+ {
+ settings->RegisterSetting("loader.macho.processCFStrings",
+ R"({
+ "title" : "Process CFString Metadata",
+ "type" : "boolean",
+ "default" : true,
+ "description" : "Processes CoreFoundation strings, applying string values from encoded metadata"
+ })");
+ }
// register additional settings
settings->RegisterSetting("loader.macho.processFunctionStarts",