mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Get NE import table.
This commit is contained in:
@@ -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())
|
if(neExe.Strings != null && neExe.Strings.Any())
|
||||||
{
|
{
|
||||||
Console.WriteLine("\tStrings:");
|
Console.WriteLine("\tStrings:");
|
||||||
|
|||||||
@@ -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();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using Claunia.Encoding;
|
||||||
|
|
||||||
namespace libexeinfo
|
namespace libexeinfo
|
||||||
{
|
{
|
||||||
@@ -48,6 +49,7 @@ namespace libexeinfo
|
|||||||
SegmentEntry[] segments;
|
SegmentEntry[] segments;
|
||||||
string ModuleName;
|
string ModuleName;
|
||||||
string ModuleDescription;
|
string ModuleDescription;
|
||||||
|
string[] ImportedNames;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="T:libexeinfo.NE" /> class.
|
/// Initializes a new instance of the <see cref="T:libexeinfo.NE" /> class.
|
||||||
@@ -223,6 +225,44 @@ namespace libexeinfo
|
|||||||
|
|
||||||
resourceUpperLimit = ushort.MaxValue;
|
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 &&
|
if(Header.entry_table_offset >= Header.resident_names_offset &&
|
||||||
Header.entry_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.entry_table_offset;
|
Header.entry_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.entry_table_offset;
|
||||||
if(Header.segment_table_offset >= Header.resident_names_offset &&
|
if(Header.segment_table_offset >= Header.resident_names_offset &&
|
||||||
@@ -236,7 +276,7 @@ namespace libexeinfo
|
|||||||
if(Header.imported_names_offset >= Header.resident_names_offset &&
|
if(Header.imported_names_offset >= Header.resident_names_offset &&
|
||||||
Header.imported_names_offset <= resourceUpperLimit) resourceUpperLimit = Header.imported_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,
|
ResidentNames = GetResidentStrings(BaseStream, BaseExecutable.Header.new_offset,
|
||||||
Header.resident_names_offset, resourceUpperLimit);
|
Header.resident_names_offset, resourceUpperLimit);
|
||||||
|
|||||||
Reference in New Issue
Block a user