From 834792bc2dcc9a2375f85d3d756477a02a81c71f Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 9 Nov 2022 14:18:59 -0800 Subject: [PATCH] Print NE string table resources --- ExecutableTest/Program.cs | 111 +++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/ExecutableTest/Program.cs b/ExecutableTest/Program.cs index b9cd9766..9df1b1b9 100644 --- a/ExecutableTest/Program.cs +++ b/ExecutableTest/Program.cs @@ -859,8 +859,115 @@ namespace ExecutableTest Console.WriteLine($"{padding}Reserved: {entry.Reserved}"); // TODO: Print out per-type data - //Console.WriteLine($"{padding}Data: {BitConverter.ToString(entry.Data).Replace("-", string.Empty)}"); - //Console.WriteLine($"{padding}Data: {Encoding.Unicode.GetString(entry.Data)}"); + if (types != null && types.Count > 0 && types[0] is uint resourceType) + { + int offset = 0; + switch ((BurnOutSharp.Models.PortableExecutable.ResourceType)resourceType) + { + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_CURSOR: + Console.WriteLine($"{padding}Hardware-dependent cursor resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_BITMAP: + Console.WriteLine($"{padding}Bitmap resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_ICON: + Console.WriteLine($"{padding}Hardware-dependent icon resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_MENU: + Console.WriteLine($"{padding}Menu resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_DIALOG: + Console.WriteLine($"{padding}Dialog box found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_STRING: + int stringIndex = 0; + Encoding stringEncoding = (entry.Codepage != 0 ? Encoding.GetEncoding((int)entry.Codepage) : Encoding.Unicode); + while (offset < entry.Data.Length) + { + ushort stringLength = entry.Data.ReadUInt16(ref offset); + if (stringLength == 0) + { + Console.WriteLine($"{padding}String entry {stringIndex++} ({stringLength}): [EMPTY]"); + } + else + { + string fullEncodedString = stringEncoding.GetString(entry.Data, offset, entry.Data.Length - offset); + string stringValue = fullEncodedString.Substring(0, stringLength); + offset += stringEncoding.GetByteCount(stringValue); + stringValue = stringValue.Replace("\n", "\\n").Replace("\r", "\\r"); + Console.WriteLine($"{padding}String entry {stringIndex++} ({stringLength}): {stringValue}"); + } + } + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_FONTDIR: + Console.WriteLine($"{padding}Font directory resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_FONT: + Console.WriteLine($"{padding}Font resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_ACCELERATOR: + var acceleratorTable = entry.Data.AsAcceleratorTableResource(ref offset); + if (acceleratorTable != null) + { + for (int i = 0; i < acceleratorTable.Length; i++) + { + var acceleratorTableEntry = acceleratorTable[i]; + Console.WriteLine($"{padding}Flags: {acceleratorTableEntry.Flags}"); + Console.WriteLine($"{padding}Ansi: {acceleratorTableEntry.Ansi}"); + Console.WriteLine($"{padding}Id: {acceleratorTableEntry.Id}"); + Console.WriteLine($"{padding}Padding: {acceleratorTableEntry.Padding}"); + } + } + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_RCDATA: + Console.WriteLine($"{padding}Application-defined resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_MESSAGETABLE: + Console.WriteLine($"{padding}Message-table entry found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_GROUP_CURSOR: + Console.WriteLine($"{padding}Hardware-independent cursor resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_GROUP_ICON: + Console.WriteLine($"{padding}Hardware-independent icon resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_VERSION: + Console.WriteLine($"{padding}Version resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_DLGINCLUDE: + Console.WriteLine($"{padding}External header resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_PLUGPLAY: + Console.WriteLine($"{padding}Plug and Play resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_VXD: + Console.WriteLine($"{padding}VXD found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_ANICURSOR: + Console.WriteLine($"{padding}Animated cursor found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_ANIICON: + Console.WriteLine($"{padding}Animated icon found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_HTML: + Console.WriteLine($"{padding}HTML resource found, not parsed yet"); + break; + case BurnOutSharp.Models.PortableExecutable.ResourceType.RT_MANIFEST: + Console.WriteLine($"{padding}Side-by-Side Assembly Manifest found, not parsed yet"); + break; + default: + Console.WriteLine($"{padding}Type {(BurnOutSharp.Models.PortableExecutable.ResourceType)resourceType} found, not parsed yet"); + //Console.WriteLine($"{padding}Data: {BitConverter.ToString(entry.Data).Replace("-", string.Empty)}"); + //Console.WriteLine($"{padding}Data: {Encoding.Unicode.GetString(entry.Data)}"); + break; + } + } + else if (types != null && types.Count > 0 && types[0] is string resourceString) + { + Console.WriteLine($"{padding}Custom data type: {resourceString}"); + //Console.WriteLine($"{padding}Data: {BitConverter.ToString(entry.Data).Replace("-", string.Empty)}"); + //Console.WriteLine($"{padding}Data: {Encoding.Unicode.GetString(entry.Data)}"); + } Console.WriteLine(); }