diff --git a/src/LibObjectFile/PE/DataDirectory/PEImportDirectory.cs b/src/LibObjectFile/PE/DataDirectory/PEImportDirectory.cs index 7e81443..8c8f451 100644 --- a/src/LibObjectFile/PE/DataDirectory/PEImportDirectory.cs +++ b/src/LibObjectFile/PE/DataDirectory/PEImportDirectory.cs @@ -61,7 +61,7 @@ public override void Read(PEImageReader reader) } // Calculate its position within the original stream - var importLookupAddressTablePositionInFile = section.Position + rawEntry.ImportLookupTableRVA - section.VirtualAddress; + var importLookupAddressTablePositionInFile = section.Position + rawEntry.ImportAddressTableRVA - section.VirtualAddress; // Find the section data for the ImportLookupTableRVA if (!reader.File.TryFindSection(rawEntry.ImportLookupTableRVA, out section)) diff --git a/src/LibObjectFile/PE/PEFile.Read.cs b/src/LibObjectFile/PE/PEFile.Read.cs index 2d4785d..cd1ea2e 100644 --- a/src/LibObjectFile/PE/PEFile.Read.cs +++ b/src/LibObjectFile/PE/PEFile.Read.cs @@ -394,9 +394,14 @@ private static void FillSectionDataWithMissingStreams(PEImageReader imageReader, { var currentPosition = startPosition; - for (var i = 0; i < dataParts.Count; i++) + // We are working on position, while the list is ordered by VirtualAddress + var listOrderedByPosition = new List(); + listOrderedByPosition.AddRange(dataParts.UnsafeList); + listOrderedByPosition.Sort((a, b) => a.Position.CompareTo(b.Position)); + + for (var i = 0; i < listOrderedByPosition.Count; i++) { - var data = dataParts[i]; + var data = listOrderedByPosition[i]; if (currentPosition < data.Position) { var sectionData = new PEStreamSectionData() @@ -407,7 +412,7 @@ private static void FillSectionDataWithMissingStreams(PEImageReader imageReader, imageReader.Position = currentPosition; sectionData.Stream = imageReader.ReadAsStream(size); - dataParts.Insert(i, sectionData); + dataParts.Insert(data.Index, sectionData); currentPosition = data.Position; i++; }