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)
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
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)
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)
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