def intra_bloc_flow_raw(ir_arch, flow_graph, irb): """ Create data flow for an irbloc using raw IR expressions """ in_nodes = {} out_nodes = {} current_nodes = {} for i, assignblk in enumerate(irb.irs): dict_rw = assignblk.get_rw(cst_read=True) if irb.label.offset == 0x13: print irb.label print i print dict_rw current_nodes.update(out_nodes) # gen mem arg to mem node links all_mems = set() for node_w, nodes_r in dict_rw.iteritems(): for n in nodes_r.union([node_w]): all_mems.update(get_expr_mem(n)) if not all_mems: continue for n in all_mems: node_n_w = get_node_name(irb.label, i, n) if not n in nodes_r: continue o_r = n.arg.get_r(mem_read=False, cst_read=True) for n_r in o_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irb.label, i, n_r) current_nodes[n_r] = node_n_r in_nodes[n_r] = node_n_r flow_graph.add_uniq_edge(node_n_r, node_n_w) # gen data flow links for node_w, nodes_r in dict_rw.iteritems(): for n_r in nodes_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irb.label, i, n_r) current_nodes[n_r] = node_n_r in_nodes[n_r] = node_n_r flow_graph.add_node(node_n_r) node_n_w = get_node_name(irb.label, i + 1, node_w) out_nodes[node_w] = node_n_w flow_graph.add_node(node_n_w) flow_graph.add_uniq_edge(node_n_r, node_n_w) irb.in_nodes = in_nodes irb.out_nodes = out_nodes
def intra_bloc_flow_symb(ir_arch, flow_graph, irbloc): symbols_init = ir_arch.arch.regs.regs_init.copy() sb = symbexec(ir_arch, symbols_init) sb.emulbloc(irbloc) print '*' * 40 print irbloc in_nodes = {} out_nodes = {} out = get_modified_symbols(sb) current_nodes = {} # Gen mem arg to mem node links for dst, src in out.items(): for n in [dst, src]: all_mems = set() all_mems.update(get_expr_mem(n)) for n in all_mems: node_n_w = get_node_name(irbloc.label, 0, n) if not n == src: continue o_r = n.arg.get_r(mem_read=False, cst_read=True) for i, n_r in enumerate(o_r): if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irbloc.label, i, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_uniq_edge(node_n_r, node_n_w) # Gen data flow links for dst, src in out.items(): nodes_r = src.get_r(mem_read=False, cst_read=True) nodes_w = set([dst]) for n_r in nodes_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irbloc.label, 0, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_node(node_n_r) for n_w in nodes_w: node_n_w = get_node_name(irbloc.label, 1, n_w) out_nodes[n_w] = node_n_w flow_graph.add_node(node_n_w) flow_graph.add_uniq_edge(node_n_r, node_n_w) irbloc.in_nodes = in_nodes irbloc.out_nodes = out_nodes
def intra_bloc_flow_raw(ir_arch, flow_graph, irb): """ Create data flow for an irbloc using raw IR expressions """ in_nodes = {} out_nodes = {} current_nodes = {} for i, exprs in enumerate(irb.irs): list_rw = get_list_rw(exprs) current_nodes.update(out_nodes) # gen mem arg to mem node links all_mems = set() for nodes_r, nodes_w in list_rw: for n in nodes_r.union(nodes_w): all_mems.update(get_expr_mem(n)) if not all_mems: continue # print [str(x) for x in all_mems] for n in all_mems: node_n_w = get_node_name(irb.label, i, n) if not n in nodes_r: continue o_r = n.arg.get_r(mem_read=False, cst_read=True) for n_r in o_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irb.label, i, n_r) current_nodes[n_r] = node_n_r in_nodes[n_r] = node_n_r flow_graph.add_uniq_edge(node_n_r, node_n_w) # gen data flow links for nodes_r, nodes_w in list_rw: for n_r in nodes_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irb.label, i, n_r) current_nodes[n_r] = node_n_r in_nodes[n_r] = node_n_r flow_graph.add_node(node_n_r) for n_w in nodes_w: node_n_w = get_node_name(irb.label, i + 1, n_w) out_nodes[n_w] = node_n_w # current_nodes[n_w] = node_n_w flow_graph.add_node(node_n_w) flow_graph.add_uniq_edge(node_n_r, node_n_w) irb.in_nodes = in_nodes irb.out_nodes = out_nodes
def intra_bloc_flow_symb(ir_arch, flow_graph, irblock): symbols_init = ir_arch.arch.regs.regs_init.copy() sb = SymbolicExecutionEngine(ir_arch, symbols_init) sb.emulbloc(irblock) print '*' * 40 print irblock in_nodes = {} out_nodes = {} out = get_modified_symbols(sb) current_nodes = {} # Gen mem arg to mem node links for dst, src in out.items(): for n in [dst, src]: all_mems = set() all_mems.update(get_expr_mem(n)) for n in all_mems: node_n_w = get_node_name(irblock.label, 0, n) if not n == src: continue o_r = n.arg.get_r(mem_read=False, cst_read=True) for i, n_r in enumerate(o_r): if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irblock.label, i, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_uniq_edge(node_n_r, node_n_w) # Gen data flow links for dst, src in out.items(): nodes_r = src.get_r(mem_read=False, cst_read=True) nodes_w = set([dst]) for n_r in nodes_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irblock.label, 0, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_node(node_n_r) for n_w in nodes_w: node_n_w = get_node_name(irblock.label, 1, n_w) out_nodes[n_w] = node_n_w flow_graph.add_node(node_n_w) flow_graph.add_uniq_edge(node_n_r, node_n_w) irblock.in_nodes = in_nodes irblock.out_nodes = out_nodes
def intra_block_flow_symb(ir_arch, _, flow_graph, irblock, in_nodes, out_nodes): symbols_init = ir_arch.arch.regs.regs_init.copy() sb = SymbolicExecutionEngine(ir_arch, symbols_init) sb.eval_updt_irblock(irblock) print '*' * 40 print irblock out = sb.modified(mems=False) current_nodes = {} # Gen mem arg to mem node links for dst, src in out: src = sb.eval_expr(dst) for n in [dst, src]: all_mems = set() all_mems.update(get_expr_mem(n)) for n in all_mems: node_n_w = get_node_name(irblock.loc_key, 0, n) if not n == src: continue o_r = n.ptr.get_r(mem_read=False, cst_read=True) for i, n_r in enumerate(o_r): if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irblock.loc_key, i, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_uniq_edge(node_n_r, node_n_w) # Gen data flow links for dst in out: src = sb.eval_expr(dst) nodes_r = src.get_r(mem_read=False, cst_read=True) nodes_w = set([dst]) for n_r in nodes_r: if n_r in current_nodes: node_n_r = current_nodes[n_r] else: node_n_r = get_node_name(irblock.loc_key, 0, n_r) if not n_r in in_nodes: in_nodes[n_r] = node_n_r flow_graph.add_node(node_n_r) for n_w in nodes_w: node_n_w = get_node_name(irblock.loc_key, 1, n_w) out_nodes[n_w] = node_n_w flow_graph.add_node(node_n_w) flow_graph.add_uniq_edge(node_n_r, node_n_w)