summaryrefslogtreecommitdiff
path: root/view
diff options
context:
space:
mode:
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());