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 045d56e..11ae36c 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,16 @@ 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()); + /* Truncate virtualSize to sizeOfRawData to reduce memory blocks of uninitialized data. + * Note: This may still cause problems if code interacts with memory beyond sizeOfRawData but before virtualSize. + * So you can remove the following line to get the complete memory range as would be loaded by the Windows PE loader. + */ + virtualSize = virtualSize > sizeOfRawData ? sizeOfRawData : virtualSize; + 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 a183d5b..45ca1a6 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;