Esempio n. 1
0
	def _set_current_basic_block(self, ctxt, block):
		try:
			if block:
				func = core.BNGetBasicBlockFunction(block)
				if func is None:
					block = None
				else:
					block = basicblock.BasicBlock(binaryview.BinaryView(handle = core.BNGetFunctionData(func)), core.BNNewBasicBlockReference(block))
					core.BNFreeFunction(func)
			else:
				block = None
			self.perform_set_current_basic_block(block)
		except:
			log.log_error(traceback.format_exc())
Esempio n. 2
0
 def computeBasicBlocks(self):
     leaders = set([1, len(self.program)+1])
     for instr in self.program:
         if instr.isIfGoto() or instr.isGoto():
             leaders.add(instr.Target)
             leaders.add(instr.LineNo + 1)
         if instr.isCall() or instr.isReturn():
             leaders.add(instr.LineNo + 1)
         if instr.isLabel():
             leaders.add(instr.LineNo)
         if instr.isAssign() and instr.Op == tacinstr.TACInstr.CALLOP:
             leaders.add(instr.LineNo + 1)
     for leaderPair in pairwise(leaders):
         bb = basicblock.BasicBlock(self.program[leaderPair[0]-1:leaderPair[1]-1])
         self.basicBlocks.append(bb)
     for basicBlock in self.basicBlocks:
         translate.translateBlock(basicBlock)
Esempio n. 3
0
def find_basic_blocks(FILE_OPCODES, FILE_PC_OPCODES):
    separators = ['JUMPI', 'STOP', 'RETURN', 'SUICIDE', 'JUMP', 'JUMPDEST']
    basic_blocks = []
    init_pc = 0
    for opc_number in range(len(FILE_OPCODES)):
        opc = FILE_OPCODES[opc_number]
        if (opc.name in separators and init_pc != FILE_PC_OPCODES[opc_number]):
            dest = []
            if (opc.name == 'JUMPDEST'):
                dest.append(FILE_PC_OPCODES[opc_number] + 1)
            elif (opc.name == 'JUMP'
                  and re.search('PUSH*', FILE_OPCODES[opc_number - 1].name)):
                dest.append(FILE_OPCODES[opc_number - 1].par)
            elif (opc.name == 'JUMPI'
                  and re.search('PUSH*', FILE_OPCODES[opc_number - 1].name)):
                dest.append(FILE_PC_OPCODES[opc_number] + 1)
                dest.append(FILE_OPCODES[opc_number - 1].par)
            pc = FILE_PC_OPCODES[opc_number]
            basic_blocks.append(
                basicblock.BasicBlock(init_pc, pc, opc.name, dest))
            init_pc = FILE_PC_OPCODES[opc_number + 1]
    return basic_blocks
def create_small_scope_graph() :
    #created after page 74 of "A modular tool architecure..."
    
    main=sg.ScopeGraph("main")
    foo = sg.ScopeGraph("foo")
    
    outer = sg.ScopeGraph('outer')
    
    inner = sg.ScopeGraph('inner')
    
    loop = sg.ScopeGraph('loop')
    
    #Create loop
    
    #Create basic blocks and add children
    main_bb = babl.BasicBlock("main", "H", 1)
    main_bb.add_children(["outer","foo"])
    outer_bb = babl.BasicBlock("outer", "I", 10)
    outer_bb.add_children(["inner"])
    inner_bb = babl.BasicBlock("inner", "J", 20)
    foo_bb = babl.BasicBlock("foo", "A", 1)
    foo_bb.add_children(["loop"])
    loop_bb = babl.BasicBlock("loop", "C", 10)
  
    
    #Create loop
    loop.add_nodes(["start","B", "C","D", "E","F", "exit"])
    loop.add_path(["B", "C","D", "E","F", "B"])   
    loop.add_edge("start", "C")
    loop.add_edge("C", "exit")
    loop.add_edge("D", "F")
    loop.add_edge("F", "exit")
    loop.report()
    
    #Create foo
    foo.add_nodes(["start","A", loop, "G", "exit"])
    foo.add_path(["start","A", loop,"G", "exit"])    
    #foo.report()
     
    #Create inner
    inner.add_nodes(["start", "J", "K", "L", "M", "N", "O", "P", "Q", "exit"])
    inner.add_path(["start", "J", "K", "M", "N", "P", "Q", "J"])
    inner.add_edge("J", "exit")
    inner.add_edge("K", "L")
    inner.add_edge("N", "O")
    inner.report()
    
    #Creating main 
    main.add_node("start")
    main.add_node("H",)
    
  

    main.add_scope(outer,"name", )
    main.add_node("S")
    main.add_scope(foo)
    main.add_node("T")
    main.add_node("end")
    main.add_path([start,H,outer,S,foo,T,end])
    
    
    
    loop = lg.create_simple_loop()
    #loop2 = lg.create_simple_loop()

    #simplebb = babl.BasicBlock("loop", "C", 10)
    #simplebb2 = babl.BasicBlock("foo", "A", 1)
    
    
    #simplebb.report()
    #SG.add_scope(loop, loop.name, simplebb)
    #SG.add_scope(loop2, loop2.name, simplebb2)
    
    #SG.add_edge(loop, loop2)

    #SG.add_bb_scope(loop, simplebb) #not sure if needed
    
    return SG