From a8b4e2b9da9ee0402d19a1108586fb98350bee11 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Fri, 2 Mar 2018 20:00:33 +0000 Subject: [PATCH] Get NE import table. --- exeinfo/Program.cs | 14 -------------- libexeinfo/NE/Info.cs | 20 ++++++++++++++++++++ libexeinfo/NE/NE.cs | 44 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 16 deletions(-) diff --git a/exeinfo/Program.cs b/exeinfo/Program.cs index c171167..bcb5db3 100644 --- a/exeinfo/Program.cs +++ b/exeinfo/Program.cs @@ -108,20 +108,6 @@ namespace exeinfo } } - if(((NE)neExe).ResidentNames != null) - { - Console.WriteLine("\tResident names:"); - foreach(NE.ResidentName name in ((NE)neExe).ResidentNames) - Console.WriteLine("\t\t{0} at index {1}", name.name, name.entryTableIndex); - } - - if(((NE)neExe).NonResidentNames != null) - { - Console.WriteLine("\tNon-resident names:"); - foreach(NE.ResidentName name in ((NE)neExe).NonResidentNames) - Console.WriteLine("\t\t{0} at index {1}", name.name, name.entryTableIndex); - } - if(neExe.Strings != null && neExe.Strings.Any()) { Console.WriteLine("\tStrings:"); diff --git a/libexeinfo/NE/Info.cs b/libexeinfo/NE/Info.cs index d0ec662..ceee4de 100644 --- a/libexeinfo/NE/Info.cs +++ b/libexeinfo/NE/Info.cs @@ -243,6 +243,26 @@ namespace libexeinfo } } + if(ImportedNames != null) + { + sb.AppendLine("\tImported names:"); + foreach(string name in ImportedNames) sb.AppendFormat("\t\t{0}", name).AppendLine(); + } + + if(ResidentNames != null) + { + sb.AppendLine("\tResident names:"); + foreach(NE.ResidentName name in ResidentNames) + sb.AppendFormat("\t\t{0} at index {1}", name.name, name.entryTableIndex).AppendLine(); + } + + if(NonResidentNames != null) + { + sb.AppendLine("\tNon-resident names:"); + foreach(NE.ResidentName name in NonResidentNames) + sb.AppendFormat("\t\t{0} at index {1}", name.name, name.entryTableIndex).AppendLine(); + } + return sb.ToString(); } } diff --git a/libexeinfo/NE/NE.cs b/libexeinfo/NE/NE.cs index 1950ca7..a176627 100644 --- a/libexeinfo/NE/NE.cs +++ b/libexeinfo/NE/NE.cs @@ -28,6 +28,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; +using Claunia.Encoding; namespace libexeinfo { @@ -48,6 +49,7 @@ namespace libexeinfo SegmentEntry[] segments; string ModuleName; string ModuleDescription; + string[] ImportedNames; /// /// Initializes a new instance of the class. @@ -220,7 +222,45 @@ namespace libexeinfo resourceUpperLimit); Versions = GetVersions().ToArray(); } - + + resourceUpperLimit = ushort.MaxValue; + + if(Header.entry_table_offset >= Header.module_reference_offset && + Header.entry_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.entry_table_offset; + if(Header.segment_table_offset >= Header.module_reference_offset && + Header.segment_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.segment_table_offset; + if(Header.resource_table_offset >= Header.module_reference_offset && + Header.resource_table_offset <= resourceUpperLimit) + resourceUpperLimit = Header.resource_table_offset; + if(Header.nonresident_names_offset >= Header.module_reference_offset && + Header.nonresident_names_offset <= resourceUpperLimit) + resourceUpperLimit = (ushort)Header.nonresident_names_offset; + if(Header.imported_names_offset >= Header.module_reference_offset && + Header.imported_names_offset <= resourceUpperLimit) resourceUpperLimit = Header.imported_names_offset; + + if(Header.module_reference_offset < resourceUpperLimit && Header.module_reference_offset != 0 && Header.reference_count > 0) + { + short[] referenceOffsets = new short[Header.reference_count]; + buffer = new byte[2]; + BaseStream.Position = Header.module_reference_offset + BaseExecutable.Header.new_offset; + for(int i = 0; i < Header.reference_count; i++) + { + BaseStream.Read(buffer, 0, 2); + referenceOffsets[i] = BitConverter.ToInt16(buffer, 0); + } + + ImportedNames = new string[Header.reference_count]; + for(int i = 0; i < Header.reference_count; i++) + { + BaseStream.Position = Header.imported_names_offset + BaseExecutable.Header.new_offset + + referenceOffsets[i]; + int len = BaseStream.ReadByte(); + buffer = new byte[len]; + BaseStream.Read(buffer, 0, len); + ImportedNames[i] = Encoding.ASCII.GetString(buffer); + } + } + resourceUpperLimit = ushort.MaxValue; if(Header.entry_table_offset >= Header.resident_names_offset && @@ -236,7 +276,7 @@ namespace libexeinfo if(Header.imported_names_offset >= Header.resident_names_offset && Header.imported_names_offset <= resourceUpperLimit) resourceUpperLimit = Header.imported_names_offset; - if(Header.resource_table_offset < resourceUpperLimit && Header.resource_table_offset != 0) + if(Header.resident_names_offset < resourceUpperLimit && Header.resident_names_offset != 0) { ResidentNames = GetResidentStrings(BaseStream, BaseExecutable.Header.new_offset, Header.resident_names_offset, resourceUpperLimit);