#!/usr/bin/env python
import sys,struct
from memutil import virt2phys, PagedOutException
pdb_off = 0x18
peb_off = 0x1b0
image_base_off = 0x08
flink_off = 0x10
blink_off = 0x14
if len(sys.argv) < 3:
from os.path import basename
print "usage: %s <memdump> <_EPROCESS offset>" % basename(sys.argv[0])
sys.exit(1)
memdump = open(sys.argv[1])
eproc_off = int(sys.argv[2],0)
memdump.seek(eproc_off + flink_off)
flink = struct.unpack('<L', memdump.read(4))[0]
blink = struct.unpack('<L', memdump.read(4))[0]
print "Flink: %08x, Blink: %08x" % (flink, blink)
memdump.seek(eproc_off + pdb_off)
pdba = struct.unpack('<L', memdump.read(4))[0]
print "Page directory at: %08x" % pdba
print "Flink real addr: %08x" % virt2phys(memdump, pdba, flink)
memdump.seek(eproc_off + peb_off)
peb_virt_addr = struct.unpack('<L', memdump.read(4))[0]
try:
peb_phys_addr = virt2phys(memdump, pdba, peb_virt_addr)
except PagedOutException:
print "FAIL (Process Environment Block paged out)"
sys.exit(1)
memdump.seek(peb_phys_addr + image_base_off)
img_base_virt = struct.unpack('<L', memdump.read(4))[0]
try:
img_base_phys = virt2phys(memdump, pdba, img_base_virt)
except PagedOutException:
print "FAIL (ImageBase paged out)"
sys.exit(1)
memdump.seek(img_base_phys)
from pefile import PE
try:
pe = PE(data=memdump.read(4096))
print pe.dump_info()
#print "%-8s %-16s %-16s %-16s" % ("Name","Virtual Address",
# "Physical Address","Virtual Size")
#for sect in pe.sections:
# try:
# sect_realaddr = hex(virt2phys(memdump, pdba, sect.VirtualAddress + img_base_virt))
# except PagedOutException:
# sect_realaddr = "[paged out]"
# print "%-8s %-16s %-16s %-16s" % (sect.Name, hex(sect.VirtualAddress),
# sect_realaddr, hex(sect.Misc_VirtualSize))
except Exception, e:
print e