mirror of
https://github.com/claunia/libexeinfo.git
synced 2025-12-16 19:14:24 +00:00
Correct NE when resource entries are set to 0 but there are resources.
This commit is contained in:
@@ -213,7 +213,7 @@ namespace libexeinfo
|
||||
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;
|
||||
byte[] DW = new byte[2];
|
||||
@@ -226,7 +226,7 @@ namespace libexeinfo
|
||||
|
||||
List<ResourceType> types = new List<ResourceType>();
|
||||
|
||||
while(true)
|
||||
while(stream.Position < upperLimit + neStart)
|
||||
{
|
||||
ResourceType type = new ResourceType();
|
||||
stream.Read(DW, 0, 2);
|
||||
@@ -255,7 +255,6 @@ namespace libexeinfo
|
||||
}
|
||||
|
||||
types.Add(type);
|
||||
Console.WriteLine("{0}", stream.Position);
|
||||
}
|
||||
|
||||
table.types = types.ToArray();
|
||||
@@ -264,11 +263,9 @@ namespace libexeinfo
|
||||
{
|
||||
if((table.types[t].id & 0x8000) == 0)
|
||||
{
|
||||
byte len;
|
||||
byte[] str;
|
||||
stream.Position = neStart + tableOff + table.types[t].id;
|
||||
len = (byte)stream.ReadByte();
|
||||
str = new byte[len];
|
||||
byte len = (byte)stream.ReadByte();
|
||||
byte[] str = new byte[len];
|
||||
stream.Read(str, 0, len);
|
||||
table.types[t].name = Encoding.ASCII.GetString(str);
|
||||
}
|
||||
@@ -278,17 +275,14 @@ namespace libexeinfo
|
||||
{
|
||||
if((table.types[t].resources[r].id & 0x8000) == 0)
|
||||
{
|
||||
byte len;
|
||||
byte[] str;
|
||||
stream.Position = neStart + tableOff + table.types[t].resources[r].id;
|
||||
len = (byte)stream.ReadByte();
|
||||
str = new byte[len];
|
||||
byte len = (byte)stream.ReadByte();
|
||||
byte[] str = new byte[len];
|
||||
stream.Read(str, 0, len);
|
||||
table.types[t].resources[r].name = Encoding.ASCII.GetString(str);
|
||||
}
|
||||
else
|
||||
table.types[t].resources[r].name =
|
||||
string.Format("{0}", table.types[t].resources[r].id & 0x7FFF);
|
||||
table.types[t].resources[r].name = $"{table.types[t].resources[r].id & 0x7FFF}";
|
||||
|
||||
table.types[t].resources[r].data =
|
||||
new byte[table.types[t].resources[r].length * (1 << table.alignment_shift)];
|
||||
|
||||
@@ -176,9 +176,28 @@ namespace libexeinfo
|
||||
|
||||
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 &&
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user