#!/usr/bin/env python3 """Minimal minidump reader: exception code/address + module list, so a FIFA 17 CrashDump can be mapped to +RVA (and thence to a Ghidra address).""" import struct, sys p = sys.argv[1] d = open(p, "rb").read() assert d[:4] == b"MDMP", "not a minidump: %r" % d[:4] ver, nstreams, dirrva = struct.unpack_from("= 2: print(" -> %s at %#x" % ({0: "READ from", 1: "WRITE to", 8: "EXECUTE at"}.get(params[0], "access"), params[1])) if exc_addr is not None: hit = [m for m in mods if m[0] <= exc_addr < m[0] + m[1]] print("\n=== FAULTING MODULE ===") if hit: base, sz, name = hit[0] short = name.split("\\")[-1] print(" %s base=%#x size=%#x" % (short, base, sz)) print(" RVA = %#x" % (exc_addr - base)) print(" ghidra (PE base 0x180000000) = %#x" % (0x180000000 + (exc_addr - base))) else: print(" address %#x is in NO loaded module (bad indirect call / corrupt ptr)" % exc_addr) print("\n=== modules of interest ===") for base, sz, name in mods: s = name.split("\\")[-1].lower() if any(k in s for k in ("cards", "fifa", "dbdata", "core", "game")): print(" %-28s base=%#014x size=%#x" % (name.split("\\")[-1], base, sz))