diff options
| author | Brandon Miller <brandon@vector35.com> | 2024-05-15 09:44:37 -0400 |
|---|---|---|
| committer | Brandon Miller <bkmiller89@icloud.com> | 2024-05-16 10:16:13 -0400 |
| commit | 5088febc53fb9f0d6496a410baf8b393befb845d (patch) | |
| tree | f52f79228537f1eb5c3a57d1a504f003c22141f0 /view/pe | |
| parent | 63a4614b916731fa9cc0eebef9376f692cbdc0d3 (diff) | |
Removed loader.architecture override from views
Architecture is derived from platform object and can be overriden
using loader.platform
Diffstat (limited to 'view/pe')
| -rw-r--r-- | view/pe/coffview.cpp | 48 | ||||
| -rw-r--r-- | view/pe/peview.cpp | 28 | ||||
| -rw-r--r-- | view/pe/teview.cpp | 60 | ||||
| -rw-r--r-- | view/pe/teview.h | 1 |
4 files changed, 58 insertions, 79 deletions
diff --git a/view/pe/coffview.cpp b/view/pe/coffview.cpp index 8422a07b..f7d02fa8 100644 --- a/view/pe/coffview.cpp +++ b/view/pe/coffview.cpp @@ -196,13 +196,25 @@ bool COFFView::Init() m_imageBase = 0; // 0 for COFF? opt.imageBase; settings = GetLoadSettings(GetTypeName()); - if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides + if (settings) { - m_imageBase = settings->Get<uint64_t>("loader.imageBase", this); + if (settings->Contains("loader.imageBase")) + m_imageBase = settings->Get<uint64_t>("loader.imageBase", this); - Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this)); - if (!m_arch || (arch && (arch->GetName() != m_arch->GetName()))) - m_arch = arch; + if (settings->Contains("loader.platform")) + { + auto platformName = settings->Get<string>("loader.platform", this); + platform = Platform::GetByName(platformName); + if (platform) + { + m_arch = platform->GetArchitecture(); + LogDebug("COFF: loader.platform override (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platformName.c_str()); + } + else + { + LogError("COFF: Cannot find platform \"%s\" specified in loader.platform override", platformName.c_str()); + } + } } Ref<Settings> viewSettings = Settings::Instance(); @@ -448,30 +460,16 @@ bool COFFView::Init() SetDefaultArchitecture(entryPointArch); GetParentView()->SetDefaultArchitecture(entryPointArch); - platform = g_coffViewType->GetPlatform(IMAGE_SUBSYSTEM_UNKNOWN, m_arch); - LogDebug("COFF: initial platform (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str()); - if (!platform) - platform = m_arch->GetStandalonePlatform(); + { + platform = g_coffViewType->GetPlatform(IMAGE_SUBSYSTEM_UNKNOWN, m_arch); + LogDebug("COFF: initial platform (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str()); + } + platform = platform->GetAssociatedPlatformByAddress(entryPointAddress); entryPointAddress = m_entryPoint; LogDebug("COFF: entry point %#" PRIx64 " associated platform (%#x, arch: %s): %s", entryPointAddress, header.machine, m_arch->GetName().c_str(), platform->GetName().c_str()); - if (settings && settings->Contains("loader.platform")) // handle overrides - { - auto platformOverrideName = settings->Get<string>("loader.platform", this); - Ref<Platform> platformOverride = Platform::GetByName(platformOverrideName); - if (platformOverride) - { - platform = platformOverride; - LogDebug("COFF: loader.platform override (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str()); - } - else - { - LogError("COFF: Cannot find platform \"%s\" specified in loader.platform override", platformOverrideName.c_str()); - } - } - SetDefaultPlatform(platform); SetDefaultArchitecture(platform->GetArchitecture()); LogDebug("COFF: final entry point %#" PRIx64 " default (%#x, arch: %s): %s", entryPointAddress, header.machine, platform->GetName().c_str(), GetDefaultPlatform()->GetName().c_str()); @@ -1647,7 +1645,7 @@ Ref<Settings> COFFViewType::GetLoadSettingsForData(BinaryView* data) Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef); // specify default load settings that can be overridden - vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"}; + vector<string> overrides = {"loader.imageBase", "loader.platform"}; if (!viewRef->IsRelocatable()) settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable."); diff --git a/view/pe/peview.cpp b/view/pe/peview.cpp index a81399b6..89740413 100644 --- a/view/pe/peview.cpp +++ b/view/pe/peview.cpp @@ -598,13 +598,20 @@ bool PEView::Init() m_simplifyTemplates = viewSettings->Get<bool>("analysis.types.templateSimplifier", this); settings = GetLoadSettings(GetTypeName()); - if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides + if (settings) { - m_imageBase = settings->Get<uint64_t>("loader.imageBase", this); + if (settings->Contains("loader.imageBase")) + m_imageBase = settings->Get<uint64_t>("loader.imageBase", this); - Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this)); - if (!m_arch || (arch && (arch->GetName() != m_arch->GetName()))) - m_arch = arch; + if (settings->Contains("loader.platform")) + { + Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this)); + if (platformOverride) + { + platform = platformOverride; + m_arch = platform->GetArchitecture(); + } + } } // Apply architecture and platform @@ -636,16 +643,7 @@ bool PEView::Init() return false; } - platform = platform->GetAssociatedPlatformByAddress(m_entryPoint); - - if (settings && settings->Contains("loader.platform")) // handle overrides - { - Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this)); - if (platformOverride) - platform = platformOverride; - } - SetDefaultPlatform(platform); SetDefaultArchitecture(platform->GetArchitecture()); @@ -3086,7 +3084,7 @@ Ref<Settings> PEViewType::GetLoadSettingsForData(BinaryView* data) Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef); // specify default load settings that can be overridden - vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"}; + vector<string> overrides = {"loader.imageBase", "loader.platform"}; if (!viewRef->IsRelocatable()) settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable."); diff --git a/view/pe/teview.cpp b/view/pe/teview.cpp index 17d7a9ee..8355327a 100644 --- a/view/pe/teview.cpp +++ b/view/pe/teview.cpp @@ -202,19 +202,6 @@ TEView::TEView(BinaryView* bv, bool parseOnly) : BinaryView("TE", bv->GetFile(), m_backedByDatabase = bv->GetFile()->IsBackedByDatabase("TE"); } -void TEView::HandleUserOverrides() -{ - auto settings = GetLoadSettings(GetTypeName()); - if (!settings) - return; - - if (settings->Contains("loader.imageBase")) - m_imageBase = settings->Get<uint64_t>("loader.imageBase", this); - - if (settings->Contains("loader.architecture")) - m_arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this)); -} - bool TEView::Init() { BinaryReader reader(GetParentView(), LittleEndian); @@ -227,27 +214,26 @@ bool TEView::Init() ReadTEImageHeader(reader, header); ReadTEImageSectionHeaders(reader, header.numberOfSections); m_headersOffset = header.strippedSize - EFI_TE_IMAGE_HEADER_SIZE; + m_imageBase = header.imageBase; // Set architecture and platform - HandleUserOverrides(); - if (m_arch) + auto settings = GetLoadSettings(GetTypeName()); + if (settings) { - auto archName = m_arch->GetName(); - if (archName == "x86") - platform = Platform::GetByName("efi-x86"); - if (archName == "x86_64") - platform = Platform::GetByName("efi-x86_64"); - if (archName == "aarch64") - platform = Platform::GetByName("efi-aarch64"); - if (!platform) + if (settings->Contains("loader.imageBase")) { - m_logger->LogError("TE architecture '%s' is not supported", archName.c_str()); - return false; + uint64_t baseOverride = settings->Get<uint64_t>("loader.imageBase", this); + // TE image bases represent the base of the original PE (before headers are stripped) - make this + // adjustment for the user + m_imageBase = baseOverride - m_headersOffset; } + + if (settings->Contains("loader.platform")) + platform = Platform::GetByName(settings->Get<string>("loader.platform", this)); } - else + + if (!platform) { - m_imageBase = header.imageBase; switch (header.machine) { case IMAGE_FILE_MACHINE_I386: @@ -259,21 +245,19 @@ bool TEView::Init() case IMAGE_FILE_MACHINE_ARM64: platform = Platform::GetByName("efi-aarch64"); break; + case IMAGE_FILE_MACHINE_ARM: + platform = Platform::GetByName("efi-armv7"); + break; + case IMAGE_FILE_MACHINE_THUMB: + platform = Platform::GetByName("efi-thumb2"); + break; default: - LogError("TE architecture '0x%x' is not supported", header.machine); + LogError("TE platform '0x%x' is not supported", header.machine); return false; } - - if (!platform) - { - // Should never occur as long as the platforms exist - m_logger->LogError("Failed to set platform for TE file"); - return false; - } - - m_arch = platform->GetArchitecture(); } + m_arch = platform->GetArchitecture(); SetDefaultPlatform(platform); SetDefaultArchitecture(m_arch); @@ -382,7 +366,7 @@ Ref<Settings> TEViewType::GetLoadSettingsForData(BinaryView *bv) // specify default load settings that can be overridden Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef); - vector<string> overrides = {"loader.architecture", "loader.imageBase"}; + vector<string> overrides = {"loader.platform", "loader.imageBase"}; for (const auto& override : overrides) { if (settings->Contains(override)) diff --git a/view/pe/teview.h b/view/pe/teview.h index dd0060f8..22177751 100644 --- a/view/pe/teview.h +++ b/view/pe/teview.h @@ -77,7 +77,6 @@ namespace BinaryNinja private: void ReadTEImageHeader(BinaryReader& reader, struct TEImageHeader& imageHeader); void ReadTEImageSectionHeaders(BinaryReader& reader, uint32_t numSections); - void HandleUserOverrides(); void CreateSections(); void AssignHeaderTypes(); }; |
