diff --git a/Mono.Cecil.PE/ImageReader.cs b/Mono.Cecil.PE/ImageReader.cs index a34e64d36..f73401e0a 100644 --- a/Mono.Cecil.PE/ImageReader.cs +++ b/Mono.Cecil.PE/ImageReader.cs @@ -351,8 +351,10 @@ void ReadDebugHeader () AddressOfRawData = ReadInt32 (), PointerToRawData = ReadInt32 (), }; - - if (directory.PointerToRawData == 0 || directory.SizeOfData < 0) { + + // directory.Characteristics <-- has to be 0 (https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#the-debug-section) + // if this is not the case, an obfuscation of the file could be the case resulting in wrong SizeOfData + if (directory.PointerToRawData == 0 || directory.Characteristics != 0 || directory.SizeOfData < 0) { entries [i] = new ImageDebugHeaderEntry (directory, Empty.Array); continue; } diff --git a/Test/Mono.Cecil.Tests/ImageReadTests.cs b/Test/Mono.Cecil.Tests/ImageReadTests.cs index fb5c558c6..fc1a48f4b 100644 --- a/Test/Mono.Cecil.Tests/ImageReadTests.cs +++ b/Test/Mono.Cecil.Tests/ImageReadTests.cs @@ -214,6 +214,20 @@ public void Net471TargetingAssembly () Assert.AreEqual (0, module.Image.SubSystemMinor); }); } + + [Test] + public void ObfuscatedAssembly () + { + using (var image = GetResourceImage ("libhello_obfuscated.dll")) { + Assert.AreEqual (3, image.DebugHeader.Entries.Length); + Assert.AreEqual (67, image.DebugHeader.Entries[0].Data.Length); + Assert.AreEqual (0, image.DebugHeader.Entries[1].Data.Length); + Assert.AreEqual (0, image.DebugHeader.Entries[2].Data.Length); + } + + + } + [Test] public void LocallyScopedConstantArray () diff --git a/Test/Resources/assemblies/libhello_obfuscated.dll b/Test/Resources/assemblies/libhello_obfuscated.dll new file mode 100644 index 000000000..dfed95123 Binary files /dev/null and b/Test/Resources/assemblies/libhello_obfuscated.dll differ