def arm_guess_subcall( mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool): ira = get_ira(mnemo, attrib) sp = asm_symbol_pool() ir_arch = ira(sp) print '###' print cur_bloc ir_arch.add_bloc(cur_bloc) ir_blocs = ir_arch.blocs.values() # flow_graph = DiGraph() to_add = set() for irb in ir_blocs: # print 'X'*40 # print irb pc_val = None lr_val = None for exprs in irb.irs: for e in exprs: if e.dst == ir_arch.pc: pc_val = e.src if e.dst == mnemo.regs.LR: lr_val = e.src if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = cur_bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue # print 'IS CALL!' l = symbol_pool.getby_offset_create(int(lr_val)) c = asm_constraint_next(l) to_add.add(c) offsets_to_dis.add(int(lr_val)) # if to_add: # print 'R'*70 for c in to_add: # print c cur_bloc.addto(c)
def arm_guess_subcall(mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool): ira = get_ira(mnemo, attrib) sp = asm_symbol_pool() ir_arch = ira(sp) print '###' print cur_bloc ir_arch.add_bloc(cur_bloc) ir_blocs = ir_arch.blocs.values() # flow_graph = DiGraph() to_add = set() for irb in ir_blocs: # print 'X'*40 # print irb pc_val = None lr_val = None for exprs in irb.irs: for e in exprs: if e.dst == ir_arch.pc: pc_val = e.src if e.dst == mnemo.regs.LR: lr_val = e.src if pc_val is None or lr_val is None: continue if not isinstance(lr_val, ExprInt): continue l = cur_bloc.lines[-1] if lr_val.arg != l.offset + l.l: continue # print 'IS CALL!' l = symbol_pool.getby_offset_create(int(lr_val)) c = asm_constraint_next(l) to_add.add(c) offsets_to_dis.add(int(lr_val)) # if to_add: # print 'R'*70 for c in to_add: # print c cur_bloc.addto(c)
### Link the bad block and update edges ### Indeed, a sub-element has been modified (bto from a block from blocks) my_block.bto.add(asm_constraint_to(my_bad_block.label)) blocks.rebuild_edges() assert list(blocks.get_bad_blocks_predecessors()) == [my_block] ### Test strict option my_block.bto.add(asm_constraint_to(my_block.label)) blocks.rebuild_edges() assert list(blocks.get_bad_blocks_predecessors(strict=False)) == [my_block] assert len(list(blocks.get_bad_blocks_predecessors(strict=True))) == 0 ## Sanity check blocks.sanity_check() ### Next on itself my_block_ni = asm_bloc(asm_label("testlabel_nextitself")) my_block_ni.bto.add(asm_constraint_next(my_block_ni.label)) blocks.add_node(my_block_ni) error_raised = False try: blocks.sanity_check() except RuntimeError: error_raised = True assert error_raised ### Back to a normal state blocks.del_node(my_block_ni) blocks.sanity_check() ### Multiple next on the same node my_block_target = asm_bloc(asm_label("testlabel_target")) blocks.add_node(my_block_target) my_block_src1 = asm_bloc(asm_label("testlabel_src1")) my_block_src2 = asm_bloc(asm_label("testlabel_src2"))