def generateDot(self, func=None): if func is None: return self.pyew.callgraph.toDot() dot = CDotDiagram() if func is None: ep = self.pyew.ep else: ep = func if func is None: try: l = self.pyew.exports.keys() l.append(self.pyew.ep) except: print "Error:", sys.exc_info()[1] l = [self.pyew.ep] else: l = [ep] functions = [] for ep in l: if self.pyew.functions.has_key(ep): fep = self.pyew.functions[ep] for c in fep.connections: if c in self.pyew.functions: if c not in functions: functions.append(c) n1 = CNode(self.pyew.names[ep], self.pyew.names[ep]) n2 = CNode(self.pyew.names[c], self.pyew.names[c]) dot.addConnectedNode(n1, n2) dones = [] while len(functions) > 0: addr = functions.pop() f = self.pyew.functions[addr] for c in f.connections: if c in self.pyew.functions and c not in dones: functions.append(c) dones.append(c) n1 = CNode(self.pyew.names[addr], self.pyew.names[addr]) n2 = CNode(self.pyew.names[c], self.pyew.names[c]) dot.addConnectedNode(n1, n2) x = dot.generateDot() return x
def generateDot(self, f): dot = CDotDiagram() func = self.pyew.functions[f] bbs = {} nodes = {} for bb in func.basic_blocks: instructions = [] bb_start = bb.instructions[0].offset end_offset = bb.instructions[-1].offset bb_end = end_offset + bb.instructions[-1].size buf = self.pyew.getBytes(bb_start, bb_end - bb_start) instructions = self.pyew.disassemble(buf=buf, baseoffset=bb_start, marker=False) instructions = instructions.replace("\r", "").replace("\n", "\\l") instructions = instructions.replace('"', '\"') bbs[bb_start] = instructions bbs[end_offset] = instructions n = CNode(bb.offset, instructions) dot.addNode(n) nodes[bb.offset] = n for bb in func.basic_blocks: for conn in bb.connections: a, b = conn next_head = self.pyew.NextHead(bb.instructions[-1].offset) if nodes.has_key(b) and nodes.has_key(bb.offset): if len(bb.connections) == 1: color = "blue" elif next_head == b: color = "red" else: color = "green" dot.addConnectedNode(nodes[bb.offset], nodes[b], color) return dot.generateDot()
def generateDot(self, f): dot = CDotDiagram() func = self.pyew.functions[f] bbs = {} nodes = {} for bb in func.basic_blocks: instructions = [] bb_start = bb.instructions[0].offset end_offset = bb.instructions[-1].offset bb_end = end_offset + bb.instructions[-1].size buf = self.pyew.getBytes(bb_start, bb_end-bb_start) instructions = self.pyew.disassemble(buf=buf, baseoffset=bb_start, marker=False) instructions = instructions.replace("\r", "").replace("\n", "\\l") instructions = instructions.replace('"', '\"') bbs[bb_start] = instructions bbs[end_offset] = instructions n = CNode(bb.offset, instructions) dot.addNode(n) nodes[bb.offset] = n for bb in func.basic_blocks: for conn in bb.connections: a, b = conn next_head = self.pyew.NextHead(bb.instructions[-1].offset) if nodes.has_key(b) and nodes.has_key(bb.offset): if len(bb.connections) == 1: color = "blue" elif next_head == b: color = "red" else: color = "green" dot.addConnectedNode(nodes[bb.offset], nodes[b], color) return dot.generateDot()