Add search command, reduce load on IDA symbol loading

pull/3/head
Zach Riggle 11 years ago
parent 63245f68cb
commit 93b1810225

@ -10,6 +10,7 @@ ptrmask = 0xfffffffff
endian = 'little'
ptrsize = pwndbg.types.ptrsize
fmt = '=i'
disasm = lambda: None
@pwndbg.events.stop
def update():
@ -31,6 +32,8 @@ def update():
(8, 'big'): '>Q',
}.get((m.ptrsize, m.endian))
m.disasm = gdb.selected_frame().architecture().disassemble
def pack(integer):
return struct.pack(fmt, integer & ptrmask)

@ -1,12 +1,28 @@
import gdb
import os
import struct
import pwndbg.commands
import pwndbg.search
import pwndbg.enhance
import pwndbg.color
import pwndbg.vmmap
@pwndbg.commands.Command
@pwndbg.commands.OnlyWhenRunning
def search(value):
for address in pwndbg.search.search(value):
print(pwndbg.color.get(address), pwndbg.enhance.enhance(address))
if not address:
continue
vmmap = pwndbg.vmmap.find(address)
if vmmap:
region = os.path.basename(vmmap.objfile)
else:
region = '[mapped]'
region = region.ljust(15)
region = pwndbg.color.get(address, region)
addr = pwndbg.color.get(address)
display = pwndbg.enhance.enhance(address)
print(region,addr,display)

@ -2,12 +2,20 @@ import gdb
import collections
import pwndbg.color
import pwndbg.disasm_powerpc
import pwndbg.memory
import pwndbg.arch
Instruction = collections.namedtuple('Instruction', ['address', 'length', 'asm'])
def get(address, instructions=1):
address = int(address)
raw = gdb.selected_frame().architecture().disassemble(address, address+0xffffffff, instructions)
# Dont disassemble if there's no memory
if not pwndbg.memory.peek(address):
return []
raw = pwndbg.arch.disasm(address, address+0xffffffff, instructions)
retval = []
for insn in raw:
retval.append(Instruction(insn['addr'],insn['length'], insn['asm']))
@ -25,6 +33,9 @@ def near(address, instructions=1):
insns = []
while start < address:
insns = get(start, instructions)
if not insns:
return []
last = insns[-1]
if last.address + last.length == address:

@ -3,6 +3,7 @@ import pwndbg.memoize
import pwndbg.memory
import pwndbg.stack
import pwndbg.ida
import pwndbg.elf
@pwndbg.memoize.reset_on_objfile
def get(address):
@ -21,8 +22,13 @@ def get(address):
result = gdb.execute('info symbol %#x' % int(address), to_string=True, from_tty=False)
if result.startswith('No symbol'):
res = pwndbg.ida.Name(address) or pwndbg.ida.GetFuncOffset(address)
return res or ''
address = int(address)
exe = pwndbg.elf.exe()
if exe:
exe_map = pwndbg.vmmap.find(exe.address)
if address in exe_map:
res = pwndbg.ida.Name(address) or pwndbg.ida.GetFuncOffset(address)
return res or ''
# Expected format looks like this:
# main in section .text of /bin/bash

Loading…
Cancel
Save