diff --git a/BurnOutSharp.Wrappers/LinearExecutable.cs b/BurnOutSharp.Wrappers/LinearExecutable.cs
index 307b6681..540e8d30 100644
--- a/BurnOutSharp.Wrappers/LinearExecutable.cs
+++ b/BurnOutSharp.Wrappers/LinearExecutable.cs
@@ -321,5 +321,13 @@ namespace BurnOutSharp.Wrappers
var wrapper = new LinearExecutable { _executable = executable };
return wrapper;
}
+
+ ///
+ /// Pretty print the Linear Executable information
+ ///
+ public void Print()
+ {
+ // TODO: Implement printing
+ }
}
}
\ No newline at end of file
diff --git a/BurnOutSharp.Wrappers/MSDOS.cs b/BurnOutSharp.Wrappers/MSDOS.cs
index 0f00c261..39d0f45a 100644
--- a/BurnOutSharp.Wrappers/MSDOS.cs
+++ b/BurnOutSharp.Wrappers/MSDOS.cs
@@ -1,4 +1,5 @@
-using System.IO;
+using System;
+using System.IO;
namespace BurnOutSharp.Wrappers
{
@@ -52,6 +53,25 @@ namespace BurnOutSharp.Wrappers
#endregion
+ #region PE Extensions
+
+ ///
+ public ushort[] Reserved1 => _executable.Header.Reserved1;
+
+ ///
+ public ushort OEMIdentifier => _executable.Header.OEMIdentifier;
+
+ ///
+ public ushort OEMInformation => _executable.Header.OEMInformation;
+
+ ///
+ public ushort[] Reserved2 => _executable.Header.Reserved2;
+
+ ///
+ public uint NewExeHeaderAddr => _executable.Header.NewExeHeaderAddr;
+
+ #endregion
+
#region Relocation Table
///
@@ -105,5 +125,50 @@ namespace BurnOutSharp.Wrappers
var wrapper = new MSDOS { _executable = executable };
return wrapper;
}
+
+ ///
+ /// Pretty print the MS-DOS executable information
+ ///
+ public void Print()
+ {
+ Console.WriteLine("MS-DOS Executable Information:");
+ Console.WriteLine("-------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Magic number: {BitConverter.ToString(_executable.Header.Magic).Replace("-", string.Empty)}");
+ Console.WriteLine($" Last page bytes: {_executable.Header.LastPageBytes}");
+ Console.WriteLine($" Pages: {_executable.Header.Pages}");
+ Console.WriteLine($" Relocation items: {_executable.Header.RelocationItems}");
+ Console.WriteLine($" Header paragraph size: {_executable.Header.HeaderParagraphSize}");
+ Console.WriteLine($" Minimum extra paragraphs: {_executable.Header.MinimumExtraParagraphs}");
+ Console.WriteLine($" Maximum extra paragraphs: {_executable.Header.MaximumExtraParagraphs}");
+ Console.WriteLine($" Initial SS value: {_executable.Header.InitialSSValue}");
+ Console.WriteLine($" Initial SP value: {_executable.Header.InitialSPValue}");
+ Console.WriteLine($" Checksum: {_executable.Header.Checksum}");
+ Console.WriteLine($" Initial IP value: {_executable.Header.InitialIPValue}");
+ Console.WriteLine($" Initial CS value: {_executable.Header.InitialCSValue}");
+ Console.WriteLine($" Relocation table address: {_executable.Header.RelocationTableAddr}");
+ Console.WriteLine($" Overlay number: {_executable.Header.OverlayNumber}");
+
+ Console.WriteLine(" Relocation Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.RelocationItems == 0 || _executable.RelocationTable.Length == 0)
+ {
+ Console.WriteLine(" No relocation table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.RelocationTable.Length; i++)
+ {
+ var entry = _executable.RelocationTable[i];
+ Console.WriteLine($" Relocation Table Entry {i}");
+ Console.WriteLine($" Offset = {entry.Offset}");
+ Console.WriteLine($" Segment = {entry.Segment}");
+ }
+ }
+ Console.WriteLine();
+ }
}
}
\ No newline at end of file
diff --git a/BurnOutSharp.Wrappers/NewExecutable.cs b/BurnOutSharp.Wrappers/NewExecutable.cs
index 6a74e1ab..896723b4 100644
--- a/BurnOutSharp.Wrappers/NewExecutable.cs
+++ b/BurnOutSharp.Wrappers/NewExecutable.cs
@@ -1,5 +1,8 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.IO;
+using System.Text;
+using static BurnOutSharp.Builder.Extensions;
namespace BurnOutSharp.Wrappers
{
@@ -250,5 +253,259 @@ namespace BurnOutSharp.Wrappers
var wrapper = new NewExecutable { _executable = executable };
return wrapper;
}
+
+ ///
+ /// Pretty print the New Executable information
+ ///
+ public void Print()
+ {
+ Console.WriteLine("New Executable Information:");
+ Console.WriteLine("-------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" MS-DOS Stub Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Magic number: {BitConverter.ToString(_executable.Stub.Header.Magic).Replace("-", string.Empty)}");
+ Console.WriteLine($" Last page bytes: {_executable.Stub.Header.LastPageBytes}");
+ Console.WriteLine($" Pages: {_executable.Stub.Header.Pages}");
+ Console.WriteLine($" Relocation items: {_executable.Stub.Header.RelocationItems}");
+ Console.WriteLine($" Header paragraph size: {_executable.Stub.Header.HeaderParagraphSize}");
+ Console.WriteLine($" Minimum extra paragraphs: {_executable.Stub.Header.MinimumExtraParagraphs}");
+ Console.WriteLine($" Maximum extra paragraphs: {_executable.Stub.Header.MaximumExtraParagraphs}");
+ Console.WriteLine($" Initial SS value: {_executable.Stub.Header.InitialSSValue}");
+ Console.WriteLine($" Initial SP value: {_executable.Stub.Header.InitialSPValue}");
+ Console.WriteLine($" Checksum: {_executable.Stub.Header.Checksum}");
+ Console.WriteLine($" Initial IP value: {_executable.Stub.Header.InitialIPValue}");
+ Console.WriteLine($" Initial CS value: {_executable.Stub.Header.InitialCSValue}");
+ Console.WriteLine($" Relocation table address: {_executable.Stub.Header.RelocationTableAddr}");
+ Console.WriteLine($" Overlay number: {_executable.Stub.Header.OverlayNumber}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Extended Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Reserved words: {string.Join(", ", _executable.Stub.Header.Reserved1)}");
+ Console.WriteLine($" OEM identifier: {_executable.Stub.Header.OEMIdentifier}");
+ Console.WriteLine($" OEM information: {_executable.Stub.Header.OEMInformation}");
+ Console.WriteLine($" Reserved words: {string.Join(", ", _executable.Stub.Header.Reserved2)}");
+ Console.WriteLine($" New EXE header address: {_executable.Stub.Header.NewExeHeaderAddr}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Magic number: {BitConverter.ToString(_executable.Header.Magic).Replace("-", string.Empty)}");
+ Console.WriteLine($" Linker version: {_executable.Header.LinkerVersion}");
+ Console.WriteLine($" Linker revision: {_executable.Header.LinkerRevision}");
+ Console.WriteLine($" Entry table offset: {_executable.Header.EntryTableOffset}");
+ Console.WriteLine($" Entry table size: {_executable.Header.EntryTableSize}");
+ Console.WriteLine($" CRC checksum: {_executable.Header.CrcChecksum}");
+ Console.WriteLine($" Flag word: {_executable.Header.FlagWord}");
+ Console.WriteLine($" Automatic data segment number: {_executable.Header.AutomaticDataSegmentNumber}");
+ Console.WriteLine($" Initial heap allocation: {_executable.Header.InitialHeapAlloc}");
+ Console.WriteLine($" Initial stack allocation: {_executable.Header.InitialStackAlloc}");
+ Console.WriteLine($" Initial CS:IP setting: {_executable.Header.InitialCSIPSetting}");
+ Console.WriteLine($" Initial SS:SP setting: {_executable.Header.InitialSSSPSetting}");
+ Console.WriteLine($" File segment count: {_executable.Header.FileSegmentCount}");
+ Console.WriteLine($" Module reference table size: {_executable.Header.ModuleReferenceTableSize}");
+ Console.WriteLine($" Non-resident name table size: {_executable.Header.NonResidentNameTableSize}");
+ Console.WriteLine($" Segment table offset: {_executable.Header.SegmentTableOffset}");
+ Console.WriteLine($" Resource table offset: {_executable.Header.ResourceTableOffset}");
+ Console.WriteLine($" Resident name table offset: {_executable.Header.ResidentNameTableOffset}");
+ Console.WriteLine($" Module reference table offset: {_executable.Header.ModuleReferenceTableOffset}");
+ Console.WriteLine($" Imported names table offset: {_executable.Header.ImportedNamesTableOffset}");
+ Console.WriteLine($" Non-resident name table offset: {_executable.Header.NonResidentNamesTableOffset}");
+ Console.WriteLine($" Moveable entries count: {_executable.Header.MovableEntriesCount}");
+ Console.WriteLine($" Segment alignment shift count: {_executable.Header.SegmentAlignmentShiftCount}");
+ Console.WriteLine($" Resource entries count: {_executable.Header.ResourceEntriesCount}");
+ Console.WriteLine($" Target operating system: {_executable.Header.TargetOperatingSystem}");
+ Console.WriteLine($" Additional flags: {_executable.Header.AdditionalFlags}");
+ Console.WriteLine($" Return thunk offset: {_executable.Header.ReturnThunkOffset}");
+ Console.WriteLine($" Segment reference thunk offset: {_executable.Header.SegmentReferenceThunkOffset}");
+ Console.WriteLine($" Minimum code swap area size: {_executable.Header.MinCodeSwapAreaSize}");
+ Console.WriteLine($" Windows SDK revision: {_executable.Header.WindowsSDKRevision}");
+ Console.WriteLine($" Windows SDK version: {_executable.Header.WindowsSDKVersion}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Segment Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.FileSegmentCount == 0 || _executable.SegmentTable.Length == 0)
+ {
+ Console.WriteLine(" No segment table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.SegmentTable.Length; i++)
+ {
+ var entry = _executable.SegmentTable[i];
+ Console.WriteLine($" Segment Table Entry {i}");
+ Console.WriteLine($" Offset = {entry.Offset}");
+ Console.WriteLine($" Length = {entry.Length}");
+ Console.WriteLine($" Flag word = {entry.FlagWord}");
+ Console.WriteLine($" Minimum allocation size = {entry.MinimumAllocationSize}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Resource Table Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Alignment shift count: {_executable.ResourceTable.AlignmentShiftCount}");
+ if (_executable.Header.ResourceEntriesCount == 0 || _executable.ResourceTable.ResourceTypes.Length == 0)
+ {
+ Console.WriteLine(" No resource table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ResourceTable.ResourceTypes.Length; i++)
+ {
+ // TODO: If not integer type, print out name
+ var entry = _executable.ResourceTable.ResourceTypes[i];
+ Console.WriteLine($" Resource Table Entry {i}");
+ Console.WriteLine($" Type ID = {entry.TypeID} (Is Integer Type: {entry.IsIntegerType()})");
+ Console.WriteLine($" Resource count = {entry.ResourceCount}");
+ Console.WriteLine($" Reserved = {entry.Reserved}");
+ Console.WriteLine($" Resources = ");
+ if (entry.ResourceCount == 0 || entry.Resources.Length == 0)
+ {
+ Console.WriteLine(" No resource items");
+ }
+ else
+ {
+ for (int j = 0; j < entry.Resources.Length; j++)
+ {
+ // TODO: If not integer type, print out name
+ var resource = entry.Resources[j];
+ Console.WriteLine($" Resource Entry {i}");
+ Console.WriteLine($" Offset = {resource.Offset}");
+ Console.WriteLine($" Length = {resource.Length}");
+ Console.WriteLine($" Flag word = {resource.FlagWord}");
+ Console.WriteLine($" Resource ID = {resource.ResourceID} (Is Integer Type: {resource.IsIntegerType()})");
+ Console.WriteLine($" Reserved = {resource.Reserved}");
+ }
+ }
+ }
+ }
+
+ if (_executable.ResourceTable.TypeAndNameStrings.Count == 0)
+ {
+ Console.WriteLine(" No resource table type/name strings");
+ }
+ else
+ {
+ foreach (var typeAndNameString in _executable.ResourceTable.TypeAndNameStrings)
+ {
+ Console.WriteLine($" Resource Type/Name Offset {typeAndNameString.Key}");
+ Console.WriteLine($" Length = {typeAndNameString.Value.Length}");
+ Console.WriteLine($" Text = {Encoding.ASCII.GetString(typeAndNameString.Value.Text)}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Resident-Name Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.ResidentNameTableOffset == 0 || _executable.ResidentNameTable.Length == 0)
+ {
+ Console.WriteLine(" No resident-name table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ResidentNameTable.Length; i++)
+ {
+ var entry = _executable.ResidentNameTable[i];
+ Console.WriteLine($" Resident-Name Table Entry {i}");
+ Console.WriteLine($" Length = {entry.Length}");
+ Console.WriteLine($" Name string = {Encoding.ASCII.GetString(entry.NameString)}");
+ Console.WriteLine($" Ordinal number = {entry.OrdinalNumber}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Module-Reference Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.ModuleReferenceTableSize == 0 || _executable.ModuleReferenceTable.Length == 0)
+ {
+ Console.WriteLine(" No module-reference table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ModuleReferenceTable.Length; i++)
+ {
+ // TODO: Read the imported names table and print value here
+ var entry = _executable.ModuleReferenceTable[i];
+ Console.WriteLine($" Module-Reference Table Entry {i}");
+ Console.WriteLine($" Offset = {entry.Offset} (adjusted to be {entry.Offset + _executable.Stub.Header.NewExeHeaderAddr + _executable.Header.ImportedNamesTableOffset})");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Imported-Name Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.ImportedNamesTableOffset == 0 || _executable.ImportedNameTable.Count == 0)
+ {
+ Console.WriteLine(" No imported-name table items");
+ }
+ else
+ {
+ foreach (var entry in _executable.ImportedNameTable)
+ {
+ Console.WriteLine($" Imported-Name Table at Offset {entry.Key}");
+ Console.WriteLine($" Length = {entry.Value.Length}");
+ Console.WriteLine($" Name string = {Encoding.ASCII.GetString(entry.Value.NameString)}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Entry Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.EntryTableSize == 0 || _executable.EntryTable.Length == 0)
+ {
+ Console.WriteLine(" No entry table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.EntryTable.Length; i++)
+ {
+ var entry = _executable.EntryTable[i];
+ Console.WriteLine($" Entry Table Entry {i}");
+ Console.WriteLine($" Entry count = {entry.EntryCount}");
+ Console.WriteLine($" Segment indicator = {entry.SegmentIndicator} ({entry.GetEntryType()})");
+ switch (entry.GetEntryType())
+ {
+ case BurnOutSharp.Models.NewExecutable.SegmentEntryType.FixedSegment:
+ Console.WriteLine($" Flag word = {entry.FixedFlagWord}");
+ Console.WriteLine($" Offset = {entry.FixedOffset}");
+ break;
+ case BurnOutSharp.Models.NewExecutable.SegmentEntryType.MoveableSegment:
+ Console.WriteLine($" Flag word = {entry.MoveableFlagWord}");
+ Console.WriteLine($" Reserved = {entry.MoveableReserved}");
+ Console.WriteLine($" Segment number = {entry.MoveableSegmentNumber}");
+ Console.WriteLine($" Offset = {entry.MoveableOffset}");
+ break;
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Nonresident-Name Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.Header.NonResidentNameTableSize == 0 || _executable.NonResidentNameTable.Length == 0)
+ {
+ Console.WriteLine(" No nonresident-name table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.NonResidentNameTable.Length; i++)
+ {
+ var entry = _executable.NonResidentNameTable[i];
+ Console.WriteLine($" Nonresident-Name Table Entry {i}");
+ Console.WriteLine($" Length = {entry.Length}");
+ Console.WriteLine($" Name string = {Encoding.ASCII.GetString(entry.NameString)}");
+ Console.WriteLine($" Ordinal number = {entry.OrdinalNumber}");
+ }
+ }
+ Console.WriteLine();
+ }
}
}
\ No newline at end of file
diff --git a/BurnOutSharp.Wrappers/PortableExecutable.cs b/BurnOutSharp.Wrappers/PortableExecutable.cs
index 65ed4ac7..e9b52822 100644
--- a/BurnOutSharp.Wrappers/PortableExecutable.cs
+++ b/BurnOutSharp.Wrappers/PortableExecutable.cs
@@ -1,4 +1,9 @@
-using System.IO;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Xml;
+using static BurnOutSharp.Builder.Extensions;
namespace BurnOutSharp.Wrappers
{
@@ -358,5 +363,1429 @@ namespace BurnOutSharp.Wrappers
var wrapper = new PortableExecutable { _executable = executable };
return wrapper;
}
+
+ ///
+ /// Pretty print the New Executable information
+ ///
+ public void Print()
+ {
+ Console.WriteLine("Portable Executable Information:");
+ Console.WriteLine("-------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" MS-DOS Stub Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine();
+
+ Console.WriteLine(" Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Magic number: {BitConverter.ToString(_executable.Stub.Header.Magic).Replace("-", string.Empty)}");
+ Console.WriteLine($" Last page bytes: {_executable.Stub.Header.LastPageBytes}");
+ Console.WriteLine($" Pages: {_executable.Stub.Header.Pages}");
+ Console.WriteLine($" Relocation items: {_executable.Stub.Header.RelocationItems}");
+ Console.WriteLine($" Header paragraph size: {_executable.Stub.Header.HeaderParagraphSize}");
+ Console.WriteLine($" Minimum extra paragraphs: {_executable.Stub.Header.MinimumExtraParagraphs}");
+ Console.WriteLine($" Maximum extra paragraphs: {_executable.Stub.Header.MaximumExtraParagraphs}");
+ Console.WriteLine($" Initial SS value: {_executable.Stub.Header.InitialSSValue}");
+ Console.WriteLine($" Initial SP value: {_executable.Stub.Header.InitialSPValue}");
+ Console.WriteLine($" Checksum: {_executable.Stub.Header.Checksum}");
+ Console.WriteLine($" Initial IP value: {_executable.Stub.Header.InitialIPValue}");
+ Console.WriteLine($" Initial CS value: {_executable.Stub.Header.InitialCSValue}");
+ Console.WriteLine($" Relocation table address: {_executable.Stub.Header.RelocationTableAddr}");
+ Console.WriteLine($" Overlay number: {_executable.Stub.Header.OverlayNumber}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Extended Header Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Reserved words: {string.Join(", ", _executable.Stub.Header.Reserved1)}");
+ Console.WriteLine($" OEM identifier: {_executable.Stub.Header.OEMIdentifier}");
+ Console.WriteLine($" OEM information: {_executable.Stub.Header.OEMInformation}");
+ Console.WriteLine($" Reserved words: {string.Join(", ", _executable.Stub.Header.Reserved2)}");
+ Console.WriteLine($" New EXE header address: {_executable.Stub.Header.NewExeHeaderAddr}");
+ 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 == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Base of data: {_executable.OptionalHeader.BaseOfData}");
+
+ if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Image base: {_executable.OptionalHeader.ImageBase_PE32}");
+ else if (_executable.OptionalHeader.Magic == 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 == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of stack reserve: {_executable.OptionalHeader.SizeOfStackReserve_PE32}");
+ else if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of stack reserve: {_executable.OptionalHeader.SizeOfStackReserve_PE32Plus}");
+ if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of stack commit: {_executable.OptionalHeader.SizeOfStackCommit_PE32}");
+ else if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of stack commit: {_executable.OptionalHeader.SizeOfStackCommit_PE32Plus}");
+ if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of heap reserve: {_executable.OptionalHeader.SizeOfHeapReserve_PE32}");
+ else if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32Plus)
+ Console.WriteLine($" Size of heap reserve: {_executable.OptionalHeader.SizeOfHeapReserve_PE32Plus}");
+ if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Size of heap commit: {_executable.OptionalHeader.SizeOfHeapCommit_PE32}");
+ else if (_executable.OptionalHeader.Magic == 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();
+
+ Console.WriteLine(" Section Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.COFFFileHeader.NumberOfSections == 0 || _executable.SectionTable.Length == 0)
+ {
+ Console.WriteLine(" No section table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.SectionTable.Length; i++)
+ {
+ var entry = _executable.SectionTable[i];
+ Console.WriteLine($" Section Table Entry {i}");
+ Console.WriteLine($" Name = {Encoding.UTF8.GetString(entry.Name)}");
+ Console.WriteLine($" Virtual size = {entry.VirtualSize}");
+ Console.WriteLine($" Virtual address = {entry.VirtualAddress}");
+ Console.WriteLine($" Size of raw data = {entry.SizeOfRawData}");
+ Console.WriteLine($" Pointer to raw data = {entry.PointerToRawData}");
+ Console.WriteLine($" Pointer to relocations = {entry.PointerToRelocations}");
+ Console.WriteLine($" Pointer to linenumbers = {entry.PointerToLinenumbers}");
+ Console.WriteLine($" Number of relocations = {entry.NumberOfRelocations}");
+ Console.WriteLine($" Number of linenumbers = {entry.NumberOfLinenumbers}");
+ Console.WriteLine($" Characteristics = {entry.Characteristics}");
+ // TODO: Add COFFRelocations
+ // TODO: Add COFFLineNumbers
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" COFF Symbol Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.COFFFileHeader.PointerToSymbolTable == 0
+ || _executable.COFFFileHeader.NumberOfSymbols == 0
+ || _executable.COFFSymbolTable.Length == 0)
+ {
+ Console.WriteLine(" No COFF symbol table items");
+ }
+ else
+ {
+ int auxSymbolsRemaining = 0;
+ int currentSymbolType = 0;
+
+ for (int i = 0; i < _executable.COFFSymbolTable.Length; i++)
+ {
+ var entry = _executable.COFFSymbolTable[i];
+ Console.WriteLine($" COFF Symbol Table Entry {i} (Subtype {currentSymbolType})");
+ if (currentSymbolType == 0)
+ {
+ if (entry.ShortName != null)
+ {
+ Console.WriteLine($" Short name = {Encoding.UTF8.GetString(entry.ShortName)}");
+ }
+ else
+ {
+ Console.WriteLine($" Zeroes = {entry.Zeroes}");
+ Console.WriteLine($" Offset = {entry.Offset}");
+ }
+ Console.WriteLine($" Value = {entry.Value}");
+ Console.WriteLine($" Section number = {entry.SectionNumber}");
+ Console.WriteLine($" Symbol type = {entry.SymbolType}");
+ Console.WriteLine($" Storage class = {entry.StorageClass}");
+ Console.WriteLine($" Number of aux symbols = {entry.NumberOfAuxSymbols}");
+
+ auxSymbolsRemaining = entry.NumberOfAuxSymbols;
+ if (auxSymbolsRemaining == 0)
+ continue;
+
+ if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_EXTERNAL
+ && entry.SymbolType == Models.PortableExecutable.SymbolType.IMAGE_SYM_TYPE_FUNC
+ && entry.SectionNumber > 0)
+ {
+ currentSymbolType = 1;
+ }
+ else if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_FUNCTION
+ && entry.ShortName != null
+ && ((entry.ShortName[0] == 0x2E && entry.ShortName[1] == 0x62 && entry.ShortName[2] == 0x66) // .bf
+ || (entry.ShortName[0] == 0x2E && entry.ShortName[1] == 0x65 && entry.ShortName[2] == 0x66))) // .ef
+ {
+ currentSymbolType = 2;
+ }
+ else if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_EXTERNAL
+ && entry.SectionNumber == (ushort)Models.PortableExecutable.SectionNumber.IMAGE_SYM_UNDEFINED
+ && entry.Value == 0)
+ {
+ currentSymbolType = 3;
+ }
+ else if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_FILE)
+ {
+ // TODO: Symbol name should be ".file"
+ currentSymbolType = 4;
+ }
+ else if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_STATIC)
+ {
+ // TODO: Should have the name of a section (like ".text")
+ currentSymbolType = 5;
+ }
+ else if (entry.StorageClass == Models.PortableExecutable.StorageClass.IMAGE_SYM_CLASS_CLR_TOKEN)
+ {
+ currentSymbolType = 6;
+ }
+ }
+ else if (currentSymbolType == 1)
+ {
+ Console.WriteLine($" Tag index = {entry.AuxFormat1TagIndex}");
+ Console.WriteLine($" Total size = {entry.AuxFormat1TotalSize}");
+ Console.WriteLine($" Pointer to linenumber = {entry.AuxFormat1PointerToLinenumber}");
+ Console.WriteLine($" Pointer to next function = {entry.AuxFormat1PointerToNextFunction}");
+ Console.WriteLine($" Unused = {entry.AuxFormat1Unused}");
+ auxSymbolsRemaining--;
+ }
+ else if (currentSymbolType == 2)
+ {
+ Console.WriteLine($" Unused = {entry.AuxFormat2Unused1}");
+ Console.WriteLine($" Linenumber = {entry.AuxFormat2Linenumber}");
+ Console.WriteLine($" Unused = {entry.AuxFormat2Unused2}");
+ Console.WriteLine($" Pointer to next function = {entry.AuxFormat2PointerToNextFunction}");
+ Console.WriteLine($" Unused = {entry.AuxFormat2Unused3}");
+ auxSymbolsRemaining--;
+ }
+ else if (currentSymbolType == 3)
+ {
+ Console.WriteLine($" Tag index = {entry.AuxFormat3TagIndex}");
+ Console.WriteLine($" Characteristics = {entry.AuxFormat3Characteristics}");
+ Console.WriteLine($" Unused = {BitConverter.ToString(entry.AuxFormat3Unused).Replace("-", string.Empty)}");
+ auxSymbolsRemaining--;
+ }
+ else if (currentSymbolType == 4)
+ {
+ Console.WriteLine($" File name = {Encoding.ASCII.GetString(entry.AuxFormat4FileName)}");
+ auxSymbolsRemaining--;
+ }
+ else if (currentSymbolType == 5)
+ {
+ Console.WriteLine($" Length = {entry.AuxFormat5Length}");
+ Console.WriteLine($" Number of relocations = {entry.AuxFormat5NumberOfRelocations}");
+ Console.WriteLine($" Number of linenumbers = {entry.AuxFormat5NumberOfLinenumbers}");
+ Console.WriteLine($" Checksum = {entry.AuxFormat5CheckSum}");
+ Console.WriteLine($" Number = {entry.AuxFormat5Number}");
+ Console.WriteLine($" Selection = {entry.AuxFormat5Selection}");
+ Console.WriteLine($" Unused = {BitConverter.ToString(entry.AuxFormat5Unused).Replace("-", string.Empty)}");
+ auxSymbolsRemaining--;
+ }
+ else if (currentSymbolType == 6)
+ {
+ Console.WriteLine($" Aux type = {entry.AuxFormat6AuxType}");
+ Console.WriteLine($" Reserved = {entry.AuxFormat6Reserved1}");
+ Console.WriteLine($" Symbol table index = {entry.AuxFormat6SymbolTableIndex}");
+ Console.WriteLine($" Reserved = {BitConverter.ToString(entry.AuxFormat6Reserved2).Replace("-", string.Empty)}");
+ auxSymbolsRemaining--;
+ }
+
+ // If we hit the last aux symbol, go back to normal format
+ if (auxSymbolsRemaining == 0)
+ currentSymbolType = 0;
+ }
+
+ Console.WriteLine();
+ Console.WriteLine(" COFF String Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.COFFStringTable == null
+ || _executable.COFFStringTable.Strings == null
+ || _executable.COFFStringTable.Strings.Length == 0)
+ {
+ Console.WriteLine(" No COFF string table items");
+ }
+ else
+ {
+ Console.WriteLine($" Total size: {_executable.COFFStringTable.TotalSize}");
+ for (int i = 0; i < _executable.COFFStringTable.Strings.Length; i++)
+ {
+ string entry = _executable.COFFStringTable.Strings[i];
+ Console.WriteLine($" COFF String Table Entry {i})");
+ Console.WriteLine($" Value = {entry}");
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Attribute Certificate Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.CertificateTable == null
+ || _executable.OptionalHeader.CertificateTable.VirtualAddress == 0
+ || _executable.AttributeCertificateTable.Length == 0)
+ {
+ Console.WriteLine(" No attribute certificate table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.AttributeCertificateTable.Length; i++)
+ {
+ var entry = _executable.AttributeCertificateTable[i];
+ Console.WriteLine($" Attribute Certificate Table Entry {i}");
+ Console.WriteLine($" Length = {entry.Length}");
+ Console.WriteLine($" Revision = {entry.Revision}");
+ Console.WriteLine($" Certificate type = {entry.CertificateType}");
+ Console.WriteLine();
+ if (entry.CertificateType == Models.PortableExecutable.WindowsCertificateType.WIN_CERT_TYPE_PKCS_SIGNED_DATA)
+ {
+ Console.WriteLine(" Certificate Data [Formatted]");
+ Console.WriteLine(" -------------------------");
+ var topLevelValues = Builder.AbstractSyntaxNotationOne.Parse(entry.Certificate, pointer: 0);
+ if (topLevelValues == null)
+ {
+ Console.WriteLine(" INVALID DATA FOUND");
+ Console.WriteLine($" {BitConverter.ToString(entry.Certificate).Replace("-", string.Empty)}");
+ }
+ else
+ {
+ foreach (Builder.ASN1TypeLengthValue tlv in topLevelValues)
+ {
+ string tlvString = tlv.Format(paddingLevel: 4);
+ Console.WriteLine(tlvString);
+ }
+ }
+ }
+ else
+ {
+ Console.WriteLine($" Certificate Data [Binary]");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" {BitConverter.ToString(entry.Certificate).Replace("-", string.Empty)}");
+ }
+
+ Console.WriteLine();
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Delay-Load Directory Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.DelayImportDescriptor == null
+ || _executable.OptionalHeader.DelayImportDescriptor.VirtualAddress == 0
+ || _executable.DelayLoadDirectoryTable == null)
+ {
+ Console.WriteLine(" No delay-load directory table items");
+ }
+ else
+ {
+ Console.WriteLine($" Attributes = {_executable.DelayLoadDirectoryTable.Attributes}");
+ Console.WriteLine($" Name RVA = {_executable.DelayLoadDirectoryTable.Name}");
+ Console.WriteLine($" Module handle = {_executable.DelayLoadDirectoryTable.ModuleHandle}");
+ Console.WriteLine($" Delay import address table RVA = {_executable.DelayLoadDirectoryTable.DelayImportAddressTable}");
+ Console.WriteLine($" Delay import name table RVA = {_executable.DelayLoadDirectoryTable.DelayImportNameTable}");
+ Console.WriteLine($" Bound delay import table RVA = {_executable.DelayLoadDirectoryTable.BoundDelayImportTable}");
+ Console.WriteLine($" Unload delay import table RVA = {_executable.DelayLoadDirectoryTable.UnloadDelayImportTable}");
+ Console.WriteLine($" Timestamp = {_executable.DelayLoadDirectoryTable.TimeStamp}");
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Debug Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.Debug == null
+ || _executable.OptionalHeader.Debug.VirtualAddress == 0
+ || _executable.DebugTable == null)
+ {
+ Console.WriteLine(" No debug table items");
+ }
+ else
+ {
+ // TODO: If more sections added, model this after the Export Table
+ for (int i = 0; i < _executable.DebugTable.DebugDirectoryTable.Length; i++)
+ {
+ var debugDirectoryEntry = _executable.DebugTable.DebugDirectoryTable[i];
+ Console.WriteLine($" Debug Directory Table Entry {i}");
+ Console.WriteLine($" Characteristics: {debugDirectoryEntry.Characteristics}");
+ Console.WriteLine($" Time/Date stamp: {debugDirectoryEntry.TimeDateStamp}");
+ Console.WriteLine($" Major version: {debugDirectoryEntry.MajorVersion}");
+ Console.WriteLine($" Minor version: {debugDirectoryEntry.MinorVersion}");
+ Console.WriteLine($" Debug type: {debugDirectoryEntry.DebugType}");
+ Console.WriteLine($" Size of data: {debugDirectoryEntry.SizeOfData}");
+ Console.WriteLine($" Address of raw data: {debugDirectoryEntry.AddressOfRawData}");
+ Console.WriteLine($" Pointer to raw data: {debugDirectoryEntry.PointerToRawData}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Export Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.ExportTable == null
+ || _executable.OptionalHeader.ExportTable.VirtualAddress == 0
+ || _executable.ExportTable == null)
+ {
+ Console.WriteLine(" No export table items");
+ }
+ else
+ {
+ Console.WriteLine();
+ Console.WriteLine(" Export Directory Table Information:");
+ Console.WriteLine(" -------------------------");
+ Console.WriteLine($" Export flags: {_executable.ExportTable.ExportDirectoryTable.ExportFlags}");
+ Console.WriteLine($" Time/Date stamp: {_executable.ExportTable.ExportDirectoryTable.TimeDateStamp}");
+ Console.WriteLine($" Major version: {_executable.ExportTable.ExportDirectoryTable.MajorVersion}");
+ Console.WriteLine($" Minor version: {_executable.ExportTable.ExportDirectoryTable.MinorVersion}");
+ Console.WriteLine($" Name RVA: {_executable.ExportTable.ExportDirectoryTable.NameRVA}");
+ Console.WriteLine($" Name: {_executable.ExportTable.ExportDirectoryTable.Name}");
+ Console.WriteLine($" Ordinal base: {_executable.ExportTable.ExportDirectoryTable.OrdinalBase}");
+ Console.WriteLine($" Address table entries: {_executable.ExportTable.ExportDirectoryTable.AddressTableEntries}");
+ Console.WriteLine($" Number of name pointers: {_executable.ExportTable.ExportDirectoryTable.NumberOfNamePointers}");
+ Console.WriteLine($" Export address table RVA: {_executable.ExportTable.ExportDirectoryTable.ExportAddressTableRVA}");
+ Console.WriteLine($" Name pointer table RVA: {_executable.ExportTable.ExportDirectoryTable.NamePointerRVA}");
+ Console.WriteLine($" Ordinal table RVA: {_executable.ExportTable.ExportDirectoryTable.OrdinalTableRVA}");
+ Console.WriteLine();
+
+ Console.WriteLine(" Export Address Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ExportTable.ExportAddressTable == null || _executable.ExportTable.ExportAddressTable.Length == 0)
+ {
+ Console.WriteLine(" No export address table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ExportTable.ExportAddressTable.Length; i++)
+ {
+ var exportAddressTableEntry = _executable.ExportTable.ExportAddressTable[i];
+ Console.WriteLine($" Export Address Table Entry {i}");
+ Console.WriteLine($" Export RVA / Forwarder RVA: {exportAddressTableEntry.ExportRVA}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Name Pointer Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ExportTable.NamePointerTable?.Pointers == null || _executable.ExportTable.NamePointerTable.Pointers.Length == 0)
+ {
+ Console.WriteLine(" No name pointer table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ExportTable.NamePointerTable.Pointers.Length; i++)
+ {
+ var namePointerTableEntry = _executable.ExportTable.NamePointerTable.Pointers[i];
+ Console.WriteLine($" Name Pointer Table Entry {i}");
+ Console.WriteLine($" Pointer: {namePointerTableEntry}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Ordinal Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ExportTable.OrdinalTable?.Indexes == null || _executable.ExportTable.OrdinalTable.Indexes.Length == 0)
+ {
+ Console.WriteLine(" No ordinal table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ExportTable.OrdinalTable.Indexes.Length; i++)
+ {
+ var ordinalTableEntry = _executable.ExportTable.OrdinalTable.Indexes[i];
+ Console.WriteLine($" Ordinal Table Entry {i}");
+ Console.WriteLine($" Index: {ordinalTableEntry}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Export Name Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ExportTable.ExportNameTable?.Strings == null || _executable.ExportTable.ExportNameTable.Strings.Length == 0)
+ {
+ Console.WriteLine(" No export name table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ExportTable.ExportNameTable.Strings.Length; i++)
+ {
+ var exportNameTableEntry = _executable.ExportTable.ExportNameTable.Strings[i];
+ Console.WriteLine($" Export Name Table Entry {i}");
+ Console.WriteLine($" String: {exportNameTableEntry}");
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Import Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.ImportTable == null
+ || _executable.OptionalHeader.ImportTable.VirtualAddress == 0
+ || _executable.ImportTable == null)
+ {
+ Console.WriteLine(" No import table items");
+ }
+ else
+ {
+ Console.WriteLine();
+ Console.WriteLine(" Import Directory Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ImportTable.ImportDirectoryTable == null || _executable.ImportTable.ImportDirectoryTable.Length == 0)
+ {
+ Console.WriteLine(" No import directory table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ImportTable.ImportDirectoryTable.Length; i++)
+ {
+ var importDirectoryTableEntry = _executable.ImportTable.ImportDirectoryTable[i];
+ Console.WriteLine($" Import Directory Table Entry {i}");
+ Console.WriteLine($" Import lookup table RVA: {importDirectoryTableEntry.ImportLookupTableRVA}");
+ Console.WriteLine($" Time/Date stamp: {importDirectoryTableEntry.TimeDateStamp}");
+ Console.WriteLine($" Forwarder chain: {importDirectoryTableEntry.ForwarderChain}");
+ Console.WriteLine($" Name RVA: {importDirectoryTableEntry.NameRVA}");
+ Console.WriteLine($" Name: {importDirectoryTableEntry.Name}");
+ Console.WriteLine($" Import address table RVA: {importDirectoryTableEntry.ImportAddressTableRVA}");
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Import Lookup Tables Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ImportTable.ImportLookupTables == null || _executable.ImportTable.ImportLookupTables.Count == 0)
+ {
+ Console.WriteLine(" No import lookup tables");
+ }
+ else
+ {
+ foreach (var kvp in _executable.ImportTable.ImportLookupTables)
+ {
+ int index = kvp.Key;
+ var importLookupTable = kvp.Value;
+
+ Console.WriteLine();
+ Console.WriteLine($" Import Lookup Table {index} Information:");
+ Console.WriteLine(" -------------------------");
+ if (importLookupTable == null || importLookupTable.Length == 0)
+ {
+ Console.WriteLine(" No import lookup table items");
+ }
+ else
+ {
+ for (int i = 0; i < importLookupTable.Length; i++)
+ {
+ var importLookupTableEntry = importLookupTable[i];
+ Console.WriteLine($" Import Lookup Table {index} Entry {i}");
+ Console.WriteLine($" Ordinal/Name flag: {importLookupTableEntry.OrdinalNameFlag}");
+ if (importLookupTableEntry.OrdinalNameFlag)
+ Console.WriteLine($" Ordinal number: {importLookupTableEntry.OrdinalNumber}");
+ else
+ Console.WriteLine($" Hint/Name table RVA: {importLookupTableEntry.HintNameTableRVA}");
+ }
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Import Address Tables Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ImportTable.ImportAddressTables == null || _executable.ImportTable.ImportAddressTables.Count == 0)
+ {
+ Console.WriteLine(" No import address tables");
+ }
+ else
+ {
+ foreach (var kvp in _executable.ImportTable.ImportAddressTables)
+ {
+ int index = kvp.Key;
+ var importAddressTable = kvp.Value;
+
+ Console.WriteLine();
+ Console.WriteLine($" Import Address Table {index} Information:");
+ Console.WriteLine(" -------------------------");
+ if (importAddressTable == null || importAddressTable.Length == 0)
+ {
+ Console.WriteLine(" No import address table items");
+ }
+ else
+ {
+ for (int i = 0; i < importAddressTable.Length; i++)
+ {
+ var importLookupTableEntry = importAddressTable[i];
+ Console.WriteLine($" Import Address Table {index} Entry {i}");
+ if (_executable.OptionalHeader.Magic == Models.PortableExecutable.OptionalHeaderMagicNumber.PE32)
+ Console.WriteLine($" Address: {importLookupTableEntry.Address_PE32}");
+ else
+ Console.WriteLine($" Address: {importLookupTableEntry.Address_PE32Plus}");
+ }
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Hint/Name Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.ImportTable.HintNameTable == null || _executable.ImportTable.HintNameTable.Length == 0)
+ {
+ Console.WriteLine(" No hint/name table items");
+ }
+ else
+ {
+ for (int i = 0; i < _executable.ImportTable.HintNameTable.Length; i++)
+ {
+ var hintNameTableEntry = _executable.ImportTable.HintNameTable[i];
+ Console.WriteLine($" Hint/Name Table Entry {i}");
+ Console.WriteLine($" Hint: {hintNameTableEntry.Hint}");
+ Console.WriteLine($" Name: {hintNameTableEntry.Name}");
+ }
+ }
+ }
+ Console.WriteLine();
+
+ Console.WriteLine(" Resource Directory Table Information:");
+ Console.WriteLine(" -------------------------");
+ if (_executable.OptionalHeader?.ResourceTable == null
+ || _executable.OptionalHeader.ResourceTable.VirtualAddress == 0
+ || _executable.ResourceDirectoryTable == null)
+ {
+ Console.WriteLine(" No resource directory table items");
+ }
+ else
+ {
+ PrintResourceDirectoryTable(_executable.ResourceDirectoryTable, level: 0, types: new List