summaryrefslogtreecommitdiff
path: root/view/pe
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2024-03-12 19:56:26 -0400
committerBrandon Miller <bkmiller89@icloud.com>2024-03-13 09:37:01 -0400
commitc7c14723cff22c28af6c2eca464c474dfdd55ed6 (patch)
tree91f000bdfbafb0a2e42e084494e7791cf3173100 /view/pe
parent45a674447579e350cf380dbacba5c5f6360c5ac1 (diff)
Fixed segment / section misalignment in TE view
This commit fixes an issue in the TE view while creating segments and sections. Segments and sections are calculated from the base of the original PE file, prior to the PE headers being stripped and replaced with the TE header
Diffstat (limited to 'view/pe')
-rw-r--r--view/pe/teview.cpp24
-rw-r--r--view/pe/teview.h1
2 files changed, 14 insertions, 11 deletions
diff --git a/view/pe/teview.cpp b/view/pe/teview.cpp
index 46b06a9a..b8e83d6b 100644
--- a/view/pe/teview.cpp
+++ b/view/pe/teview.cpp
@@ -64,7 +64,8 @@ void TEView::ReadTEImageHeader(BinaryReader& reader, struct TEImageHeader& heade
void TEView::ReadTEImageSectionHeaders(BinaryReader& reader, uint32_t numSections)
{
- for (uint32_t i = 0; i < numSections; i++) {
+ for (uint32_t i = 0; i < numSections; i++)
+ {
TEImageSectionHeader section;
section.name = reader.ReadString(8);
section.virtualSize = reader.Read32();
@@ -108,7 +109,8 @@ void TEView::ReadTEImageSectionHeaders(BinaryReader& reader, uint32_t numSection
void TEView::CreateSections()
{
- for (size_t i = 0; i < m_sections.size(); i++) {
+ for (size_t i = 0; i < m_sections.size(); i++)
+ {
auto section = m_sections[i];
uint32_t flags = 0;
if (section.characteristics & EFI_IMAGE_SCN_MEM_WRITE)
@@ -121,8 +123,8 @@ void TEView::CreateSections()
AddAutoSegment(
section.virtualAddress + m_imageBase,
section.virtualSize,
- section.virtualAddress,
- section.virtualSize,
+ section.pointerToRawData - m_headersOffset,
+ section.sizeOfRawData,
flags
);
@@ -162,7 +164,7 @@ void TEView::AssignHeaderTypes()
QualifiedName headerName = string("TE_Header");
auto headerTypeId = Type::GenerateAutoTypeId("te", headerName);
QualifiedName headerTypeName = DefineType(headerTypeId, headerName, headerType);
- DefineDataVariable(m_imageBase, Type::NamedType(this, headerTypeName));
+ DefineDataVariable(m_imageBase + m_headersOffset, Type::NamedType(this, headerTypeName));
StructureBuilder sectionBuilder;
sectionBuilder.AddMember(Type::IntegerType(8, false), "Name");
@@ -183,7 +185,7 @@ void TEView::AssignHeaderTypes()
auto sectionTypeId = Type::GenerateAutoTypeId("te", sectionName);
QualifiedName sectionTypeName = DefineType(sectionTypeId, sectionName, sectionType);
DefineDataVariable(
- m_imageBase + EFI_TE_IMAGE_HEADER_SIZE + (EFI_TE_SECTION_HEADER_SIZE * i),
+ m_imageBase + m_headersOffset + EFI_TE_IMAGE_HEADER_SIZE + (EFI_TE_SECTION_HEADER_SIZE * i),
Type::NamedType(this, sectionTypeName)
);
}
@@ -220,6 +222,7 @@ bool TEView::Init()
// Read image header and section headers
ReadTEImageHeader(reader, header);
ReadTEImageSectionHeaders(reader, header.numberOfSections);
+ m_headersOffset = header.strippedSize - EFI_TE_IMAGE_HEADER_SIZE;
// Set architecture and platform
HandleUserOverrides();
@@ -240,9 +243,7 @@ bool TEView::Init()
}
else
{
- // Adjusted image base after objcopy and applying new TE header
- m_imageBase = header.imageBase + header.strippedSize - EFI_TE_IMAGE_HEADER_SIZE;
- m_logger->LogDebug("TE adjusted image base: %08x\n", m_imageBase);
+ m_imageBase = header.imageBase;
switch (header.machine)
{
case IMAGE_FILE_MACHINE_I386:
@@ -259,7 +260,8 @@ bool TEView::Init()
return false;
}
- if (!platform) {
+ if (!platform)
+ {
// Should never occur as long as the platforms exist
m_logger->LogError("Failed to set platform for TE file");
return false;
@@ -273,7 +275,7 @@ bool TEView::Init()
// Create a segment for the header so that it can be viewed and create sections
uint64_t headerSegmentSize = reader.GetOffset();
- AddAutoSegment(m_imageBase, headerSegmentSize, 0, headerSegmentSize, SegmentReadable);
+ AddAutoSegment(m_imageBase + m_headersOffset, headerSegmentSize, 0, headerSegmentSize, SegmentReadable);
CreateSections();
AssignHeaderTypes();
diff --git a/view/pe/teview.h b/view/pe/teview.h
index 230539b5..dd0060f8 100644
--- a/view/pe/teview.h
+++ b/view/pe/teview.h
@@ -59,6 +59,7 @@ namespace BinaryNinja
Ref<Logger> m_logger;
bool m_backedByDatabase;
uint64_t m_imageBase;
+ uint64_t m_headersOffset;
Ref<Architecture> m_arch;
uint64_t m_entryPoint;