Source code for vdb.extensions.gdbstub

import vtrace
import vdb.extensions.windows as vdb_windows

def ethread(db, line):
[docs] ''' Display information about the currently stopped ethread. Usage: ethread #FIXME support listing them #FIXME support ethread interp arbitrary address ''' t = db.getTrace() t.requireNotRunning() fsbase = t.getVariable('fsbase') kpcr = t.getStruct('nt.KPCR', fsbase) ethraddr = kpcr.PrcbData.CurrentThread ethr = t.getStruct('nt.ETHREAD', ethraddr) db.vprint(ethr.tree(va=ethraddr)) def eprocess(db, line):
[docs] ''' Display information about the currently stopped eprocess. Usage: eprocess #FIXME support listing #FIXME support eprocess interp address ''' t = db.getTrace() t.requireNotRunning() fsbase = t.getVariable('fsbase') kpcr = t.getStruct('nt.KPCR', fsbase) ethraddr = kpcr.PrcbData.CurrentThread ethr = t.getStruct('nt.ETHREAD', ethraddr) eprocaddr = ethr.Tcb.ApcState.Process eproc = t.getStruct('nt.EPROCESS', eprocaddr) db.vprint(eproc.tree(va=eprocaddr)) def kpcr(db, line):
[docs] ''' Show the kpcr structure for the currently stopped kernel. Usage: kpcr ''' t = db.getTrace() t.requireNotRunning() fsbase = t._getVmwareReg('fs') kpcr = t.getStruct('nt.KPCR', fsbase) db.vprint(kpcr.tree(va=fsbase)) # FIXME do we need to make gdbstub a package so it can have subs? def armcore(db, line):
[docs] ''' Show / set the 'mode' of the arm core between arm and thumb. Usage: armcore [arm|thumb] ''' t = db.getTrace() t.requireNotRunning() if line: if line not in ('arm','thumb'): return db.do_help('armcore') cmdstr = t._monitorCommand('arm core_state %s' % line) else: cmdstr = t._monitorCommand('arm core_state') mode = cmdstr.split(':')[1].strip() db.vprint('Arm Core Mode: %s' % mode) class GdbStubNotifier(vtrace.Notifier):
[docs] def __init__(self, db): vtrace.Notifier.__init__(self) self._db = db def notify(self, event, trace):
[docs] if event != vtrace.NOTIFY_ATTACH: return targarch = trace.getMeta('Architecture') gdbplatform = trace.getMeta('GdbPlatform') targplatform = trace.getMeta('GdbTargetPlatform') #print 'Target Architecture: %s' % targarch #print 'Gdb Platform: %s' % gdbplatform #print 'Target Platform: %s' % targplatform if gdbplatform in ('VMware32','Qemu32'): if targplatform == 'Windows': self._db.registerCmdExtension(vdb_windows.aslr) self._db.registerCmdExtension(vdb_windows.pe) self._db.registerCmdExtension(ethread) self._db.registerCmdExtension(eprocess) elif gdbplatform == 'OpenOCD': # If we are openocd, lets add some commands for jtag etc.. if targarch == 'arm': #import vdb.extensions.arm as vdb_arm self._db.registerCmdExtension(armcore) #self._db.registerCmdExtension(vdb_arm.thumb) def gdbmon(db, line):
[docs] ''' Issue a gdb "monitor" command which allows access to the extensions inside the gdb stub. Example: gdbmon r fs (try: "gdbmon help" for info on supported commands in the target stub) ''' if len(line) == 0: return db.do_help('gdbmon') t = db.getTrace() #t.requireNotRunning() resp = t._monitorCommand(line) db.vprint('gdb> %s' % line) db.vprint(resp) def vdbExtension(db, trace):
[docs] notif = GdbStubNotifier(db) db.registerCmdExtension(gdbmon) db.registerNotifier(vtrace.NOTIFY_ATTACH, notif)