From fd1ac8a1cf3c05ccdbf8762e22e9b7f01bd2abd4 Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Wed, 2 Apr 2025 11:24:06 -0400 Subject: Fix user platform override between armv7 and thumb Only override the default platform based on the entry point architecture in cases where the user didn't explicitly set loader.platform --- view/macho/machoview.cpp | 14 +++++++++----- view/macho/machoview.h | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'view/macho') diff --git a/view/macho/machoview.cpp b/view/macho/machoview.cpp index 8a320545..4b932b5a 100644 --- a/view/macho/machoview.cpp +++ b/view/macho/machoview.cpp @@ -1093,6 +1093,7 @@ bool MachoView::Init() SetOriginalImageBase(initialImageBase); uint64_t preferredImageBase = initialImageBase; + bool platformSetByUser = false; if (settings) { if (settings->Contains("loader.imageBase")) @@ -1100,11 +1101,13 @@ bool MachoView::Init() if (settings->Contains("loader.platform")) { - Ref platform = Platform::GetByName(settings->Get("loader.platform", this)); + BNSettingsScope scope = SettingsAutoScope; + Ref platform = Platform::GetByName(settings->Get("loader.platform", this, &scope)); if (platform) { m_plat = platform; m_arch = platform->GetArchitecture(); + platformSetByUser = (scope == SettingsResourceScope); } } } @@ -1528,12 +1531,12 @@ bool MachoView::Init() Ref filesetEntryCommandType = Type::StructureType(filesetEntryCommandStruct); m_typeNames.filesetEntryCommandQualName = DefineType(filesetEntryCommandTypeId, filesetEntryCommandName, filesetEntryCommandType); - if (!InitializeHeader(m_header, true, preferredImageBase, preferredImageBaseDesc)) + if (!InitializeHeader(m_header, true, preferredImageBase, preferredImageBaseDesc, platformSetByUser)) return false; for (auto& it : m_subHeaders) { - if (!InitializeHeader(it.second, false, it.first, "")) + if (!InitializeHeader(it.second, false, it.first, "", platformSetByUser)) return false; } @@ -1544,7 +1547,8 @@ bool MachoView::Init() } -bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_t preferredImageBase, std::string preferredImageBaseDesc) +bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_t preferredImageBase, + std::string preferredImageBaseDesc, bool platformSetByUser) { Ref settings = GetLoadSettings(GetTypeName()); @@ -1814,7 +1818,7 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_ if (!platform) platform = m_arch->GetStandalonePlatform(); - if (header.m_entryPoints.size() > 0) + if (header.m_entryPoints.size() > 0 && !platformSetByUser) platform = platform->GetAssociatedPlatformByAddress(header.m_entryPoints[0]); SetDefaultPlatform(platform); diff --git a/view/macho/machoview.h b/view/macho/machoview.h index 11a17bff..787ae36b 100644 --- a/view/macho/machoview.h +++ b/view/macho/machoview.h @@ -1472,7 +1472,8 @@ namespace BinaryNinja std::vector m_allSections; MachOHeader HeaderForAddress(BinaryView* data, uint64_t address, bool isMainHeader, std::string identifierPrefix = ""); - bool InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_t preferredImageBase, std::string preferredImageBaseDesc); + bool InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_t preferredImageBase, + std::string preferredImageBaseDesc, bool platformSetByUser); void RebaseThreadStarts(BinaryReader& virtualReader, std::vector& threadStarts, uint64_t stepMultiplier); Ref DefineMachoSymbol( -- cgit v1.3.1