示例#1
0
def runVdb(vivgui, pid=None):
    try:
        db = vdb.Vdb()
        extendVdb(db, vivgui)
        vgui = vdb_qt_main.VdbWindow(db)
        vgui.show()
        if pid != None:
            fireattach(db.trace, pid)
    except Exception as e:
        vivgui.vw.vprint('Error Running VDB: %s' % e)
示例#2
0
def switchToVDB(trace):
    import vdb
    db = vdb.Vdb(trace)
    while not db.shutdown.isSet():
        try:
            db.cmdloop()

        except KeyboardInterrupt:
            if db.trace.isRunning():
                db.trace.sendBreak()
        except SystemExit:
            break
        except:
            traceback.print_exc()
示例#3
0
    def do_emulate(self, line):
        """
        Create an emulator for the given function, and drop into a vdb
        interface to step through the code.

        (vdb CLI will appear in controlling terminal...)

        Usage: emulate <va_expr>
        """
        if not line:
            return self.do_help("emulate")

        addr = self.parseExpression(line)
        emu = self.getEmulator(va=addr)

        trace = vt_envitools.TraceEmulator(emu)

        db = vdb.Vdb(trace=trace)
        db.cmdloop()
示例#4
0
def main():
    parser = argparse.ArgumentParser(prog='vdbbin', usage='%(prog)s [options] [platformopt=foo, ...]')
    parser.add_argument('-c', '--cmd', dest='command', default=None, help='Debug a fired command')
    parser.add_argument('-p', '--process', dest='process', default=None, help='Attach to process by name or pid')
    parser.add_argument('-Q', '--qt', dest='doqt', default=False, action='store_true', help='Run the QT gui')
    parser.add_argument('-R', '--remote', dest='remotehost', default=None, help='Attach to remote VDB server')
    parser.add_argument('-r', '--run', dest='dorunagain', default=False, action='store_true', help='Do not stop on attach')
    parser.add_argument('-s', '--snapshot', dest='snapshot', default=None, help='Load a vtrace snapshot file')
    parser.add_argument('-S', '--server', dest='doserver', default=False, action='store_true')
    parser.add_argument('-v', '--verbose', dest='doverbose', default=False, action='store_true')
    parser.add_argument('-t', '--target', dest='target', default=None, help='Activate special vdb target ( -t ? for list )')
    parser.add_argument('--android', dest='doandroid', default=False, action='store_true', help='Debug Android with ADB!')
    parser.add_argument('-e', '--eventid', dest='eventid', default=None, type=int, help='Used for Windows JIT')
    parser.add_argument('-w', '--waitfor', dest='waitfor', default=None, help='Wait for process with name')
    parser.add_argument('platargs', nargs='*')

    args = parser.parse_args()

    # Handle some options before we even create a trace.
    vtrace.remote = args.remotehost # None by default

    platargs = {}

    for arg in args.platargs:

        if arg.find('=') == -1:
            continue

        k, v = arg.split('=', 1)
        if v.isdigit():
            v = int(v)

        platargs[k.lower()] = v

    if args.doandroid:
        import vdb.tools.android as v_utils_android
        v_utils_android.runVdbOnDroid()
        return

    if args.target == '?':
        targetusage()

    trace = None
    if args.snapshot:
        print('Loading process snapshot...')
        trace = vt_snap.loadSnapshot(args.snapshot)

    if trace == None:
        trace = vtrace.getTrace(target=args.target, **platargs)

    db = vdb.Vdb(trace)
    db.runagain = args.dorunagain
    db.windows_jit_event = args.eventid

    if args.waitfor:
        while True:
            newest_pid = 0
            for pid, pname in trace.ps():
                pname = pname.split(' ')[0]
                if pname.find(args.waitfor) != -1:
                    newest_pid = pid

            if newest_pid != 0:
                trace.attach(newest_pid)
                break

    if args.doqt:
        import vqt.main as vq_main
        import vdb.qt.main as vdb_q_main
        import vqt.colors as vq_colors
        vq_main.startup(css=vq_colors.qt_matrix)
        qgui = vdb_q_main.VdbWindow(db)
        qgui.show()

    if args.doserver:
        db.do_server('')

    if args.process:
        db.do_attach(args.process)

    elif args.command:
        trace.execute(args.command)

    if args.eventid:
        db.trace.setMeta('WindowsJitEvent', args.eventid)

    if args.doqt:
        vq_main.main()

    else:

        while not db.shutdown.isSet():
            try:

                db.cmdloop()

            except KeyboardInterrupt:
                if db.trace.isRunning():
                    db.trace.sendBreak()

            except SystemExit:
                break

            except:
                traceback.print_exc()
示例#5
0
    def __init__(self, db=None):
        if not db:
            db = vdb.Vdb()
            
        self.go = True

        # NOTE: This sets self.vdb from db...
        VdbWindow.__init__(self, db, vdb.basepath+"glade/vdb.glade")

        self.cli = vdb.VdbCli(db)
        self.cli.stdout = self

        self.register_views = {}
        self.stackwin = None

        self.setupSymbolView()
        self.setupMetaView()
        self.setupVtraceHelp()
        self.setupRegisterTree()
        self.setupSignalCombo()
        self.setupShortcutKeys()

        self.setupPages()
        self.setupProcessTree()

        # Keep the command history in the gui
        self.cmdindex = -1
        self.cmdhist = ["",]

        # NOTE: For GUI debugging, take this out...
        sys.excepthook = self.excepthook

        self.running_inactive = (
            "ThreadCombo",
            "ContinueButton",
            "SnapshotButton",
            "RegisterTree",
            "DetachButton",
            "SearchButton",
            "StepButton",
            "PendingSignalCombo",
            "ViewMemoryWindow",
            "ViewDisassemblyWindow",
            "RunScript",
            )

        self.detached_inactive = (
            "ThreadCombo",
            "ContinueButton",
            "SnapshotButton",
            "RegisterTree",
            "DetachButton",
            "SearchButton",
            "BreakButton",
            "StepButton",
            "ViewMemoryWindow",
            "ViewDisassemblyWindow",
            "RunScript",
            "PendingSignalCombo",
            "AutoContinueMenu",
            )

        self.auto_cont_map = {
        "AutoContAttach":NOTIFY_ATTACH,
        "AutoContSignal":NOTIFY_SIGNAL,
        "AutoContBreak":NOTIFY_BREAK,
        "AutoContCreateThread":NOTIFY_CREATE_THREAD,
        "AutoContLoadLib":NOTIFY_LOAD_LIBRARY,
        "AutoContThreadExit":NOTIFY_EXIT_THREAD,
        "AutoContUnloadLib":NOTIFY_UNLOAD_LIBRARY}

        #self.vdb.initTrace(trace) # Setup the trace group modes
        self.tooltip = gtk.Tooltips()
        self.setupModesMenu()
        self.updateModesMenu()

        self.updateGuiStatus(NOTIFY_DETACH)
        self.getWidget("MainWindow").show()
        self.setupWindow()

        t = self.vdb.getTrace()

        if t.isAttached():
            self.activateList(self.detached_inactive, True)
            if t.isRunning():
                self.activateList(self.running_inactive, False)
            else:
                self.activateList(self.running_inactive, True)
        else:
            self.activateList(self.detached_inactive, False)

        self.vdb.stdout = self
        self.vdb.stderr = self

        self.loadGuiExtensions()
        self.cmdKeyboardFocus()