Source code for vdb.recon.sniper
'''
Specialized breakpoints which identify dangerous calling
mechanisms and tag them.
'''
import envi.memory as e_mem
import vtrace.breakpoints as vt_breakpoints
[docs]def getStackArg(trace, argidx):
'''
Assuming we are at the instruction after
a call, grab the stack argument at the specified
index (skipping the saved instruction pointer).
'''
stack = trace.getStackCounter()
fmt = '<P' + ('P' * (argidx+1))
args = trace.readMemoryFormat(stack, fmt)
return args[-1]
[docs]class SniperDynArgBreak(vt_breakpoints.Breakpoint):
'''
A breakpoint for use in determining if an API was called
with a dynamic pointer.
'''
def __init__(self, symname, argidx):
vt_breakpoints.Breakpoint.__init__(self, None, expression=symname)
self.fastbreak = True
self._argidx = argidx
self._symname = symname
[docs] def getName(self):
return '%s argidx: %d' % (self._symname, self._argidx)
[docs] def notify(self, event, trace):
arg = getStackArg(trace, self._argidx)
self.fastbreak = True
if trace.probeMemory(arg, 1, e_mem.MM_WRITE):
print 'SNIPER: %s TOOK DYNAMIC ARG IDX %d (0x%.8x)' % (self._symname, self._argidx, arg)
self.fastbreak = False
[docs]class SniperArgValueBreak(vt_breakpoints.Breakpoint):
'''
A breakpoint for monitoring an API for being called with a particular
value.
'''
def __init__(self, symname, argidx, argval):
pass
[docs]def snipeDynArg(trace, symname, argidx):
'''
Construct a SnyperDynArgBreak and snap it in.
'''
bp = SniperDynArgBreak(symname, argidx)
bpid = trace.addBreakpoint(bp)
return bpid