def getDependencySet(self): deps = database.procInfo(self.targetAddr).depset reads = set(deps.reads) for r in regutil.joinRegisters(reads): if r in self.constant_params: reads -= regutil.splitRegister(r) return depend.DependencySet(reads, deps.writes)
def getSubgraph(start_points): queue = set(start_points) verts = set() import database while queue: x = queue.pop() if x in verts: continue verts.add(x) info = database.procInfo(x) for c in info.calls: queue.add(c) return verts
def save_dot(procs): with open('data/graph.dot', 'w') as f: f.write("digraph crossref {\n") for addr in procs: tags = '' import database info = database.procInfo(addr) if info.has_switch: tags += ' switch' if info.suspicious_switch: tags += ' suspicious_switch' if info.has_nop: tags += ' nop' if info.has_ambig_calls: tags += ' ambig_calls' if info.has_suspicious_instr: tags += ' suspicious' f.write(' ' + addr_symbol(addr) + ' [label="' + tag.nameForAddress(addr) + tags + '"];\n') if tags: f.write(' ' + addr_symbol(addr) + ' [color="green"];\n') """"q = len(procedure.at(addr).instructions) if q < 32: intensity = 0 elif q < 128: intensity = 64 elif q < 512: intensity = 128 elif q < 2048: intensity = 192 else: intensity = 255 """ intensity = 0 f.write(' ' + addr_symbol(addr) + ' [fillcolor="#FF{0:02x}{0:02x}"];\n'.format(255-intensity)) f.write(' ' + addr_symbol(addr) + ' [style="filled"];\n') for c in info.calls: f.write(' ' + addr_symbol(addr) + ' -> ' + addr_symbol(c) + ';\n') f.write("}\n")
def update_info(proc): print "Updating info for", proc.addr info = database.procInfo(proc.addr) info.depset = proc.getDependencySet() info.has_switch = proc.has_switch info.suspicious_switch = proc.suspicious_switch info.has_suspicious_instr = proc.has_suspicious_instr info.has_nop = proc.has_nop info.has_ambig_calls = proc.has_ambig_calls info.length = proc.length # info.is_current = all(database.procInfo(sub).is_current for sub in proc.calls()) info.calls = proc.calls() info.tail_calls = proc.tailCalls() info.memreads = proc.memreads info.memwrites = proc.memwrites info.save()