diff options
Diffstat (limited to 'view')
| -rw-r--r-- | view/elf/elfview.cpp | 8 | ||||
| -rw-r--r-- | view/macho/machoview.cpp | 14 | ||||
| -rw-r--r-- | view/macho/machoview.h | 3 | ||||
| -rw-r--r-- | view/pe/coffview.cpp | 15 | ||||
| -rw-r--r-- | view/pe/peview.cpp | 9 |
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()); |
