Skip to content

Commit 5088feb

Browse files
committed
Removed loader.architecture override from views
Architecture is derived from platform object and can be overriden using loader.platform
1 parent 63a4614 commit 5088feb

File tree

7 files changed

+96
-128
lines changed

7 files changed

+96
-128
lines changed

view/elf/elfview.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -459,13 +459,20 @@ bool ElfView::Init()
459459
m_simplifyTemplates = viewSettings->Get<bool>("analysis.types.templateSimplifier", this);
460460

461461
Ref<Settings> settings = GetLoadSettings(GetTypeName());
462-
if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides
462+
if (settings)
463463
{
464-
preferredImageBase = settings->Get<uint64_t>("loader.imageBase", this);
464+
if (settings->Contains("loader.imageBase"))
465+
preferredImageBase = settings->Get<uint64_t>("loader.imageBase", this);
465466

466-
Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
467-
if (!m_arch || (arch && (arch->GetName() != m_arch->GetName())))
468-
m_arch = arch;
467+
if (settings->Contains("loader.platform"))
468+
{
469+
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
470+
if (platformOverride)
471+
{
472+
m_plat = platformOverride;
473+
m_arch = m_plat->GetArchitecture();
474+
}
475+
}
469476
}
470477

471478
int64_t imageBaseAdjustment = 0;
@@ -733,13 +740,6 @@ bool ElfView::Init()
733740
if (!platform)
734741
platform = entryPointArch->GetStandalonePlatform();
735742

736-
if (settings && settings->Contains("loader.platform")) // handle overrides
737-
{
738-
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
739-
if (platformOverride)
740-
platform = platformOverride;
741-
}
742-
743743
SetDefaultPlatform(platform);
744744
GetParentView()->SetDefaultPlatform(platform);
745745

@@ -2783,7 +2783,7 @@ Ref<Settings> ElfViewType::GetLoadSettingsForData(BinaryView* data)
27832783
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
27842784

27852785
// specify default load settings that can be overridden
2786-
vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"};
2786+
vector<string> overrides = {"loader.imageBase", "loader.platform"};
27872787
if (!viewRef->IsRelocatable())
27882788
settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable.");
27892789

view/macho/machoview.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,13 +1099,20 @@ bool MachoView::Init()
10991099

11001100
SetOriginalBase(initialImageBase);
11011101
uint64_t preferredImageBase = initialImageBase;
1102-
if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides
1102+
if (settings)
11031103
{
1104-
preferredImageBase = settings->Get<uint64_t>("loader.imageBase", this);
1104+
if (settings->Contains("loader.imageBase"))
1105+
preferredImageBase = settings->Get<uint64_t>("loader.imageBase", this);
11051106

1106-
Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
1107-
if (!m_arch || (arch && (arch->GetName() != m_arch->GetName())))
1108-
m_arch = arch;
1107+
if (settings->Contains("loader.platform"))
1108+
{
1109+
Ref<Platform> platform = Platform::GetByName(settings->Get<string>("loader.platform", this));
1110+
if (platform)
1111+
{
1112+
m_plat = platform;
1113+
m_arch = platform->GetArchitecture();
1114+
}
1115+
}
11091116
}
11101117

11111118
m_imageBaseAdjustment = 0;
@@ -1807,13 +1814,6 @@ bool MachoView::InitializeHeader(MachOHeader& header, bool isMainHeader, uint64_
18071814
if (header.m_entryPoints.size() > 0)
18081815
platform = platform->GetAssociatedPlatformByAddress(header.m_entryPoints[0]);
18091816

1810-
if (settings && settings->Contains("loader.platform")) // handle overrides
1811-
{
1812-
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
1813-
if (platformOverride)
1814-
platform = platformOverride;
1815-
}
1816-
18171817
SetDefaultPlatform(platform);
18181818
SetDefaultArchitecture(platform->GetArchitecture());
18191819

@@ -3345,7 +3345,7 @@ Ref<Settings> MachoViewType::GetLoadSettingsForData(BinaryView* data)
33453345
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
33463346

33473347
// specify default load settings that can be overridden
3348-
vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"};
3348+
vector<string> overrides = {"loader.imageBase", "loader.platform"};
33493349
if (!viewRef->IsRelocatable())
33503350
settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable.");
33513351

view/md1rom/md1rom.cpp

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -125,40 +125,29 @@ bool Md1romView::Init()
125125
AddAutoSection(m_mainRom.name, mainRomBase + m_mainRom.addr, m_mainRom.length, ReadOnlyCodeSectionSemantics);
126126
m_entryPoint = mainRomBase + m_mainRom.addr;
127127

128-
if (settings && settings->Contains("loader.architecture"))
129-
{
130-
auto arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
131-
if (!m_arch || (arch && (arch->GetName() != m_arch->GetName())))
132-
m_arch = arch;
133-
}
134-
else
135-
{
136-
m_arch = Architecture::GetByName("nanomips");
137-
}
138-
139-
if (m_arch)
140-
{
141-
SetDefaultArchitecture(m_arch);
142-
}
143-
else
144-
{
145-
LogWarn("nanoMIPS architecture not found. Code cannot be disassembled. If you are interested in purchasing "
146-
"the nanoMIPS architecture plugin, please contact us via https://binary.ninja/support/");
147-
}
148-
149128
if (settings && settings->Contains("loader.platform")) // handle overrides
150129
{
151130
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
152131
if (platformOverride)
132+
{
153133
m_plat = platformOverride;
134+
m_arch = m_plat->GetArchitecture();
135+
}
154136
}
155137
else
156138
{
157139
m_plat = Platform::GetByName("nanomips");
140+
m_arch = Architecture::GetByName("nanomips");
141+
if (!m_arch)
142+
{
143+
LogWarn("nanoMIPS architecture not found. Code cannot be disassembled. If you are interested in purchasing "
144+
"the nanoMIPS architecture plugin, please contact us via https://binary.ninja/support/");
145+
}
158146
}
159147

160-
if (m_plat)
148+
if (m_arch && m_plat)
161149
{
150+
SetDefaultArchitecture(m_arch);
162151
SetDefaultPlatform(m_plat);
163152
}
164153
}
@@ -441,7 +430,7 @@ Ref<Settings> Md1romViewType::GetLoadSettingsForData(BinaryNinja::BinaryView* da
441430
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
442431

443432
// specify default load settings that can be overridden
444-
vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"};
433+
vector<string> overrides = {"loader.imageBase", "loader.platform"};
445434
for (const auto& override : overrides)
446435
{
447436
if (settings->Contains(override))

view/pe/coffview.cpp

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -196,13 +196,25 @@ bool COFFView::Init()
196196

197197
m_imageBase = 0; // 0 for COFF? opt.imageBase;
198198
settings = GetLoadSettings(GetTypeName());
199-
if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides
199+
if (settings)
200200
{
201-
m_imageBase = settings->Get<uint64_t>("loader.imageBase", this);
201+
if (settings->Contains("loader.imageBase"))
202+
m_imageBase = settings->Get<uint64_t>("loader.imageBase", this);
202203

203-
Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
204-
if (!m_arch || (arch && (arch->GetName() != m_arch->GetName())))
205-
m_arch = arch;
204+
if (settings->Contains("loader.platform"))
205+
{
206+
auto platformName = settings->Get<string>("loader.platform", this);
207+
platform = Platform::GetByName(platformName);
208+
if (platform)
209+
{
210+
m_arch = platform->GetArchitecture();
211+
LogDebug("COFF: loader.platform override (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platformName.c_str());
212+
}
213+
else
214+
{
215+
LogError("COFF: Cannot find platform \"%s\" specified in loader.platform override", platformName.c_str());
216+
}
217+
}
206218
}
207219

208220
Ref<Settings> viewSettings = Settings::Instance();
@@ -448,30 +460,16 @@ bool COFFView::Init()
448460
SetDefaultArchitecture(entryPointArch);
449461
GetParentView()->SetDefaultArchitecture(entryPointArch);
450462

451-
platform = g_coffViewType->GetPlatform(IMAGE_SUBSYSTEM_UNKNOWN, m_arch);
452-
LogDebug("COFF: initial platform (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
453-
454463
if (!platform)
455-
platform = m_arch->GetStandalonePlatform();
464+
{
465+
platform = g_coffViewType->GetPlatform(IMAGE_SUBSYSTEM_UNKNOWN, m_arch);
466+
LogDebug("COFF: initial platform (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
467+
}
468+
456469
platform = platform->GetAssociatedPlatformByAddress(entryPointAddress);
457470
entryPointAddress = m_entryPoint;
458471
LogDebug("COFF: entry point %#" PRIx64 " associated platform (%#x, arch: %s): %s", entryPointAddress, header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
459472

460-
if (settings && settings->Contains("loader.platform")) // handle overrides
461-
{
462-
auto platformOverrideName = settings->Get<string>("loader.platform", this);
463-
Ref<Platform> platformOverride = Platform::GetByName(platformOverrideName);
464-
if (platformOverride)
465-
{
466-
platform = platformOverride;
467-
LogDebug("COFF: loader.platform override (%#x, arch: %s): %s", header.machine, m_arch->GetName().c_str(), platform->GetName().c_str());
468-
}
469-
else
470-
{
471-
LogError("COFF: Cannot find platform \"%s\" specified in loader.platform override", platformOverrideName.c_str());
472-
}
473-
}
474-
475473
SetDefaultPlatform(platform);
476474
SetDefaultArchitecture(platform->GetArchitecture());
477475
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)
16471645
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
16481646

16491647
// specify default load settings that can be overridden
1650-
vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"};
1648+
vector<string> overrides = {"loader.imageBase", "loader.platform"};
16511649
if (!viewRef->IsRelocatable())
16521650
settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable.");
16531651

view/pe/peview.cpp

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -598,13 +598,20 @@ bool PEView::Init()
598598
m_simplifyTemplates = viewSettings->Get<bool>("analysis.types.templateSimplifier", this);
599599

600600
settings = GetLoadSettings(GetTypeName());
601-
if (settings && settings->Contains("loader.imageBase") && settings->Contains("loader.architecture")) // handle overrides
601+
if (settings)
602602
{
603-
m_imageBase = settings->Get<uint64_t>("loader.imageBase", this);
603+
if (settings->Contains("loader.imageBase"))
604+
m_imageBase = settings->Get<uint64_t>("loader.imageBase", this);
604605

605-
Ref<Architecture> arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
606-
if (!m_arch || (arch && (arch->GetName() != m_arch->GetName())))
607-
m_arch = arch;
606+
if (settings->Contains("loader.platform"))
607+
{
608+
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
609+
if (platformOverride)
610+
{
611+
platform = platformOverride;
612+
m_arch = platform->GetArchitecture();
613+
}
614+
}
608615
}
609616

610617
// Apply architecture and platform
@@ -636,16 +643,7 @@ bool PEView::Init()
636643
return false;
637644
}
638645

639-
640646
platform = platform->GetAssociatedPlatformByAddress(m_entryPoint);
641-
642-
if (settings && settings->Contains("loader.platform")) // handle overrides
643-
{
644-
Ref<Platform> platformOverride = Platform::GetByName(settings->Get<string>("loader.platform", this));
645-
if (platformOverride)
646-
platform = platformOverride;
647-
}
648-
649647
SetDefaultPlatform(platform);
650648
SetDefaultArchitecture(platform->GetArchitecture());
651649

@@ -3086,7 +3084,7 @@ Ref<Settings> PEViewType::GetLoadSettingsForData(BinaryView* data)
30863084
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
30873085

30883086
// specify default load settings that can be overridden
3089-
vector<string> overrides = {"loader.architecture", "loader.imageBase", "loader.platform"};
3087+
vector<string> overrides = {"loader.imageBase", "loader.platform"};
30903088
if (!viewRef->IsRelocatable())
30913089
settings->UpdateProperty("loader.imageBase", "message", "Note: File indicates image is not relocatable.");
30923090

view/pe/teview.cpp

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -202,19 +202,6 @@ TEView::TEView(BinaryView* bv, bool parseOnly) : BinaryView("TE", bv->GetFile(),
202202
m_backedByDatabase = bv->GetFile()->IsBackedByDatabase("TE");
203203
}
204204

205-
void TEView::HandleUserOverrides()
206-
{
207-
auto settings = GetLoadSettings(GetTypeName());
208-
if (!settings)
209-
return;
210-
211-
if (settings->Contains("loader.imageBase"))
212-
m_imageBase = settings->Get<uint64_t>("loader.imageBase", this);
213-
214-
if (settings->Contains("loader.architecture"))
215-
m_arch = Architecture::GetByName(settings->Get<string>("loader.architecture", this));
216-
}
217-
218205
bool TEView::Init()
219206
{
220207
BinaryReader reader(GetParentView(), LittleEndian);
@@ -227,27 +214,26 @@ bool TEView::Init()
227214
ReadTEImageHeader(reader, header);
228215
ReadTEImageSectionHeaders(reader, header.numberOfSections);
229216
m_headersOffset = header.strippedSize - EFI_TE_IMAGE_HEADER_SIZE;
217+
m_imageBase = header.imageBase;
230218

231219
// Set architecture and platform
232-
HandleUserOverrides();
233-
if (m_arch)
220+
auto settings = GetLoadSettings(GetTypeName());
221+
if (settings)
234222
{
235-
auto archName = m_arch->GetName();
236-
if (archName == "x86")
237-
platform = Platform::GetByName("efi-x86");
238-
if (archName == "x86_64")
239-
platform = Platform::GetByName("efi-x86_64");
240-
if (archName == "aarch64")
241-
platform = Platform::GetByName("efi-aarch64");
242-
if (!platform)
223+
if (settings->Contains("loader.imageBase"))
243224
{
244-
m_logger->LogError("TE architecture '%s' is not supported", archName.c_str());
245-
return false;
225+
uint64_t baseOverride = settings->Get<uint64_t>("loader.imageBase", this);
226+
// TE image bases represent the base of the original PE (before headers are stripped) - make this
227+
// adjustment for the user
228+
m_imageBase = baseOverride - m_headersOffset;
246229
}
230+
231+
if (settings->Contains("loader.platform"))
232+
platform = Platform::GetByName(settings->Get<string>("loader.platform", this));
247233
}
248-
else
234+
235+
if (!platform)
249236
{
250-
m_imageBase = header.imageBase;
251237
switch (header.machine)
252238
{
253239
case IMAGE_FILE_MACHINE_I386:
@@ -259,21 +245,19 @@ bool TEView::Init()
259245
case IMAGE_FILE_MACHINE_ARM64:
260246
platform = Platform::GetByName("efi-aarch64");
261247
break;
248+
case IMAGE_FILE_MACHINE_ARM:
249+
platform = Platform::GetByName("efi-armv7");
250+
break;
251+
case IMAGE_FILE_MACHINE_THUMB:
252+
platform = Platform::GetByName("efi-thumb2");
253+
break;
262254
default:
263-
LogError("TE architecture '0x%x' is not supported", header.machine);
255+
LogError("TE platform '0x%x' is not supported", header.machine);
264256
return false;
265257
}
266-
267-
if (!platform)
268-
{
269-
// Should never occur as long as the platforms exist
270-
m_logger->LogError("Failed to set platform for TE file");
271-
return false;
272-
}
273-
274-
m_arch = platform->GetArchitecture();
275258
}
276259

260+
m_arch = platform->GetArchitecture();
277261
SetDefaultPlatform(platform);
278262
SetDefaultArchitecture(m_arch);
279263

@@ -382,7 +366,7 @@ Ref<Settings> TEViewType::GetLoadSettingsForData(BinaryView *bv)
382366

383367
// specify default load settings that can be overridden
384368
Ref<Settings> settings = GetDefaultLoadSettingsForData(viewRef);
385-
vector<string> overrides = {"loader.architecture", "loader.imageBase"};
369+
vector<string> overrides = {"loader.platform", "loader.imageBase"};
386370
for (const auto& override : overrides)
387371
{
388372
if (settings->Contains(override))

view/pe/teview.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ namespace BinaryNinja
7777
private:
7878
void ReadTEImageHeader(BinaryReader& reader, struct TEImageHeader& imageHeader);
7979
void ReadTEImageSectionHeaders(BinaryReader& reader, uint32_t numSections);
80-
void HandleUserOverrides();
8180
void CreateSections();
8281
void AssignHeaderTypes();
8382
};

0 commit comments

Comments
 (0)