Source code for envi.expression

"""
Unified expression helpers.
"""

[docs]def evaluate(pycode, locals): return eval(pycode, {}, locals)
[docs]class ExpressionLocals(dict): """ An object to act as the locals dictionary for the evaluation of envi expressions. You may pass in an envi.resolver.SymbolResolver object to automagically use symbols in your expressions. """ def __init__(self, symobj=None): dict.__init__(self) self.symobj = symobj def __getitem__(self, name): if self.symobj != None: ret = self.symobj.getSymByName(name) if ret != None: return ret return dict.__getitem__(self, name)
[docs]class MemoryExpressionLocals(ExpressionLocals): def __init__(self, memobj, symobj=None): ExpressionLocals.__init__(self, symobj=symobj) self.memobj = memobj self.update({ 'mapbase':self.mapbase, 'maplen':self.maplen, 'ispoi':self.ispoi, 'mem':self.mem, 'poi':self.poi, 'sym':self.sym, })
[docs] def sym(self, symstr): ''' An easy to use utility for symbols which have un-pythonic names. Example x = sym('kernel32.??2@$$FYAPAXI@Z') ''' return long(evaluate(symstr, self))
[docs] def mapbase(self, address): """ The expression mapbase(address) returns the base address of the memory mapped area containing "address" """ map = self.memobj.getMemoryMap(address) if not map: raise Exception("ERROR - un-mapped address in mapbase()") return map[0]
[docs] def maplen(self, address): """ The expression maplen(address) returns the length of the memory mapped area containing "address". """ map = self.memobj.getMemoryMap(address) if not map: raise Exception("ERROR - un-mapped address in maplen()") return map[1]
[docs] def ispoi(self, addr): """ The expression ispoi(value) returns True if the specified value is a valid pointer. Otherwise, False. """ return self.memobj.isValidPointer(addr)
[docs] def mem(self, addr, size): """ Read and return memory. Example: mem(ecx, 20) """ return self.memobj.readMemory(addr, size)
[docs] def poi(self, address): """ When expression contains "poi(addr)" this will return the address pointed to by addr. """ return self.memobj.readMemoryFormat(address, "P")[0]