Expose IDA Pro commands, even when IDA is not available. (#337)

Closes #225
pull/339/head
Zach Riggle 8 years ago committed by Disconnect3d
parent abad5efeb2
commit ae5a6750d0

@ -32,87 +32,89 @@ def j(*args):
pass
if pwndbg.ida.available():
@pwndbg.commands.Command
@pwndbg.commands.OnlyWhenRunning
def up(n=1):
"""
Select and print stack frame that called this one.
An argument says how many frames up to go.
"""
f = gdb.selected_frame()
for i in range(n):
o = f.older()
if o:
o.select()
@pwndbg.commands.Command
@pwndbg.commands.OnlyWhenRunning
def up(n=1):
"""
Select and print stack frame that called this one.
An argument says how many frames up to go.
"""
f = gdb.selected_frame()
for i in range(n):
o = f.older()
if o:
o.select()
bt = pwndbg.commands.context.context_backtrace(with_banner=False)
print('\n'.join(bt))
bt = pwndbg.commands.context.context_backtrace(with_banner=False)
print('\n'.join(bt))
j()
j()
@pwndbg.commands.Command
@pwndbg.commands.OnlyWhenRunning
def down(n=1):
"""
Select and print stack frame called by this one.
An argument says how many frames down to go.
"""
f = gdb.selected_frame()
@pwndbg.commands.Command
@pwndbg.commands.OnlyWhenRunning
def down(n=1):
"""
Select and print stack frame called by this one.
An argument says how many frames down to go.
"""
f = gdb.selected_frame()
for i in range(n):
o = f.newer()
if o:
o.select()
for i in range(n):
o = f.newer()
if o:
o.select()
bt = pwndbg.commands.context.context_backtrace(with_banner=False)
print('\n'.join(bt))
bt = pwndbg.commands.context.context_backtrace(with_banner=False)
print('\n'.join(bt))
j()
j()
@pwndbg.commands.Command
def save_ida():
if not pwndbg.ida.available():
return
@pwndbg.commands.Command
@pwndbg.ida.withIDA
def save_ida():
"""Save the IDA database"""
if not pwndbg.ida.available():
return
path = pwndbg.ida.GetIdbPath()
path = pwndbg.ida.GetIdbPath()
# Need to handle emulated paths for Wine
if path.startswith('Z:'):
path = path[2:].replace('\\', '/')
pwndbg.ida.SaveBase(path)
# Need to handle emulated paths for Wine
if path.startswith('Z:'):
path = path[2:].replace('\\', '/')
pwndbg.ida.SaveBase(path)
basename = os.path.basename(path)
dirname = os.path.dirname(path)
backups = os.path.join(dirname, 'ida-backup')
basename = os.path.basename(path)
dirname = os.path.dirname(path)
backups = os.path.join(dirname, 'ida-backup')
if not os.path.isdir(backups):
os.mkdir(backups)
if not os.path.isdir(backups):
os.mkdir(backups)
basename, ext = os.path.splitext(basename)
basename += '-%s' % datetime.datetime.now().isoformat()
basename += ext
basename, ext = os.path.splitext(basename)
basename += '-%s' % datetime.datetime.now().isoformat()
basename += ext
# Windows doesn't like colons in paths
basename = basename.replace(':', '_')
# Windows doesn't like colons in paths
basename = basename.replace(':', '_')
full_path = os.path.join(backups, basename)
full_path = os.path.join(backups, basename)
pwndbg.ida.SaveBase(full_path)
pwndbg.ida.SaveBase(full_path)
data = open(full_path, 'rb').read()
data = open(full_path, 'rb').read()
# Compress!
full_path_compressed = full_path + '.bz2'
bz2.BZ2File(full_path_compressed, 'w').write(data)
# Compress!
full_path_compressed = full_path + '.bz2'
bz2.BZ2File(full_path_compressed, 'w').write(data)
# Remove old version
os.unlink(full_path)
# Remove old version
os.unlink(full_path)
save_ida()
save_ida()
class ida(gdb.Function):

Loading…
Cancel
Save