Get NE import table.

This commit is contained in:
2018-03-02 20:00:33 +00:00
parent 6ff9daf956
commit a8b4e2b9da
3 changed files with 62 additions and 16 deletions

View File

@@ -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:");

View File

@@ -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();
}
}

View File

@@ -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;
/// <summary>
/// Initializes a new instance of the <see cref="T:libexeinfo.NE" /> 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);