Beispiel #1
0
 def initView(self):
     cfg = self.func.cfg
     vertexs = {}
     done = set()
     for block in cfg.blocks:
         if block in done:
             continue
         done.add(block)
         startLockey = block.loc_key
         endLockey = block.loc_key
         blocks = [block]
         while (block.lines[-1].name == 'CALL') and (len(cfg.predecessors(block.get_next())) == 1):
             nextLockey = block.get_next()
             if block.loc_key in cfg.successors(nextLockey):
                 break
             block = cfg.loc_key_to_block(nextLockey)
             blocks.append(block)
             endLockey = block.loc_key
             done.add(block)
         vertex = Vertex(startLockey)
         vertexs[startLockey] = vertex
         vertex.view = AsmBlockView(startLockey, endLockey, blocks, self.func)
     edges = []
     for src in vertexs.values():
         successLocKeys = cfg.successors(src.view.endLockey)
         for key in successLocKeys:
             vSrc = vertexs[src.view.lockey]
             vDst = vertexs[key]
             edge = Edge(vSrc, vDst)
             edge.view = BasicEdge(vDst)
             edges.append(edge)
             vSrc.view.outBlocks.append(vDst.view)
             vDst.view.inBlocks.append(vSrc.view)
     self.graph = Graph(vertexs.values(), edges)
     sugLayout = SugiyamaLayout(self.graph.C[0])
     sugLayout.route_edge = route_with_lines
     sugLayout.init_all()
     sugLayout.draw()
     for v in vertexs.values():
         self.addBlock(v.view, v.view.xy[0] - (v.view.w / 2), v.view.xy[1] - (v.view.h / 2))
         v.view.gotoAddress.connect(self.selectAddress)
     for e in edges:
         srcView = e.v[0].view
         srcBlock = e.v[0].data
         dstBlock = e.v[1].data
         if len(srcView.outBlocks) == 1:
             color = Qt.darkBlue
         elif dstBlock == cfg.successors(srcBlock)[0]:
             color = Qt.darkRed
         else:
             color = Qt.darkGreen
         edge_view = e.view
         edge_view.color = color
         self.scene.addItem(edge_view)
Beispiel #2
0
def create_scenario():
    '''
    Create something as:
    v4      v0
     \     / |
      \   v1 |
       \ /   |
       v5   /
        \  /
        v2
        |
        v3
    '''
    E = []
    data_to_vertex = {}

    vertices = []
    for i in range(6):
        data = 'v%s' % (i, )
        v = Vertex(data)
        data_to_vertex[data] = v
        v.view = VertexViewer(100, 50)
        vertices.append(v)

    edge = Edge(vertices[0], vertices[1])
    edge.view = EdgeViewer()
    E.append(edge)

    edge = Edge(vertices[0], vertices[2])
    edge.view = EdgeViewer()
    E.append(edge)

    edge = Edge(vertices[1], vertices[5])
    edge.view = EdgeViewer()
    E.append(edge)

    edge = Edge(vertices[2], vertices[3])
    edge.view = EdgeViewer()
    E.append(edge)

    edge = Edge(vertices[4], vertices[5])
    edge.view = EdgeViewer()
    E.append(edge)

    edge = Edge(vertices[5], vertices[2])
    edge.view = EdgeViewer()
    E.append(edge)

    G = Graph(vertices, E)
    assert len(G.C) == 1
    gr = G.C[0]

    # not needed anymore...
    #r = filter(lambda x: len(x.e_in()) == 0, gr.sV)
    #if len(r) == 0:
    #    r = [gr.sV[0]]
    return gr, data_to_vertex
Beispiel #3
0
def ida2Graph(ast):
    V={}
    E=[]
    # create Vertex and Vertex.view for each node in ast :
    for k,x in ast.nodes.iteritems():
        try:
            label = x.label
        except AttributeError:
            label = x.title
        v = idanode(label)
        V[x.title] = v
    edgelist = []
    # create Edge and Edge_basic for each edge in ast:
    for e in ast.edges:
        v1 = V[e.sourcename]
        v2 = V[e.targetname]
        e = Edge(v1,v2)
        e.view = Edge_curve(v1.view,v2.view,head=True)
        e.view.props.line_width = 2
        E.append(e)
    return Graph(V.values(),E)
Beispiel #4
0
def ast2Graph(ast):
    V={}
    E=[]
    # create Vertex and Vertex.view for each node in ast :
    for k,x in ast.nodes.iteritems():
        try:
            label = x.attr['label']
        except (KeyError,AttributeError):
            label = x.name
        v = dotnode(label)
        V[x.name] = v
    edgelist = []
    # create Edge and Edge_basic for each edge in ast:
    for e in ast.edges: edgelist.append(e)
    for edot in edgelist:
        v1 = V[edot.n1.name]
        v2 = V[edot.n2.name]
        e = Edge(v1,v2)
        e.view = Edge_basic(v1.view,v2.view,head=ast.direct)
        e.view.props.line_width = 2
        E.append(e)
    return Graph(V.values(),E,directed=ast.direct)
Beispiel #5
0
 def initView(self):
     vertexs = {}
     for lockey, block in self.ircfg.blocks.items():
         vertexs[lockey] = Vertex(block)
         vertexs[lockey].view = IRBlockView(lockey, block, False)
     edges = []
     for src in vertexs:
         successLocKeys = self.ircfg.successors(src)
         for key in successLocKeys:
             if key in vertexs:
                 vSrc = vertexs[src]
                 vDst = vertexs[key]
                 edge = Edge(vSrc, vDst)
                 edge.view = BasicEdge(vDst)
                 edges.append(edge)
                 vSrc.view.outBlocks.append(vDst.view)
                 vDst.view.inBlocks.append(vSrc.view)
     self.graph = Graph(vertexs.values(), edges)
     sugLayout = SugiyamaLayout(self.graph.C[0])
     sugLayout.route_edge = route_with_lines
     sugLayout.init_all()
     sugLayout.draw()
     for v in vertexs.values():
         self.addBlock(v.view, v.view.xy[0] - (v.view.w / 2), v.view.xy[1] - (v.view.h / 2))
     for e in edges:
         srcView = e.v[0].view
         srcBlock = e.v[0].data
         dstBlock = e.v[1].data
         if len(srcView.outBlocks) == 1:
             color = Qt.darkBlue
         elif dstBlock.loc_key == self.ircfg.successors(srcBlock.loc_key)[0]:
             color = Qt.darkRed
         else:
             color = Qt.darkGreen
         edge_view = e.view
         edge_view.color = color
         self.scene.addItem(edge_view)
    def _layout_nodes_and_edges(self, start):
        """
        Compute coordinates for all CFG nodes and edges in the view

        :param int start: The starting address
        :return: a mapping between nodes' names and their coordinates (dict), and a list of edge coordinates (list)
        :rtype: tuple
        """

        coordinates = {}
        node_map = {}

        # Create the map
        for child in self.children():
            if not isinstance(child, QtContainer):
                continue
            node_map[child.declaration.addr] = child

        if start not in node_map:
            return { }

        vertices = {}
        edges = [ ]
        # Create all edges
        for s, d in self.declaration.edges:
            src, dst = int(s), int(d)
            if src in vertices:
                src_v = vertices[src]
            else:
                src_v = Vertex(src)
                vertices[src] = src_v

            if dst in vertices:
                dst_v = vertices[dst]
            else:
                dst_v = Vertex(dst)
                vertices[dst] = dst_v

            edge = Edge(src_v, dst_v)
            edge.view = EdgeViewer()
            edges.append(edge)

        # Create all vertices
        for child in self.children():
            addr = child.declaration.addr
            if addr not in vertices:
                vertices[addr] = Vertex(addr)

        g = Graph(vertices.values(), edges)

        # create a view for each node
        for addr, vertex in vertices.iteritems():
            node = node_map[addr]
            width, height = node._layout_manager.best_size()
            vertex.view = VertexViewer(width, height)

        sug = SugiyamaLayout(g.C[0])
        sug.route_edge = self._route_edges
        sug.init_all(roots=[vertices[start]])
        sug.draw()

        # extract coordinates for nodes
        for addr, vertex in vertices.iteritems():
            x, y = vertex.view.xy
            # Convert the center coordinate to left corner coordinate
            coordinates[addr] = (x - vertex.view.w / 2, y - vertex.view.h / 2)

        # extract coordinates for edges
        edge_coordinates = [ ]
        for edge in edges:
            if hasattr(edge.view, '_pts'):
                edge_coordinates.append(edge.view._pts)

        return coordinates, edge_coordinates