Ejemplo n.º 1
0
 def buildCallGraph(self):
     g = CGraph()
     ep = self.pyew.ep
     
     try:
         l = set(self.pyew.exports.keys())
         l.add(self.pyew.ep)
     except:
         print "Error:", sys.exc_info()[1]
         l = set([self.pyew.ep])
         raise
     
     functions = []
     nodes = {}
     
     """ Compute the entry points initial graph """
     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)
                     
                     if self.pyew.names[ep] not in nodes:
                         n1 = CNode(self.pyew.names[ep])
                         nodes[self.pyew.names[ep]] = n1
                     else:
                         n1 = nodes[self.pyew.names[ep]]
                     
                     if self.pyew.names[c] not in nodes:
                         n2 = CNode(self.pyew.names[c])
                         nodes[self.pyew.names[c]] = n2
                     else:
                         n2 = nodes[self.pyew.names[c]]
                     g.addEdge(n1, n2)
     
     """ Add all the remaining functions """
     dones = set()
     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.add(c)
                 
                 if self.pyew.names[addr] not in nodes:
                     n1 = CNode(self.pyew.names[addr])
                     nodes[self.pyew.names[addr]] = n1
                 else:
                     n1 = nodes[self.pyew.names[addr]]
                 
                 if self.pyew.names[c] not in nodes:
                     n2 = CNode(self.pyew.names[c])
                     nodes[self.pyew.names[c]] = n2
                 else:
                     n2 = nodes[self.pyew.names[c]]
                 g.addEdge(n1, n2)
     return g
Ejemplo n.º 2
0
 def buildCallGraph(self):
     g = CGraph()
     ep = self.pyew.ep
     
     try:
         l = set(self.pyew.exports.keys())
         l.add(self.pyew.ep)
     except:
         print "Error:", sys.exc_info()[1]
         l = set([self.pyew.ep])
         raise
     
     functions = []
     nodes = {}
     
     """ Compute the entry points initial graph """
     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)
                     
                     if self.pyew.names[ep] not in nodes:
                         n1 = CNode(self.pyew.names[ep])
                         nodes[self.pyew.names[ep]] = n1
                     else:
                         n1 = nodes[self.pyew.names[ep]]
                     
                     if self.pyew.names[c] not in nodes:
                         n2 = CNode(self.pyew.names[c])
                         nodes[self.pyew.names[c]] = n2
                     else:
                         n2 = nodes[self.pyew.names[c]]
                     g.addEdge(n1, n2)
     
     """ Add all the remaining functions """
     dones = set()
     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.add(c)
                 
                 if self.pyew.names[addr] not in nodes:
                     n1 = CNode(self.pyew.names[addr])
                     nodes[self.pyew.names[addr]] = n1
                 else:
                     n1 = nodes[self.pyew.names[addr]]
                 
                 if self.pyew.names[c] not in nodes:
                     n2 = CNode(self.pyew.names[c])
                     nodes[self.pyew.names[c]] = n2
                 else:
                     n2 = nodes[self.pyew.names[c]]
                 g.addEdge(n1, n2)
     return g
Ejemplo n.º 3
0
 def buildFlowGraph(self, f):
     fg = CGraph()
     func = self.pyew.functions[f]
     bbs = {}
     nodes = {}
     for bb in func.basic_blocks:
         instructions = set()
         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.split("\n")
         if instructions[-1] == "":
             del instructions[len(instructions)-1]
         
         bbs[bb_start] = instructions
         bbs[end_offset] = instructions
         
         n = CNode(str(bb.offset), data=instructions)
         fg.addNode(n)
         nodes[bb.offset] = n
     
     for bb in func.basic_blocks:
         next_head = self.pyew.NextHead(bb.instructions[-1].offset)
         for conn in bb.connections:
             a, b = conn
             if nodes.has_key(b) and nodes.has_key(bb.offset):
                 if len(bb.connections) == 1:
                     color = 0 # edge always
                 elif next_head == b:
                     color = 2 # edge false or unknown
                 else:
                     color = 1 # edge true
                 
                 fg.addEdge(nodes[bb.offset], nodes[b], value=color)
     
     return fg
Ejemplo n.º 4
0
 def buildFlowGraph(self, f):
     fg = CGraph()
     func = self.pyew.functions[f]
     bbs = {}
     nodes = {}
     for bb in func.basic_blocks:
         instructions = set()
         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.split("\n")
         if instructions[-1] == "":
             del instructions[len(instructions)-1]
         
         bbs[bb_start] = instructions
         bbs[end_offset] = instructions
         
         n = CNode(str(bb.offset), data=instructions)
         fg.addNode(n)
         nodes[bb.offset] = n
     
     for bb in func.basic_blocks:
         next_head = self.pyew.NextHead(bb.instructions[-1].offset)
         for conn in bb.connections:
             a, b = conn
             if nodes.has_key(b) and nodes.has_key(bb.offset):
                 if len(bb.connections) == 1:
                     color = 0 # edge always
                 elif next_head == b:
                     color = 2 # edge false or unknown
                 else:
                     color = 1 # edge true
                 
                 fg.addEdge(nodes[bb.offset], nodes[b], value=color)
     
     return fg
Ejemplo n.º 5
0
    def make_tree_for(self, group):
        """ Make a phylogenetic tree for the given group. """

        l = list(group)
        l.sort()
        s = str(l)
        if s in self.groups_done:
            if self.debug:
                print "Already clustered group found, skipping..."
            return None

        g = CGraph()
        g.letter = self.ascii_letters[self.last_letter]
        self.last_letter += 1

        group = list(group)
        dm = self.diff_matrix
        parent = None
        name = "New node %d"
        node_num = 0
        nodes = {}
        previous_node_name = node_name = None

        total_groups = len(group) - 1
        groups = 0
        for it in xrange(len(group) - 1):
            groups += 1
            node_num += 1
            # start by building a smaller difference matrix only for the samples
            # in this specific group
            dm = self.get_diff_matrix_for(group, dm)
            qm, lowest = self.get_q_matrix(dm)
            group = dm.keys()

            new_group = list(group)
            # Build a new node with the highest value found so far
            if node_name is not None:
                previous_node_name = node_name
            node_name = name % node_num
            n = CNode(node_name, shape="point")
            g.addNode(n)
            nodes[node_name] = n

            if parent is None:
                parent = n

            # Create the edges between the new node 'n' and the samples wih the
            # lowest Q matrix value
            if it != 0:
                lowest = None

            n1, n2 = self.get_neighbors(qm, group, lowest, previous_node_name)
            if not nodes.has_key(n1):
                nodes[n1] = CNode(n1)
            if not nodes.has_key(n2):
                nodes[n2] = CNode(n2)

            dfu = dgu = 0  #self.get_dfg_distances(n1, n2, dm)
            if not g.edgeExists(nodes[n1], n):
                g.addEdge(n, nodes[n1], check_dups=True, label=str(dfu))
            if not g.edgeExists(nodes[n2], n):
                g.addEdge(n, nodes[n2], check_dups=True, label=str(dgu))
            if n1 in new_group:
                new_group.remove(n1)
            if n2 in new_group:
                new_group.remove(n2)
            new_group.append(node_name)

            dm = self.update_diff_matrix(node_name, n1, n2, new_group, dm)
            group = new_group

        self.groups_done.add(s)
        return g