diff --git a/BurnOutSharp.Builder/PortableExecutable.cs b/BurnOutSharp.Builder/PortableExecutable.cs
index 470e07ca..8f6b8f81 100644
--- a/BurnOutSharp.Builder/PortableExecutable.cs
+++ b/BurnOutSharp.Builder/PortableExecutable.cs
@@ -177,95 +177,95 @@ namespace BurnOutSharp.Builder
#region Data Directories
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 1 && offset - initialOffset < optionalSize)
{
optionalHeader.ExportTable = new DataDirectory();
optionalHeader.ExportTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.ExportTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 2 && offset - initialOffset < optionalSize)
{
optionalHeader.ImportTable = new DataDirectory();
optionalHeader.ImportTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.ImportTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 3 && offset - initialOffset < optionalSize)
{
optionalHeader.ResourceTable = new DataDirectory();
optionalHeader.ResourceTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.ResourceTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 4 && offset - initialOffset < optionalSize)
{
optionalHeader.ExceptionTable = new DataDirectory();
optionalHeader.ExceptionTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.ExceptionTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 5 && offset - initialOffset < optionalSize)
{
optionalHeader.CertificateTable = new DataDirectory();
optionalHeader.CertificateTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.CertificateTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 6 && offset - initialOffset < optionalSize)
{
optionalHeader.BaseRelocationTable = new DataDirectory();
optionalHeader.BaseRelocationTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.BaseRelocationTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 7 && offset - initialOffset < optionalSize)
{
optionalHeader.Debug = new DataDirectory();
optionalHeader.Debug.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.Debug.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 8 && offset - initialOffset < optionalSize)
{
optionalHeader.Architecture = data.ReadUInt64(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 9 && offset - initialOffset < optionalSize)
{
optionalHeader.GlobalPtr = new DataDirectory();
optionalHeader.GlobalPtr.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.GlobalPtr.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 10 && offset - initialOffset < optionalSize)
{
- optionalHeader.TLSTable = new DataDirectory();
- optionalHeader.TLSTable.VirtualAddress = data.ReadUInt32(ref offset);
- optionalHeader.TLSTable.Size = data.ReadUInt32(ref offset);
+ optionalHeader.ThreadLocalStorageTable = new DataDirectory();
+ optionalHeader.ThreadLocalStorageTable.VirtualAddress = data.ReadUInt32(ref offset);
+ optionalHeader.ThreadLocalStorageTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 11 && offset - initialOffset < optionalSize)
{
optionalHeader.LoadConfigTable = new DataDirectory();
optionalHeader.LoadConfigTable.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.LoadConfigTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 12 && offset - initialOffset < optionalSize)
{
optionalHeader.BoundImport = new DataDirectory();
optionalHeader.BoundImport.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.BoundImport.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 13 && offset - initialOffset < optionalSize)
{
- optionalHeader.IAT = new DataDirectory();
- optionalHeader.IAT.VirtualAddress = data.ReadUInt32(ref offset);
- optionalHeader.IAT.Size = data.ReadUInt32(ref offset);
+ optionalHeader.ImportAddressTable = new DataDirectory();
+ optionalHeader.ImportAddressTable.VirtualAddress = data.ReadUInt32(ref offset);
+ optionalHeader.ImportAddressTable.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 14 && offset - initialOffset < optionalSize)
{
optionalHeader.DelayImportDescriptor = new DataDirectory();
optionalHeader.DelayImportDescriptor.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.DelayImportDescriptor.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 15 && offset - initialOffset < optionalSize)
{
optionalHeader.CLRRuntimeHeader = new DataDirectory();
optionalHeader.CLRRuntimeHeader.VirtualAddress = data.ReadUInt32(ref offset);
optionalHeader.CLRRuntimeHeader.Size = data.ReadUInt32(ref offset);
}
- if (offset - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 16 && offset - initialOffset < optionalSize)
{
optionalHeader.Reserved = data.ReadUInt64(ref offset);
}
@@ -445,95 +445,95 @@ namespace BurnOutSharp.Builder
#region Data Directories
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 1 && data.Position - initialOffset < optionalSize)
{
optionalHeader.ExportTable = new DataDirectory();
optionalHeader.ExportTable.VirtualAddress = data.ReadUInt32();
optionalHeader.ExportTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 2 && data.Position - initialOffset < optionalSize)
{
optionalHeader.ImportTable = new DataDirectory();
optionalHeader.ImportTable.VirtualAddress = data.ReadUInt32();
optionalHeader.ImportTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 3 && data.Position - initialOffset < optionalSize)
{
optionalHeader.ResourceTable = new DataDirectory();
optionalHeader.ResourceTable.VirtualAddress = data.ReadUInt32();
optionalHeader.ResourceTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 4 && data.Position - initialOffset < optionalSize)
{
optionalHeader.ExceptionTable = new DataDirectory();
optionalHeader.ExceptionTable.VirtualAddress = data.ReadUInt32();
optionalHeader.ExceptionTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 5 && data.Position - initialOffset < optionalSize)
{
optionalHeader.CertificateTable = new DataDirectory();
optionalHeader.CertificateTable.VirtualAddress = data.ReadUInt32();
optionalHeader.CertificateTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 6 && data.Position - initialOffset < optionalSize)
{
optionalHeader.BaseRelocationTable = new DataDirectory();
optionalHeader.BaseRelocationTable.VirtualAddress = data.ReadUInt32();
optionalHeader.BaseRelocationTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 7 && data.Position - initialOffset < optionalSize)
{
optionalHeader.Debug = new DataDirectory();
optionalHeader.Debug.VirtualAddress = data.ReadUInt32();
optionalHeader.Debug.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 8 && data.Position - initialOffset < optionalSize)
{
optionalHeader.Architecture = data.ReadUInt64();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 9 && data.Position - initialOffset < optionalSize)
{
optionalHeader.GlobalPtr = new DataDirectory();
optionalHeader.GlobalPtr.VirtualAddress = data.ReadUInt32();
optionalHeader.GlobalPtr.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 10 && data.Position - initialOffset < optionalSize)
{
- optionalHeader.TLSTable = new DataDirectory();
- optionalHeader.TLSTable.VirtualAddress = data.ReadUInt32();
- optionalHeader.TLSTable.Size = data.ReadUInt32();
+ optionalHeader.ThreadLocalStorageTable = new DataDirectory();
+ optionalHeader.ThreadLocalStorageTable.VirtualAddress = data.ReadUInt32();
+ optionalHeader.ThreadLocalStorageTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 11 && data.Position - initialOffset < optionalSize)
{
optionalHeader.LoadConfigTable = new DataDirectory();
optionalHeader.LoadConfigTable.VirtualAddress = data.ReadUInt32();
optionalHeader.LoadConfigTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 12 && data.Position - initialOffset < optionalSize)
{
optionalHeader.BoundImport = new DataDirectory();
optionalHeader.BoundImport.VirtualAddress = data.ReadUInt32();
optionalHeader.BoundImport.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 13 && data.Position - initialOffset < optionalSize)
{
- optionalHeader.IAT = new DataDirectory();
- optionalHeader.IAT.VirtualAddress = data.ReadUInt32();
- optionalHeader.IAT.Size = data.ReadUInt32();
+ optionalHeader.ImportAddressTable = new DataDirectory();
+ optionalHeader.ImportAddressTable.VirtualAddress = data.ReadUInt32();
+ optionalHeader.ImportAddressTable.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 14 && data.Position - initialOffset < optionalSize)
{
optionalHeader.DelayImportDescriptor = new DataDirectory();
optionalHeader.DelayImportDescriptor.VirtualAddress = data.ReadUInt32();
optionalHeader.DelayImportDescriptor.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 15 && data.Position - initialOffset < optionalSize)
{
optionalHeader.CLRRuntimeHeader = new DataDirectory();
optionalHeader.CLRRuntimeHeader.VirtualAddress = data.ReadUInt32();
optionalHeader.CLRRuntimeHeader.Size = data.ReadUInt32();
}
- if (data.Position - initialOffset < optionalSize)
+ if (optionalHeader.NumberOfRvaAndSizes >= 16 && data.Position - initialOffset < optionalSize)
{
optionalHeader.Reserved = data.ReadUInt64();
}
diff --git a/BurnOutSharp.Models/PortableExecutable/OptionalHeader.cs b/BurnOutSharp.Models/PortableExecutable/OptionalHeader.cs
index fdf4932a..163015bc 100644
--- a/BurnOutSharp.Models/PortableExecutable/OptionalHeader.cs
+++ b/BurnOutSharp.Models/PortableExecutable/OptionalHeader.cs
@@ -321,7 +321,7 @@
///
/// The thread local storage (TLS) table address and size.
///
- public DataDirectory TLSTable;
+ public DataDirectory ThreadLocalStorageTable;
///
/// The load configuration table address and size.
@@ -336,7 +336,7 @@
///
/// The import address table address and size
///
- public DataDirectory IAT;
+ public DataDirectory ImportAddressTable;
///
/// The delay import descriptor address and size.
diff --git a/ExecutableTest/Program.cs b/ExecutableTest/Program.cs
index d2a33d2f..08121fa5 100644
--- a/ExecutableTest/Program.cs
+++ b/ExecutableTest/Program.cs
@@ -1,4 +1,5 @@
-using System.Text;
+using System.Security.Cryptography;
+using System.Text;
using BurnOutSharp.Builder;
namespace ExecutableTest
@@ -392,5 +393,187 @@ namespace ExecutableTest
}
Console.WriteLine();
}
+
+ ///
+ /// Pretty print the Portable Executable information
+ ///
+ private static void PrintPortableExecutable(BurnOutSharp.Models.PortableExecutable.Executable executable)
+ {
+ Console.WriteLine("Portable Executable Information:");
+ Console.WriteLine("-------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" MS-DOS Stub Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine(" See 'MS-DOS Executable Information' for details");
+ Console.WriteLine();
+
+ Console.WriteLine(" COFF File Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Signature: {BitConverter.ToString(executable.Signature).Replace("-", string.Empty)}");
+ Console.WriteLine($" Machine: {executable.COFFFileHeader.Machine}");
+ Console.WriteLine($" Number of sections: {executable.COFFFileHeader.NumberOfSections}");
+ Console.WriteLine($" Time/Date stamp: {executable.COFFFileHeader.TimeDateStamp}");
+ Console.WriteLine($" Pointer to symbol table: {executable.COFFFileHeader.PointerToSymbolTable}");
+ Console.WriteLine($" Number of symbols: {executable.COFFFileHeader.NumberOfSymbols}");
+ Console.WriteLine($" Size of optional header: {executable.COFFFileHeader.SizeOfOptionalHeader}");
+ Console.WriteLine($" Characteristics: {executable.COFFFileHeader.Characteristics}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Optional Header Information:");
+ Console.WriteLine(" -------------------------");
+ if (executable.COFFFileHeader.SizeOfOptionalHeader == 0 || executable.OptionalHeader == null)
+ {
+ Console.WriteLine(" No optional header present");
+ }
+ else
+ {
+ Console.WriteLine($" Magic: {executable.OptionalHeader.Magic}");
+ Console.WriteLine($" Major linker version: {executable.OptionalHeader.MajorLinkerVersion}");
+ Console.WriteLine($" Minor linker version: {executable.OptionalHeader.MinorLinkerVersion}");
+ Console.WriteLine($" Size of code section: {executable.OptionalHeader.SizeOfCode}");
+ Console.WriteLine($" Size of initialized data: {executable.OptionalHeader.SizeOfInitializedData}");
+ Console.WriteLine($" Size of uninitialized data: {executable.OptionalHeader.SizeOfUninitializedData}");
+ Console.WriteLine($" Address of entry point: {executable.OptionalHeader.AddressOfEntryPoint}");
+ Console.WriteLine($" Base of code: {executable.OptionalHeader.BaseOfCode}");
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Base of data: {executable.OptionalHeader.BaseOfData}");
+
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Image base: {executable.OptionalHeader.ImageBase_PE32}");
+ else if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Image base: {executable.OptionalHeader.ImageBase_PE32Plus}");
+ Console.WriteLine($" Section alignment: {executable.OptionalHeader.SectionAlignment}");
+ Console.WriteLine($" File alignment: {executable.OptionalHeader.FileAlignment}");
+ Console.WriteLine($" Major operating system version: {executable.OptionalHeader.MajorOperatingSystemVersion}");
+ Console.WriteLine($" Minor operating system version: {executable.OptionalHeader.MinorOperatingSystemVersion}");
+ Console.WriteLine($" Major image version: {executable.OptionalHeader.MajorImageVersion}");
+ Console.WriteLine($" Minor image version: {executable.OptionalHeader.MinorImageVersion}");
+ Console.WriteLine($" Major subsystem version: {executable.OptionalHeader.MajorSubsystemVersion}");
+ Console.WriteLine($" Minor subsystem version: {executable.OptionalHeader.MinorSubsystemVersion}");
+ Console.WriteLine($" Win32 version value: {executable.OptionalHeader.Win32VersionValue}");
+ Console.WriteLine($" Size of image: {executable.OptionalHeader.SizeOfImage}");
+ Console.WriteLine($" Size of headers: {executable.OptionalHeader.SizeOfHeaders}");
+ Console.WriteLine($" Checksum: {executable.OptionalHeader.CheckSum}");
+ Console.WriteLine($" Subsystem: {executable.OptionalHeader.Subsystem}");
+ Console.WriteLine($" DLL characteristics: {executable.OptionalHeader.DllCharacteristics}");
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of stack reserve: {executable.OptionalHeader.SizeOfStackReserve_PE32}");
+ else if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of stack reserve: {executable.OptionalHeader.SizeOfStackReserve_PE32Plus}");
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of stack commit: {executable.OptionalHeader.SizeOfStackCommit_PE32}");
+ else if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of stack commit: {executable.OptionalHeader.SizeOfStackCommit_PE32Plus}");
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of heap reserve: {executable.OptionalHeader.SizeOfHeapReserve_PE32}");
+ else if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of heap reserve: {executable.OptionalHeader.SizeOfHeapReserve_PE32Plus}");
+ if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of heap commit: {executable.OptionalHeader.SizeOfHeapCommit_PE32}");
+ else if (executable.OptionalHeader.Magic == BurnOutSharp.Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of heap commit: {executable.OptionalHeader.SizeOfHeapCommit_PE32Plus}");
+ Console.WriteLine($" Loader flags: {executable.OptionalHeader.LoaderFlags}");
+ Console.WriteLine($" Number of data-directory entries: {executable.OptionalHeader.NumberOfRvaAndSizes}");
+
+ if (executable.OptionalHeader.ExportTable != null)
+ {
+ Console.WriteLine(" Export Table (1)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ExportTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ExportTable.Size}");
+ }
+ if (executable.OptionalHeader.ImportTable != null)
+ {
+ Console.WriteLine(" Import Table (2)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ImportTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ImportTable.Size}");
+ }
+ if (executable.OptionalHeader.ResourceTable != null)
+ {
+ Console.WriteLine(" Resource Table (3)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ResourceTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ResourceTable.Size}");
+ }
+ if (executable.OptionalHeader.ExceptionTable != null)
+ {
+ Console.WriteLine(" Exception Table (4)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ExceptionTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ExceptionTable.Size}");
+ }
+ if (executable.OptionalHeader.CertificateTable != null)
+ {
+ Console.WriteLine(" Certificate Table (5)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.CertificateTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.CertificateTable.Size}");
+ }
+ if (executable.OptionalHeader.BaseRelocationTable != null)
+ {
+ Console.WriteLine(" Base Relocation Table (6)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.BaseRelocationTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.BaseRelocationTable.Size}");
+ }
+ if (executable.OptionalHeader.Debug != null)
+ {
+ Console.WriteLine(" Debug Table (7)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.Debug.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.Debug.Size}");
+ }
+ if (executable.OptionalHeader.NumberOfRvaAndSizes >= 8)
+ {
+ Console.WriteLine(" Architecture Table (8)");
+ Console.WriteLine($" Virtual address: 0");
+ Console.WriteLine($" Size: 0");
+ }
+ if (executable.OptionalHeader.GlobalPtr != null)
+ {
+ Console.WriteLine(" Global Pointer Register (9)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.GlobalPtr.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.GlobalPtr.Size}");
+ }
+ if (executable.OptionalHeader.ThreadLocalStorageTable != null)
+ {
+ Console.WriteLine(" Thread Local Storage (TLS) Table (10)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ThreadLocalStorageTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ThreadLocalStorageTable.Size}");
+ }
+ if (executable.OptionalHeader.LoadConfigTable != null)
+ {
+ Console.WriteLine(" Load Config Table (11)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.LoadConfigTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.LoadConfigTable.Size}");
+ }
+ if (executable.OptionalHeader.BoundImport != null)
+ {
+ Console.WriteLine(" Bound Import Table (12)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.BoundImport.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.BoundImport.Size}");
+ }
+ if (executable.OptionalHeader.ImportAddressTable != null)
+ {
+ Console.WriteLine(" Import Address Table (13)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.ImportAddressTable.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.ImportAddressTable.Size}");
+ }
+ if (executable.OptionalHeader.DelayImportDescriptor != null)
+ {
+ Console.WriteLine(" Delay Import Descriptior (14)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.DelayImportDescriptor.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.DelayImportDescriptor.Size}");
+ }
+ if (executable.OptionalHeader.CLRRuntimeHeader != null)
+ {
+ Console.WriteLine(" CLR Runtime Header (15)");
+ Console.WriteLine($" Virtual address: {executable.OptionalHeader.CLRRuntimeHeader.VirtualAddress}");
+ Console.WriteLine($" Size: {executable.OptionalHeader.CLRRuntimeHeader.Size}");
+ }
+ if (executable.OptionalHeader.NumberOfRvaAndSizes >= 16)
+ {
+ Console.WriteLine(" Reserved (16)");
+ Console.WriteLine($" Virtual address: 0");
+ Console.WriteLine($" Size: 0");
+ }
+ }
+ Console.WriteLine();
+ }
}
}
\ No newline at end of file