about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2020-04-30 20:25:48 +0200
committerGitHub <noreply@github.com>2020-04-30 20:25:48 +0200
commit765f8ae8158b987f4c6b7c2cf51d2a795b2a3f2e (patch)
tree371def13f1a7a5f1a13086292d6e9373128f70a6
parentcece0ccaa2123a4552453486433653ebc4cb87aa (diff)
parent211df1f07332c4548993e17a6f43a4b7a6e43530 (diff)
downloadmiasm-765f8ae8158b987f4c6b7c2cf51d2a795b2a3f2e.tar.gz
miasm-765f8ae8158b987f4c6b7c2cf51d2a795b2a3f2e.zip
Merge pull request #1213 from serpilliere/fix_loader_pe
Fix loader pe
Diffstat (limited to '')
-rw-r--r--miasm/core/utils.py12
-rw-r--r--miasm/loader/new_cstruct.py6
-rw-r--r--miasm/loader/pe.py27
3 files changed, 22 insertions, 23 deletions
diff --git a/miasm/core/utils.py b/miasm/core/utils.py
index 7667a656..37248c40 100644
--- a/miasm/core/utils.py
+++ b/miasm/core/utils.py
@@ -81,10 +81,16 @@ def printable(string):
 
 
 def force_bytes(value):
-    try:
-        return value.encode()
-    except AttributeError:
+    if isinstance(value, bytes):
         return value
+    if not isinstance(value, str):
+        return value
+    out = []
+    for c in value:
+        c = ord(c)
+        assert c < 0x100
+        out.append(c)
+    return bytes(out)
 
 
 def force_str(value):
diff --git a/miasm/loader/new_cstruct.py b/miasm/loader/new_cstruct.py
index ec591aa8..16c947a5 100644
--- a/miasm/loader/new_cstruct.py
+++ b/miasm/loader/new_cstruct.py
@@ -4,6 +4,7 @@ from __future__ import print_function
 import re
 import struct
 
+from miasm.core.utils import force_bytes
 from future.utils import PY3, viewitems, with_metaclass
 
 type2realtype = {}
@@ -213,9 +214,10 @@ class CStruct(with_metaclass(Cstruct_Metaclass, object)):
                 if cpt == None:
                     if value == None:
                         o = struct.calcsize(fmt) * b"\x00"
+                    elif ffmt.endswith('s'):
+                        new_value = force_bytes(value)
+                        o = struct.pack(self.sex + fmt, new_value)
                     else:
-                        if isinstance(value, str):
-                            value = value.encode()
                         o = struct.pack(self.sex + fmt, value)
                 else:
                     o = b""
diff --git a/miasm/loader/pe.py b/miasm/loader/pe.py
index f402e980..90d8b12a 100644
--- a/miasm/loader/pe.py
+++ b/miasm/loader/pe.py
@@ -267,7 +267,7 @@ class DescName(CStruct):
         return name, off + len(name) + 1
 
     def sets(self, value):
-        return bytes(value) + b"\x00"
+        return force_bytes(value) + b"\x00"
 
 
 class ImportByName(CStruct):
@@ -918,7 +918,7 @@ class DirDelay(CStruct):
         return out, off
 
     def sete(self, entries):
-        return "".join(bytes(entry) for entry in entries) + b"\x00" * (4 * 8)  # DelayDesc_e
+        return b"".join(bytes(entry) for entry in entries) + b"\x00" * (4 * 8)  # DelayDesc_e
 
     def __len__(self):
         rva_size = self.parent_head._wsize // 8
@@ -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)