Correct NE when resource entries are set to 0 but there are resources.

This commit is contained in:
2018-02-26 04:48:48 +00:00
parent c889345182
commit 654b07fe05
2 changed files with 29 additions and 16 deletions

View File

@@ -213,7 +213,7 @@ namespace libexeinfo
return sb.ToString(); return sb.ToString();
} }
public static ResourceTable GetResources(Stream stream, uint neStart, ushort tableOff) public static ResourceTable GetResources(Stream stream, uint neStart, ushort tableOff, ushort upperLimit)
{ {
long oldPosition = stream.Position; long oldPosition = stream.Position;
byte[] DW = new byte[2]; byte[] DW = new byte[2];
@@ -226,7 +226,7 @@ namespace libexeinfo
List<ResourceType> types = new List<ResourceType>(); List<ResourceType> types = new List<ResourceType>();
while(true) while(stream.Position < upperLimit + neStart)
{ {
ResourceType type = new ResourceType(); ResourceType type = new ResourceType();
stream.Read(DW, 0, 2); stream.Read(DW, 0, 2);
@@ -255,7 +255,6 @@ namespace libexeinfo
} }
types.Add(type); types.Add(type);
Console.WriteLine("{0}", stream.Position);
} }
table.types = types.ToArray(); table.types = types.ToArray();
@@ -264,11 +263,9 @@ namespace libexeinfo
{ {
if((table.types[t].id & 0x8000) == 0) if((table.types[t].id & 0x8000) == 0)
{ {
byte len;
byte[] str;
stream.Position = neStart + tableOff + table.types[t].id; stream.Position = neStart + tableOff + table.types[t].id;
len = (byte)stream.ReadByte(); byte len = (byte)stream.ReadByte();
str = new byte[len]; byte[] str = new byte[len];
stream.Read(str, 0, len); stream.Read(str, 0, len);
table.types[t].name = Encoding.ASCII.GetString(str); table.types[t].name = Encoding.ASCII.GetString(str);
} }
@@ -278,17 +275,14 @@ namespace libexeinfo
{ {
if((table.types[t].resources[r].id & 0x8000) == 0) if((table.types[t].resources[r].id & 0x8000) == 0)
{ {
byte len;
byte[] str;
stream.Position = neStart + tableOff + table.types[t].resources[r].id; stream.Position = neStart + tableOff + table.types[t].resources[r].id;
len = (byte)stream.ReadByte(); byte len = (byte)stream.ReadByte();
str = new byte[len]; byte[] str = new byte[len];
stream.Read(str, 0, len); stream.Read(str, 0, len);
table.types[t].resources[r].name = Encoding.ASCII.GetString(str); table.types[t].resources[r].name = Encoding.ASCII.GetString(str);
} }
else else
table.types[t].resources[r].name = table.types[t].resources[r].name = $"{table.types[t].resources[r].id & 0x7FFF}";
string.Format("{0}", table.types[t].resources[r].id & 0x7FFF);
table.types[t].resources[r].data = table.types[t].resources[r].data =
new byte[table.types[t].resources[r].length * (1 << table.alignment_shift)]; new byte[table.types[t].resources[r].length * (1 << table.alignment_shift)];

View File

@@ -176,10 +176,29 @@ namespace libexeinfo
RequiredOperatingSystem = reqOs; RequiredOperatingSystem = reqOs;
if(Header.resource_entries <= 0) return; // Some executable indicates 0 entries, some indicate a table start and no limit, will need to explore till next item
ushort resourceUpperLimit = ushort.MaxValue;
Resources = GetResources(BaseStream, BaseExecutable.Header.new_offset, Header.resource_table_offset); if(Header.entry_table_offset >= Header.resource_table_offset &&
Versions = GetVersions().ToArray(); Header.entry_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.entry_table_offset;
if(Header.segment_table_offset >= Header.resource_table_offset &&
Header.segment_table_offset <= resourceUpperLimit) resourceUpperLimit = Header.segment_table_offset;
if(Header.module_reference_offset >= Header.resource_table_offset &&
Header.module_reference_offset <= resourceUpperLimit)
resourceUpperLimit = Header.module_reference_offset;
if(Header.nonresident_names_offset >= Header.resource_table_offset &&
Header.nonresident_names_offset <= resourceUpperLimit)
resourceUpperLimit = (ushort)Header.nonresident_names_offset;
if(Header.resident_names_offset >= Header.resource_table_offset &&
Header.resident_names_offset <= resourceUpperLimit) resourceUpperLimit = Header.resident_names_offset;
if(Header.imported_names_offset >= Header.resource_table_offset &&
Header.imported_names_offset <= resourceUpperLimit) resourceUpperLimit = Header.imported_names_offset;
if(Header.resource_table_offset >= resourceUpperLimit || Header.resource_table_offset == 0) return;
Resources = GetResources(BaseStream, BaseExecutable.Header.new_offset, Header.resource_table_offset,
resourceUpperLimit);
Versions = GetVersions().ToArray();
} }
/// <summary> /// <summary>