refactoring r2 analyzer so it can work with 'p' command

This commit is contained in:
pwntester 2014-11-13 13:17:47 -08:00
parent f66f4856ae
commit 31e5fea20b
2 changed files with 36 additions and 32 deletions

View File

@ -122,7 +122,7 @@ class Program:
# init static
if qira_config.WITH_STATIC:
self.static.process()
# no traces yet
self.traces = {}
self.runnable = False

View File

@ -3,43 +3,47 @@ import re
def analyze_functions(static):
rc = static.r2core
flags = rc.cmd_json("fj")
for flag in flags:
if "loc_" in flag['name']:
static._auto_update_name(flag['offset'],flag['name'])
functions = rc.cmd_json("afj")
for function in functions:
name = function['name']
if "sym.imp." not in name:
addr = function['offset']
callrefs = function['callrefs']
this_function = Function(addr)
static['functions'].add(this_function)
functions = rc.cmd("afl~!sym.imp[0]").split('\n')
for addr_s in functions:
try:
addr = int(addr_s[2:],16)
make_function_at(static, addr)
except:
pass
def make_function_at(static, addr):
rc = static.r2core
this_function = Function(addr)
static['functions'].add(this_function)
for ref in callrefs:
if ref["type"] == "J":
static[ref['addr']]['crefs'].add(addr)
if ref["type"] == "C":
static[ref['addr']]['xrefs'].add(addr)
info = rc.cmd_json("afj %d" % (addr,))[0]
callrefs = info['callrefs']
for ref in callrefs:
if ref["type"] == "J":
static[ref['addr']]['crefs'].add(addr)
if ref["type"] == "C":
static[ref['addr']]['xrefs'].add(addr)
function_details = rc.cmd_json("pdfj @ %d" % addr)
if function_details['addr'] == addr:
for opcode in function_details['ops']:
static[opcode['offset']]['function'] = this_function
i = static[opcode['offset']]['instruction']
function_details = rc.cmd_json("pdfj @ %d" % addr)
if function_details['addr'] == addr:
for opcode in function_details['ops']:
static[opcode['offset']]['function'] = this_function
i = static[opcode['offset']]['instruction']
addr_re = re.compile(r'\| (0x[a-f0-9]+) ')
blocks = rc.cmd_json("agj %d" % addr)[0]['blocks']
for block in blocks:
this_block = Block(block['offset'])
this_function.add_block(this_block)
addresses = addr_re.findall(block['code'])
for address in addresses:
address = int(address[2:],16)
this_block.add(address)
static[address]['block'] = this_block
static['blocks'].add(this_block)
addr_re = re.compile(r'\| (0x[a-f0-9]+) ')
blocks = rc.cmd_json("agj %d" % addr)[0]['blocks']
for block in blocks:
this_block = Block(block['offset'])
this_function.add_block(this_block)
addresses = addr_re.findall(block['code'])
for address in addresses:
address = int(address[2:],16)
this_block.add(address)
static[address]['block'] = this_block
static['blocks'].add(this_block)