Skip to content

Commit f0f591b

Browse files
committed
Construct the module directly from the pefile.PE structure
1 parent 0001f6a commit f0f591b

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

src/dumpulator/dumpulator.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,12 @@ def _parse_module_exports(self, module):
400400
def _setup_modules(self):
401401
minidump_module: minidump.MinidumpModule
402402
for minidump_module in self._minidump.modules.modules:
403-
module = self.modules.add(minidump_module.baseaddress, minidump_module.size, minidump_module.name)
404-
header = self.read(module.base, PAGE_SIZE)
403+
base = minidump_module.baseaddress
404+
size = minidump_module.size
405+
path = minidump_module.name
406+
407+
# Parse the header to dump the sections from memory
408+
header = self.read(base, PAGE_SIZE)
405409
pe = PE(data=header, fast_load=True)
406410
image_size = pe.OPTIONAL_HEADER.SizeOfImage
407411
section_alignment = pe.OPTIONAL_HEADER.SectionAlignment
@@ -412,7 +416,7 @@ def _setup_modules(self):
412416
mask = section_alignment - 1
413417
rva = (section.VirtualAddress + mask) & ~mask
414418
size = self.memory.align_page(section.Misc_VirtualSize)
415-
va = module.base + rva
419+
va = base + rva
416420
for page in range(va, va + size, PAGE_SIZE):
417421
region = self.memory.find_commit(page)
418422
if region is not None:
@@ -421,17 +425,15 @@ def _setup_modules(self):
421425
data = self.read(va, size)
422426
mapped_data[rva:size] = data
423427
except UcError:
424-
self.error(f"Failed to read section {name} from module {module.path}")
428+
self.error(f"Failed to read section {name} from module {path}")
425429
# Load the PE dumped from memory
426430
pe = PE(data=mapped_data, fast_load=True)
427431
# Hack to adjust pefile to accept in-memory modules
428432
for section in pe.sections:
429433
# Potentially interesting members: Misc_PhysicalAddress, Misc_VirtualSize, SizeOfRawData
430434
section.PointerToRawData = section.VirtualAddress
431435
section.PointerToRawData_adj = section.VirtualAddress
432-
# Extract the relevant information from the PE
433-
module.parse_pe(pe)
434-
436+
self.modules.add(pe, path)
435437

436438
def _setup_syscalls(self):
437439
# Load the ntdll module from memory
@@ -816,9 +818,7 @@ def map_module(self, file_data: bytes, file_path: str = "", requested_base: int
816818
self.write(va, data)
817819

818820
# Add the module to the module manager
819-
module = self.modules.add(image_base, image_size, file_path)
820-
module.parse_pe(pe)
821-
return module
821+
return self.modules.add(pe, file_path)
822822

823823
def load_dll(self, file_name: str, file_data: bytes):
824824
self.handles.map_file("\\??\\" + file_name, FileObject(file_name, file_data))

src/dumpulator/modules.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,22 @@ def __init__(self, address: int, ordinal: int, name: str):
1111
self.name = name
1212

1313
class Module:
14-
def __init__(self, base: int, size: int, path: str):
15-
self.base = base
16-
self.size = size
14+
def __init__(self, pe: pefile.PE, path: str):
15+
self.pe = pe
1716
self.path = path
18-
self.name = path.split('\\')[-1]
19-
self.pe: pefile.PE = None
17+
self.name = path.split("\\")[-1]
2018
self._exports_by_address: Dict[int, int] = {}
2119
self._exports_by_ordinal: Dict[int, int] = {}
2220
self._exports_by_name: Dict[str, int] = {}
2321
self.exports: List[ModuleExport] = []
22+
self._parse_pe()
2423

25-
def parse_pe(self, pe: pefile.PE):
26-
self.pe = pe
24+
def _parse_pe(self):
25+
self.base: int = self.pe.OPTIONAL_HEADER.ImageBase
26+
self.size: int = self.pe.OPTIONAL_HEADER.SizeOfImage
27+
self.entry: int = self.base + self.pe.OPTIONAL_HEADER.AddressOfEntryPoint
2728
self.pe.parse_data_directories(directories=[pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_EXPORT"]])
28-
pe_exports = pe.DIRECTORY_ENTRY_EXPORT.symbols if hasattr(pe, "DIRECTORY_ENTRY_EXPORT") else []
29+
pe_exports = self.pe.DIRECTORY_ENTRY_EXPORT.symbols if hasattr(self.pe, "DIRECTORY_ENTRY_EXPORT") else []
2930
for pe_export in pe_exports:
3031
va = self.base + pe_export.address
3132
if pe_export.name:
@@ -66,11 +67,11 @@ def __init__(self, memory: MemoryManager):
6667
self._name_lookup: Dict[str, int] = {}
6768
self._modules: Dict[int, Module] = {}
6869

69-
def add(self, base: int, size: int, path: str):
70-
module = Module(base, size, path)
71-
self._modules[base] = module
70+
def add(self, pe: pefile.PE, path: str):
71+
module = Module(pe, path)
72+
self._modules[module.base] = module
7273
region = self._memory.find_region(module.base)
73-
assert region.start == base
74+
assert region.start == module.base
7475
assert region is not None
7576
region.info = module
7677
self._name_lookup[module.name] = module.base

0 commit comments

Comments
 (0)