diff --git a/pwndbg/__init__.py b/pwndbg/__init__.py index df20711ac..33e6ea416 100755 --- a/pwndbg/__init__.py +++ b/pwndbg/__init__.py @@ -5,8 +5,6 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals -import sys - import gdb import pwndbg.android @@ -44,6 +42,7 @@ import pwndbg.commands.stack import pwndbg.commands.start import pwndbg.commands.telescope import pwndbg.commands.theme +import pwndbg.commands.version import pwndbg.commands.vmmap import pwndbg.commands.windbg import pwndbg.commands.xor @@ -67,8 +66,12 @@ import pwndbg.regs import pwndbg.stack import pwndbg.stdio import pwndbg.typeinfo +import pwndbg.version import pwndbg.vmmap +__version__ = pwndbg.version.__version__ +version = __version__ + try: import unicorn import pwndbg.emu diff --git a/pwndbg/commands/version.py b/pwndbg/commands/version.py new file mode 100644 index 000000000..9257b940d --- /dev/null +++ b/pwndbg/commands/version.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Displays gdb, python and pwndbg versions. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import sys + +import gdb + +import pwndbg +import pwndbg.color +import pwndbg.commands + + +def _gdb_version(): + return gdb.execute('show version', to_string=True).split('\n')[0] + + +def _py_version(): + return sys.version.replace('\n', ' ') + + +@pwndbg.commands.Command +def version(): + """ + Displays gdb, python and pwndbg versions. + """ + gdb_str = 'Gdb: %s' % _gdb_version() + py_str = 'Python: %s' % _py_version() + pwndbg_str = 'Pwndbg: %s' % pwndbg.__version__ + + print('\n'.join(map(pwndbg.color.light_red, (gdb_str, py_str, pwndbg_str)))) diff --git a/pwndbg/prompt.py b/pwndbg/prompt.py index 3bbd83e66..fa13d69ef 100644 --- a/pwndbg/prompt.py +++ b/pwndbg/prompt.py @@ -11,11 +11,12 @@ import pwndbg.events import pwndbg.memoize import pwndbg.stdio -msg = "Loaded %i commands. Type pwndbg [filter] for a list." % len(pwndbg.commands._Command.commands) -print(pwndbg.color.red(msg)) +hint_msg = 'Loaded %i commands. Type pwndbg [filter] for a list.' % len(pwndbg.commands._Command.commands) +print(pwndbg.color.red(hint_msg)) cur = (gdb.selected_inferior(), gdb.selected_thread()) + def prompt_hook(*a): global cur new = (gdb.selected_inferior(), gdb.selected_thread()) @@ -27,6 +28,7 @@ def prompt_hook(*a): if pwndbg.proc.alive: prompt_hook_on_stop(*a) + @pwndbg.memoize.reset_on_stop def prompt_hook_on_stop(*a): with pwndbg.stdio.stdio: diff --git a/pwndbg/version.py b/pwndbg/version.py new file mode 100644 index 000000000..1104cd2c0 --- /dev/null +++ b/pwndbg/version.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import os +import subprocess + + +def build_id(): + """ + Returns pwndbg commit id if git is available. + """ + try: + git_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), '.git') + commit_id = subprocess.check_output(['git', '--git-dir', git_path, 'rev-parse', 'HEAD']) + commit_id = commit_id[:8].decode('utf-8') + + return 'build: %s' % commit_id + except: + return '' + +__version__ = '1.0.0' + +b_id = build_id() + +if b_id: + __version__ += ' %s' % b_id +