def rebase(info): functions, globals = map(utils.fcompose(sorted, list), (database.functions(), internal.netnode.alt.fiter(internal.comment.tagging.node()))) p = ui.Progress() p.update(current=0, title=u"Rebasing tagcache...", min=0, max=len(functions)+len(globals)) fcount = gcount = 0 scount = info.size() + 1 six.print_(u"{:s}.rebase({!s}) : Rebasing tagcache for {:d} segments.".format(__name__, utils.string.repr(info), scount)) # for each segment p.open() for si in six.moves.range(scount): msg = u"Rebasing tagcache for segment {:d} of {:d} : {:#x} ({:+#x}) -> {:#x}".format(si, scount, info[si]._from, info[si].size, info[si].to) p.update(title=msg), six.print_(msg) # for each function (using target address because ida moved the netnodes for us) res = [n for n in functions if info[si].to <= n < info[si].to + info[si].size] for i, fn in __rebase_function(info[si]._from, info[si].to, info[si].size, iter(res)): text = u"Function {:d} of {:d} : {:#x}".format(i + fcount, len(functions), fn) p.update(value=sum((fcount, gcount, i)), text=text) ui.navigation.procedure(fn) fcount += len(res) # for each global res = [(ea, count) for ea, count in globals if info[si]._from <= ea < info[si]._from + info[si].size] for i, ea in __rebase_globals(info[si]._from, info[si].to, info[si].size, iter(res)): text = u"Global {:d} of {:d} : {:#x}".format(i + gcount, len(globals), ea) p.update(value=sum((fcount, gcount, i)), text=text) ui.navigation.analyze(ea) gcount += len(res) p.close()
def __process_functions(percentage=0.10): p = ui.Progress() globals = set(internal.comment.globals.address()) total = 0 funcs = list(database.functions()) p.update(current=0, max=len(funcs), title=u"Pre-building tagcache...") p.open() six.print_(u"Pre-building tagcache for {:d} functions.".format(len(funcs))) for i, fn in enumerate(funcs): chunks = list(function.chunks(fn)) text = functools.partial(u"Processing function {:#x} ({chunks:d} chunk{plural:s}) -> {:d} of {:d}".format, fn, i + 1, len(funcs)) p.update(current=i) ui.navigation.procedure(fn) if i % (int(len(funcs) * percentage) or 1) == 0: six.print_(u"Processing function {:#x} -> {:d} of {:d} ({:.02f}%)".format(fn, i+1, len(funcs), i / float(len(funcs)) * 100.0)) contents = set(internal.comment.contents.address(fn)) for ci, (l, r) in enumerate(chunks): p.update(text=text(chunks=len(chunks), plural='' if len(chunks) == 1 else 's'), tooltip="Chunk #{:d} : {:#x} - {:#x}".format(ci, l, r)) ui.navigation.analyze(l) for ea in database.address.iterate(l, r): # FIXME: no need to iterate really since we should have # all of the addresses for k, v in six.iteritems(database.tag(ea)): if ea in globals: internal.comment.globals.dec(ea, k) if ea not in contents: internal.comment.contents.inc(ea, k, target=fn) total += 1 continue continue continue six.print_(u"Successfully built tag-cache composed of {:d} tag{:s}.".format(total, '' if total == 1 else 's')) p.close()