summaryrefslogtreecommitdiff
path: root/view/macho/machoview.cpp
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2024-06-04 11:03:04 -0400
committerkat <kat@vector35.com>2024-06-11 14:28:26 -0400
commitffb69f582d9fce114c1c7ec5e0c1868c331a74c9 (patch)
tree667550116c3cbba9dc2a45dc6c69c00e3d7e3d7a /view/macho/machoview.cpp
parentc5df1bf9d788344192b1a63690d8d5845b713f29 (diff)
[Mach-O] Move Objective-C Structural processing to Mach-O View and automatically enable the workflow when applicable.
Diffstat (limited to 'view/macho/machoview.cpp')
-rw-r--r--view/macho/machoview.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/view/macho/machoview.cpp b/view/macho/machoview.cpp
index 69b81df6..5d4712c8 100644
--- a/view/macho/machoview.cpp
+++ b/view/macho/machoview.cpp
@@ -1833,6 +1833,25 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_
Ref<Platform> platform = m_plat ? m_plat : g_machoViewType->GetPlatform(0, m_arch);
+ bool parseObjCStructs = true;
+ if (settings && settings->Contains("loader.macho.processObjectiveC"))
+ parseObjCStructs = settings->Get<bool>("loader.macho.processObjectiveC", this);
+ if (!ObjCProcessor::ViewHasObjCMetadata(this))
+ parseObjCStructs = false;
+ if (parseObjCStructs)
+ {
+ m_objcProcessor = new ObjCProcessor(this, m_backedByDatabase);
+
+ if (!settings) // Add our defaults
+ {
+ Ref<Settings> programSettings = Settings::Instance();
+ if (programSettings->Get<bool>("corePlugins.workflows.objc"))
+ {
+ programSettings->Set("workflows.enable", true, this);
+ programSettings->Set("workflows.functionWorkflow", "core.function.objectiveC", this);
+ }
+ }
+ }
// parse thread starts section if available
bool rebaseThreadStarts = false;
@@ -2267,6 +2286,19 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_
}
}
+ if (parseObjCStructs)
+ {
+ try {
+ m_objcProcessor->ProcessObjCData();
+ }
+ catch (std::exception& ex)
+ {
+ m_logger->LogError("Failed to process Objective-C Metadata. Binary may be malformed");
+ m_logger->LogError("Error: %s", ex.what());
+ }
+ delete m_objcProcessor;
+ }
+
return true;
}
@@ -3204,6 +3236,11 @@ void MachoView::ParseChainedFixups(MachOHeader& header, linkedit_data_command ch
reloc.address = GetStart() + (chainEntryAddress - m_universalImageOffset);
DefineRelocation(m_arch, reloc, entryOffset, reloc.address);
+
+ if (m_objcProcessor)
+ {
+ m_objcProcessor->AddRelocatedPointer(reloc.address, entryOffset);
+ }
}
chainEntryAddress += (nextEntryStrideCount * strideSize);
@@ -3415,6 +3452,23 @@ Ref<Settings> MachoViewType::GetLoadSettingsForData(BinaryView* data)
settings->UpdateProperty(override, "readOnly", false);
}
+ if (ObjCProcessor::ViewHasObjCMetadata(viewRef))
+ {
+ settings->RegisterSetting("loader.macho.processObjectiveC",
+ R"({
+ "title" : "Process Objective-C metadata",
+ "type" : "boolean",
+ "default" : true,
+ "description" : "Processes Objective-C structures, applying method names and types from encoded metadata"
+ })");
+ Ref<Settings> programSettings = Settings::Instance();
+ if (programSettings->Get<bool>("corePlugins.workflows.objc"))
+ {
+ programSettings->Set("workflows.enable", true, viewRef);
+ programSettings->Set("workflows.functionWorkflow", "core.function.objectiveC", viewRef);
+ }
+ }
+
// register additional settings
settings->RegisterSetting("loader.macho.processFunctionStarts",
R"({