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();
|
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)];
|
||||||
|
|||||||
@@ -176,9 +176,28 @@ 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 &&
|
||||||
|
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();
|
Versions = GetVersions().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user