about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2020-04-30 16:44:49 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2020-04-30 17:19:52 +0200
commit211df1f07332c4548993e17a6f43a4b7a6e43530 (patch)
tree18018283e6889371eeef4e6de97bb4fd3c7c000c
parent8f691c21c4bb0aff342471c57b2045ac604f6c91 (diff)
downloadmiasm-211df1f07332c4548993e17a6f43a4b7a6e43530.tar.gz
miasm-211df1f07332c4548993e17a6f43a4b7a6e43530.zip
Loader: Fix resource rebuild
-rw-r--r--miasm/loader/pe.py23
1 files changed, 7 insertions, 16 deletions
diff --git a/miasm/loader/pe.py b/miasm/loader/pe.py
index cd5d9370..90d8b12a 100644
--- a/miasm/loader/pe.py
+++ b/miasm/loader/pe.py
@@ -1306,19 +1306,6 @@ class DirRes(CStruct):
 
         out = []
         tmp_off = off
-        for _ in range(nbr):
-            if tmp_off >= ofend:
-                break
-            if tmp_off + length >= len(raw):
-                log.warn('warning bad resource offset')
-                break
-            try:
-                entry, length = ResEntry.unpack_l(raw, tmp_off, self.parent_head)
-            except RuntimeError:
-                log.warn('bad resentry')
-                return None, tmp_off
-            out.append(entry)
-            tmp_off += length
         resdesc.resentries = struct_array(self, raw,
                                           off,
                                           ResEntry,
@@ -1372,17 +1359,21 @@ class DirRes(CStruct):
             return
         of1 = self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_RESOURCE].rva
         raw[self.parent_head.rva2off(of1)] = bytes(self.resdesc)
-        dir_todo = {self.parent_head.NThdr.optentries[
-            DIRECTORY_ENTRY_RESOURCE].rva: self.resdesc}
+        length = len(self.resdesc)
+        dir_todo = {
+            self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_RESOURCE].rva: self.resdesc
+        }
+        of1 = of1 + length
+        raw[self.parent_head.rva2off(of1)] = bytes(self.resdesc.resentries)
         dir_done = {}
         while dir_todo:
             of1, my_dir = dir_todo.popitem()
             dir_done[of1] = my_dir
             raw[self.parent_head.rva2off(of1)] = bytes(my_dir)
             of1 += len(my_dir)
+            raw[self.parent_head.rva2off(of1)] = bytes(my_dir.resentries)
             of_base = of1
             for entry in my_dir.resentries:
-                raw[of_base] = bytes(entry)
                 of_base += len(entry)
                 if entry.name_s:
                     raw[self.parent_head.rva2off(entry.name)] = bytes(entry.name_s)