diff options
| -rw-r--r-- | miasm/loader/pe.py | 25 | ||||
| -rw-r--r-- | miasm/loader/pe_init.py | 13 |
2 files changed, 38 insertions, 0 deletions
diff --git a/miasm/loader/pe.py b/miasm/loader/pe.py index f6b56a3c..6ab6451e 100644 --- a/miasm/loader/pe.py +++ b/miasm/loader/pe.py @@ -1602,6 +1602,31 @@ class Symb(CStruct): ("res3", "u16")] +class DirTls(CStruct): + _fields = [ + ("data_start", "ptr"), + ("data_end", "ptr"), + ("addr_index", "ptr"), + ("callbacks", "ptr"), + ("size_of_zero", "u32"), + ("characteristics", "u32") + ] + + def build_content(self, raw): + dirtls = self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_TLS] + of1 = dirtls.rva + if of1 is None: # No Tls + return + raw[self.parent_head.rva2off(of1)] = bytes(self) + + def set_rva(self, rva, size=None): + self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_TLS].rva = rva + if not size: + self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_TLS].size = len(self) + else: + self.parent_head.NThdr.optentries[DIRECTORY_ENTRY_TLS].size = size + + DIRECTORY_ENTRY_EXPORT = 0 DIRECTORY_ENTRY_IMPORT = 1 DIRECTORY_ENTRY_RESOURCE = 2 diff --git a/miasm/loader/pe_init.py b/miasm/loader/pe_init.py index 1d179efb..7a8d2abd 100644 --- a/miasm/loader/pe_init.py +++ b/miasm/loader/pe_init.py @@ -220,6 +220,7 @@ class PE(object): self.DirDelay = pe.DirDelay(self) self.DirReloc = pe.DirReloc(self) self.DirRes = pe.DirRes(self) + self.DirTls = pe.DirTls(self) self.Doshdr.magic = 0x5a4d self.Doshdr.lfanew = 0xe0 @@ -414,6 +415,17 @@ class PE(object): except pe.InvalidOffset: log.warning('cannot parse DirRes, skipping') + if len(self.NThdr.optentries) > pe.DIRECTORY_ENTRY_TLS: + self.DirTls = pe.DirTls(self) + try: + self.DirTls = pe.DirTls.unpack( + self.img_rva, + self.NThdr.optentries[pe.DIRECTORY_ENTRY_TLS].rva, + self + ) + except pe.InvalidOffset: + log.warning('cannot parse DirTls, skipping') + def resize(self, old, new): pass @@ -567,6 +579,7 @@ class PE(object): self.DirDelay.build_content(content) self.DirReloc.build_content(content) self.DirRes.build_content(content) + self.DirTls.build_content(content) if (self.Doshdr.lfanew + len(self.NTsig) + len(self.Coffhdr)) % 4: log.warn("non aligned coffhdr, bad crc calculation") |