class Draugr : def __init__(self, memory, mmap) : self.m = Memory(memory, "r", mmap) self.b = None # pgd = unpack("<L", self.m.read(lpid[mypid].mm + 36, 4))[0] # print hex(lpid[mypid].mm), hex(pgd) # print hex(self.m.pgd_to_pte(0xde101000)) #pgd)) # print hex(self.m.pgd_to_pte(pgd)) def page(self, pid, addr, size=4096) : if self.b == None : self.b = BuildTaskStruct(self.m) self.b.find_offsets() lpid = DraugrLinkedPid(self.m, self.b).runHash() print lpid[pid] pgd = unpack("<L", self.m.read(lpid[pid].mm + 36, 4))[0] print hex(pgd) page = self.m.page(pgd, addr) print "PAGE @ 0x%lx" % page print self.m.dump(page, size, 'd') def lprocesses(self) : if self.b == None : self.b = BuildTaskStruct(self.m) self.b.find_offsets() lpid = DraugrLinkedPid(self.m, self.b) for i in lpid.run() : print i def bprocesses(self, start=0xc0000000) : if self.b == None : self.b = BuildTaskStruct(self.m) self.b.find_offsets() l = [] upid = DraugrUnknownPid(self.m, self.b, start) for i in upid.run() : l.append(i) print for x in l : print x def symbol(self, name) : if name[0] == 'd' : addr = self.m.symbol(name[2:]) elif name[0] == 'x' : addr = self.m.symbolXML(name[2:]) elif name[0] == 's' : addr = self.m.syscall(int(name[2:])) else : raise("Ooops") print "%s @ 0x%lx" % (name[2:], addr) def disasm(self, addr, size) : for i in self.m.disasm(addr, size) : print "0x%08x (%02x) %-20s %s" % (i.offset, i.size, i.instructionHex, str(i.mnemonic) + " " + str(i.operands)) def dump(self, addr, size) : print self.m.dump(addr, size, 'h')