diff --git a/libexeinfo/NE/Info.cs b/libexeinfo/NE/Info.cs index 31cbb24..0ff8ebf 100644 --- a/libexeinfo/NE/Info.cs +++ b/libexeinfo/NE/Info.cs @@ -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 types = new List(); - 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)]; diff --git a/libexeinfo/NE/NE.cs b/libexeinfo/NE/NE.cs index 80906dd..31868f7 100644 --- a/libexeinfo/NE/NE.cs +++ b/libexeinfo/NE/NE.cs @@ -176,10 +176,29 @@ 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); - Versions = GetVersions().ToArray(); + 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(); } ///