def arm_guess_subcall( mnemo, attrib, pool_bin, cur_bloc, offsets_to_dis, symbol_pool): ira = get_ira(mnemo, attrib) sp = AsmSymbolPool() ir_arch = ira(sp) print '###' print cur_bloc ir_arch.add_block(cur_bloc) ir_blocks = ir_arch.blocks.values() # flow_graph = DiGraph() to_add = set() for irblock in ir_blocks: # print 'X'*40 # print irblock pc_val = None lr_val = None for exprs in irblock: 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 = AsmConstraintNext(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, loc_db): ira = get_ira(mnemo, attrib) sp = LocationDB() ir_arch = ira(sp) ircfg = ira.new_ircfg() print '###' print cur_bloc ir_arch.add_asmblock_to_ircfg(cur_bloc, ircfg) ir_blocks = ircfg.blocks.values() to_add = set() for irblock in ir_blocks: pc_val = None lr_val = None for exprs in irblock: 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 l = loc_db.get_or_create_offset_location(int(lr_val)) c = AsmConstraintNext(l) to_add.add(c) offsets_to_dis.add(int(lr_val)) for c in to_add: 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(AsmConstraintTo(my_bad_block.label)) blocks.rebuild_edges() assert list(blocks.get_bad_blocks_predecessors()) == [my_block] ### Test strict option my_block.bto.add(AsmConstraintTo(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 = AsmBlock(AsmLabel("testlabel_nextitself")) my_block_ni.bto.add(AsmConstraintNext(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 = AsmBlock(AsmLabel("testlabel_target")) blocks.add_node(my_block_target) my_block_src1 = AsmBlock(AsmLabel("testlabel_src1")) my_block_src2 = AsmBlock(AsmLabel("testlabel_src2"))