diff options
| author | serpilliere <serpilliere@users.noreply.github.com> | 2020-04-30 20:25:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-30 20:25:48 +0200 |
| commit | 765f8ae8158b987f4c6b7c2cf51d2a795b2a3f2e (patch) | |
| tree | 371def13f1a7a5f1a13086292d6e9373128f70a6 | |
| parent | cece0ccaa2123a4552453486433653ebc4cb87aa (diff) | |
| parent | 211df1f07332c4548993e17a6f43a4b7a6e43530 (diff) | |
| download | miasm-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.py | 12 | ||||
| -rw-r--r-- | miasm/loader/new_cstruct.py | 6 | ||||
| -rw-r--r-- | miasm/loader/pe.py | 27 |
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) |