example/loader/minidump_to_pe.py
#! /usr/bin/env python
"""Minidump to PE example"""
import sys
from future.utils import viewvalues
from miasm.loader.minidump_init import Minidump
from miasm.loader.pe_init import PE
minidump = Minidump(open(sys.argv[1], 'rb').read())
pe = PE()
for i, memory in enumerate(sorted(viewvalues(minidump.memory),
key=lambda x:x.address)):
# Get section name
name = str(memory.name)
if not name:
name = "s_%02d" % i
else:
name = name.split('\\')[-1]
# Get section protection
protect = memory.pretty_protect
protect_mask = 0x20
if protect == "UNKNOWN":
protect_mask |= 0xe0000000
else:
if "EXECUTE" in protect:
protect_mask |= 1 << 29
if "READ" in protect:
protect_mask |= 1 << 30
if "WRITE" in protect:
protect_mask |= 1 << 31
# Add the section
pe.SHList.add_section(name=name, addr=memory.address, rawsize=memory.size,
data=memory.content, flags=protect_mask)
# Find entry point
try:
entry_point = minidump.threads.Threads[0].ThreadContext.Eip[0]
except AttributeError:
entry_point = minidump.threads.Threads[0].ThreadContext.Rip[0]
pe.Opthdr.AddressOfEntryPoint = entry_point
open("out_pe.bin", "wb").write(bytes(pe))