From 69f82471946993d335980d6411768fc94bac7f50 Mon Sep 17 00:00:00 2001 From: 0x6d696368 <> Date: Fri, 26 Apr 2019 02:50:47 +0200 Subject: [PATCH 1/2] Fix #327 by taking the longer of sizeOfRawData or virtualSize. This fixes all issues of #327. --- .../main/java/ghidra/app/util/bin/format/pe/FileHeader.java | 6 +++++- .../ghidra/app/util/bin/format/pe/PortableExecutable.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java index 045d56eb35..84d79caf1a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java @@ -313,7 +313,11 @@ public class FileHeader implements StructConverter { int sizeOfRawData = sectionHeaders[i].getSizeOfRawData(); sizeOfRawData = PortableExecutable.computeAlignment(sizeOfRawData, optHeader.getFileAlignment()); sectionHeaders[i].setSizeOfRawData(sizeOfRawData); - + + int virtualSize = sectionHeaders[i].getVirtualSize(); + virtualSize = PortableExecutable.computeAlignment(virtualSize, optHeader.getSectionAlignment()); + sectionHeaders[i].setVirtualSize(virtualSize); + tmpIndex += SectionHeader.IMAGE_SIZEOF_SECTION_HEADER; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java index a183d5b7fa..45ca1a6eb7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java @@ -184,7 +184,7 @@ public class PortableExecutable { } public static int computeAlignment(int value, int alignment) { - if ((value % alignment) == 0) { + if ( alignment == 0 || (value % alignment) == 0) { return value; } int a = ((value + alignment) / alignment) * alignment; From db4b8e1c190f10c320042bb419c50ad78296cea2 Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Mon, 13 May 2019 09:34:06 -0400 Subject: [PATCH 2/2] GT-2827 (closes #418, closes #327): More tweaks to PeLoader memory block size. Pulled-from: 0x6d696368 <> --- .../app/util/bin/format/pe/FileHeader.java | 38 ++++++++++++------- .../bin/format/pe/PortableExecutable.java | 2 +- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java index 84d79caf1a..b78dfb2d81 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/FileHeader.java @@ -307,20 +307,32 @@ public class FileHeader implements StructConverter { Msg.error(this, "File alignment == 0: section processing skipped"); } else { sectionHeaders = new SectionHeader[numberOfSections]; - for (int i = 0; i < numberOfSections; ++i) { - sectionHeaders[i] = SectionHeader.createSectionHeader(reader, tmpIndex); - - int sizeOfRawData = sectionHeaders[i].getSizeOfRawData(); - sizeOfRawData = PortableExecutable.computeAlignment(sizeOfRawData, optHeader.getFileAlignment()); - sectionHeaders[i].setSizeOfRawData(sizeOfRawData); + for (int i = 0; i < numberOfSections; ++i) { + sectionHeaders[i] = SectionHeader.createSectionHeader(reader, tmpIndex); - int virtualSize = sectionHeaders[i].getVirtualSize(); - virtualSize = PortableExecutable.computeAlignment(virtualSize, optHeader.getSectionAlignment()); - sectionHeaders[i].setVirtualSize(virtualSize); - - tmpIndex += SectionHeader.IMAGE_SIZEOF_SECTION_HEADER; - } - } + // Ensure VirtualSize is large enough to accommodate SizeOfRawData, but do not + // exceed the next alignment boundary. We can only do this if the VirtualAddress is + // already properly aligned, since we currently don't support moving sections to + // different addresses to enforce alignment. + int virtualAddress = sectionHeaders[i].getVirtualAddress(); + int virtualSize = sectionHeaders[i].getVirtualSize(); + int sizeOfRawData = sectionHeaders[i].getSizeOfRawData(); + int alignedVirtualAddress = PortableExecutable.computeAlignment(virtualAddress, + optHeader.getSectionAlignment()); + int alignedVirtualSize = PortableExecutable.computeAlignment(virtualSize, + optHeader.getSectionAlignment()); + if (virtualAddress == alignedVirtualAddress) { + if (sizeOfRawData > virtualSize) { + sectionHeaders[i].setVirtualSize( + Math.min(sizeOfRawData, alignedVirtualSize)); + } + } + else { + Msg.warn(this, "Section " + sectionHeaders[i].getName() + " is not aligned!"); + } + tmpIndex += SectionHeader.IMAGE_SIZEOF_SECTION_HEADER; + } + } reader.setPointerIndex(oldIndex); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java index 45ca1a6eb7..cb34160594 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PortableExecutable.java @@ -184,7 +184,7 @@ public class PortableExecutable { } public static int computeAlignment(int value, int alignment) { - if ( alignment == 0 || (value % alignment) == 0) { + if (alignment == 0 || (value % alignment) == 0) { return value; } int a = ((value + alignment) / alignment) * alignment;