Source code for vdb.renderers
"""
A home for the vdb specific memory renderers.
"""
import envi
import envi.bits as e_bits
import envi.memory as e_mem
import envi.memcanvas as e_canvas
[docs]class OpcodeRenderer(e_canvas.MemoryRenderer):
def __init__(self, trace):
a = trace.getMeta("Architecture")
self.arch = envi.getArchModule(a)
self.pwidth = self.arch.getPointerSize()
[docs] def render(self, mcanv, va):
vastr = self.arch.pointerString(va)
# NOTE: we assume the memobj is a trace
trace = mcanv.mem
sym = trace.getSymByAddr(va)
if sym != None:
mcanv.addVaText(str(sym), va=va)
mcanv.addText(":\n")
p = trace.readMemory(va, 16)
op = self.arch.makeOpcode(p, va=va)
obytes = p[:min(op.size, 8)]
mcanv.addVaText(vastr, va=va)
mcanv.addText(": %s " % obytes.encode('hex').ljust(17))
op.render(mcanv)
mcanv.addText("\n")
return len(op)
[docs]class SymbolRenderer(e_canvas.MemoryRenderer):
def __init__(self, trace):
a = trace.getMeta("Architecture")
self.arch = envi.getArchModule(a)
self.pwidth = self.arch.getPointerSize()
[docs] def render(self, mcanv, va):
# This is only used with tracer based stuff...
trace = mcanv.mem
vastr = self.arch.pointerString(va)
# NOTE: we assume the memobj is a trace
trace = mcanv.mem
p = trace.readMemoryFormat(va, 'P')[0]
isptr = trace.isValidPointer(p)
pstr = self.arch.pointerString(p)
mcanv.addVaText(vastr, va=va)
mcanv.addText(": ")
if isptr:
mcanv.addVaText(pstr, p)
else:
mcanv.addText(pstr)
if isptr:
sym = trace.getSymByAddr(p, exact=False)
if sym != None:
mcanv.addText(' %s + %d' % (repr(sym), p-long(sym)))
mcanv.addText('\n')
return self.pwidth
[docs]class DerefRenderer(e_canvas.MemoryRenderer):
def __init__(self, trace):
a = trace.getMeta("Architecture")
self.arch = envi.getArchModule(a)
self.pwidth = self.arch.getPointerSize()
[docs] def render(self, mcanv, va):
vastr = self.arch.pointerString(va)
# NOTE: we assume the memobj is a trace
trace = mcanv.mem
p = trace.readMemoryFormat(va, 'P')[0]
isptr = trace.isValidPointer(p)
pstr = self.arch.pointerString(p)
vareg = ""
preg = ""
regs = trace.getRegisters()
for name,val in regs.items():
if val == 0:
continue
if val == va:
vareg = "(%s)" % name
if val == p:
preg = "(%s)" % name
bt = trace.getStackTrace()
if len(bt) > 1:
for i in range(1, len(bt)):
spc, sfc = bt[i]
if sfc == 0:
break
if spc == 0:
break
if va == spc:
vareg = "(savepc)"
if va == sfc:
vareg = "(frame%d)" % i
if p == spc:
preg = "(savepc)"
if p == sfc:
preg = "(frame%d)" % i
vareg = vareg.ljust(8)
preg = preg.ljust(8)
#sym = trace.getSymByAddr(va)
#if sym != None:
#pstr = repr(sym)
mcanv.addVaText(vastr, va=va)
mcanv.addText(" %s: " % vareg)
if isptr:
mcanv.addVaText(pstr, p)
else:
mcanv.addText(pstr)
mcanv.addText(preg)
if isptr:
try:
addr,size,perm,fname = trace.getMemoryMap(p)
pname = e_mem.reprPerms(perm)
mcanv.addText(" ")
mcanv.addNameText(pname)
mcanv.addText(" ")
bytes = trace.readMemory(p, 32)
if self.isAscii(bytes):
mcanv.addText("'%s'" % bytes.split("\x00")[0])
elif self.isBasicUnicode(bytes):
s = bytes.split("\x00\x00")[0].replace("\x00","")
mcanv.addText("u'%s'" % s)
else:
mcanv.addText(bytes.encode('hex'))
except Exception, e:
mcanv.addText("ERROR: %s" % e)
else:
try:
for fd,ftype,fname in trace.getFds():
if fd == p:
mcanv.addText('HANDLE/FD?: %s' % fname)
except Exception, e:
pass
mcanv.addText("\n")
return self.arch.getPointerSize()
[docs] def isAscii(self, bytes):
bytes = bytes.split("\x00")[0]
if len(bytes) < 4:
return False
for i in range(len(bytes)):
o = ord(bytes[i])
if o < 0x20 or o > 0x7e:
return False
return True
[docs] def isBasicUnicode(self, bytes):
bytes = bytes.split("\x00\x00")[0]
if len(bytes) < 8:
return False
nonull = bytes.replace("\x00", "")
if (len(bytes) / 2) != len(nonull):
return False
return self.isAscii(nonull)