summaryrefslogtreecommitdiff
path: root/view
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-04-02 11:24:06 -0400
committerBrandon Miller <brandon@vector35.com>2025-04-03 07:03:33 -0400
commitfd1ac8a1cf3c05ccdbf8762e22e9b7f01bd2abd4 (patch)
tree29e54b50b3e8a741f78e1f0d575473f0eb6ff8e0 /view
parent67e5ac0aa51db4fd52da786a6227c8bc649814e5 (diff)
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
Diffstat (limited to 'view')
-rw-r--r--view/elf/elfview.cpp8
-rw-r--r--view/macho/machoview.cpp14
-rw-r--r--view/macho/machoview.h3
-rw-r--r--view/pe/coffview.cpp15
-rw-r--r--view/pe/peview.cpp9
5 files changed, 31 insertions, 18 deletions
diff --git a/view/elf/elfview.cpp b/view/elf/elfview.cpp
index c87c9e05..6d19bc5f 100644
--- a/view/elf/elfview.cpp
+++ b/view/elf/elfview.cpp
@@ -469,6 +469,7 @@ bool ElfView::Init()
m_extractMangledTypes = viewSettings->Get<bool>("analysis.extractTypesFromMangledNames", this);
m_simplifyTemplates = viewSettings->Get<bool>("analysis.types.templateSimplifier", this);
+ bool platformSetByUser = false;
Ref<Settings> settings = GetLoadSettings(GetTypeName());
if (settings)
{
@@ -477,11 +478,13 @@ bool ElfView::Init()
if (settings->Contains("loader.platform"))
{
- Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
+ BNSettingsScope scope = SettingsAutoScope;
+ Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this, &scope));
if (platformOverride)
{
m_plat = platformOverride;
m_arch = m_plat->GetArchitecture();
+ platformSetByUser = (scope == SettingsResourceScope);
}
}
}
@@ -752,8 +755,9 @@ bool ElfView::Init()
GetParentView()->SetDefaultArchitecture(entryPointArch);
Ref<Platform> platform = m_plat ? m_plat : g_elfViewType->GetPlatform(m_ident.os, m_arch);
- if (platform && (entryPointArch != m_arch))
+ if (platform && (entryPointArch != m_arch) && !platformSetByUser)
platform = platform->GetRelatedPlatform(entryPointArch);
+
if (!platform)
platform = entryPointArch->GetStandalonePlatform();
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 = Platform::GetByName(settings->Get<string>("loader.platform", this));
+ BNSettingsScope scope = SettingsAutoScope;
+ Ref<Platform> platform = Platform::GetByName(settings->Get<string>("loader.platform", this, &scope));
if (platform)
{
m_plat = platform;
m_arch = platform->GetArchitecture();
+ platformSetByUser = (scope == SettingsResourceScope);
}
}
}
@@ -1528,12 +1531,12 @@ bool MachoView::Init()
Ref<Type> 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> 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<section_64> 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<uint32_t>& threadStarts, uint64_t stepMultiplier);
Ref<Symbol> DefineMachoSymbol(
diff --git a/view/pe/coffview.cpp b/view/pe/coffview.cpp
index 4296917a..54d72f92 100644
--- a/view/pe/coffview.cpp
+++ b/view/pe/coffview.cpp
@@ -197,6 +197,7 @@ bool COFFView::Init()
m_is64 = m_arch->GetAddressSize() == 8;
m_imageBase = 0; // 0 for COFF? opt.imageBase;
+ bool platformSetByUser = false;
settings = GetLoadSettings(GetTypeName());
if (settings)
{
@@ -205,16 +206,12 @@ bool COFFView::Init()
if (settings->Contains("loader.platform"))
{
- auto platformName = settings->Get<string>("loader.platform", this);
- platform = Platform::GetByName(platformName);
+ BNSettingsScope scope = SettingsAutoScope;
+ Ref<Platform> platform = Platform::GetByName(settings->Get<string>("loader.platform", this, &scope));
if (platform)
{
m_arch = platform->GetArchitecture();
- m_logger->LogDebug("COFF: loader.platform override (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platformName.c_str());
- }
- else
- {
- m_logger->LogError("COFF: Cannot find platform \"%s\" specified in loader.platform override", platformName.c_str());
+ platformSetByUser = (scope == SettingsResourceScope);
}
}
}
@@ -489,7 +486,9 @@ bool COFFView::Init()
m_logger->LogDebug("COFF: initial platform (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
}
- platform = platform->GetAssociatedPlatformByAddress(entryPointAddress);
+ if (!platformSetByUser)
+ platform = platform->GetAssociatedPlatformByAddress(entryPointAddress);
+
entryPointAddress = m_entryPoint;
m_logger->LogDebug("COFF: entry point %#" PRIx64 " associated platform (%#x, arch: %s): %s", entryPointAddress, header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
diff --git a/view/pe/peview.cpp b/view/pe/peview.cpp
index 77c52da8..96103155 100644
--- a/view/pe/peview.cpp
+++ b/view/pe/peview.cpp
@@ -597,6 +597,7 @@ bool PEView::Init()
m_extractMangledTypes = viewSettings->Get<bool>("analysis.extractTypesFromMangledNames", this);
m_simplifyTemplates = viewSettings->Get<bool>("analysis.types.templateSimplifier", this);
+ bool platformSetByUser = false;
settings = GetLoadSettings(GetTypeName());
if (settings)
{
@@ -605,11 +606,13 @@ bool PEView::Init()
if (settings->Contains("loader.platform"))
{
- Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
+ BNSettingsScope scope = SettingsAutoScope;
+ Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this, &scope));
if (platformOverride)
{
platform = platformOverride;
m_arch = platform->GetArchitecture();
+ platformSetByUser = (scope == SettingsResourceScope);
}
}
}
@@ -647,7 +650,9 @@ bool PEView::Init()
return false;
}
- platform = platform->GetAssociatedPlatformByAddress(m_entryPoint);
+ if (!platformSetByUser)
+ platform = platform->GetAssociatedPlatformByAddress(m_entryPoint);
+
SetDefaultPlatform(platform);
SetDefaultArchitecture(platform->GetArchitecture());