diff options
| author | kat <kat@vector35.com> | 2024-06-04 11:03:04 -0400 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2024-06-11 14:28:26 -0400 |
| commit | ffb69f582d9fce114c1c7ec5e0c1868c331a74c9 (patch) | |
| tree | 667550116c3cbba9dc2a45dc6c69c00e3d7e3d7a /view/macho/machoview.cpp | |
| parent | c5df1bf9d788344192b1a63690d8d5845b713f29 (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.cpp | 54 |
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"({ |
