Пример #1
0
 def getDependencySet(self):
     deps = database.procInfo(self.targetAddr).depset
     reads = set(deps.reads)
     for r in regutil.joinRegisters(reads):
         if r in self.constant_params:
             reads -= regutil.splitRegister(r)
     return depend.DependencySet(reads, deps.writes)
Пример #2
0
def getSubgraph(start_points):
    queue = set(start_points)
    verts = set()

    import database
    while queue:
        x = queue.pop()
        if x in verts:
            continue

        verts.add(x)
        info = database.procInfo(x)
        for c in info.calls:
            queue.add(c)
    return verts
Пример #3
0
def save_dot(procs):
    with open('data/graph.dot', 'w') as f:
        f.write("digraph crossref {\n")
        for addr in procs:
            tags = ''

            import database
            info = database.procInfo(addr)

            if info.has_switch:
                tags += ' switch'
            if info.suspicious_switch:
                tags += ' suspicious_switch'
            if info.has_nop:
                tags += ' nop'
            if info.has_ambig_calls:
                tags += ' ambig_calls'
            if info.has_suspicious_instr:
                tags += ' suspicious'

            f.write('    ' + addr_symbol(addr) + ' [label="' + tag.nameForAddress(addr) + tags + '"];\n')
            if tags:
                f.write('    ' + addr_symbol(addr) + ' [color="green"];\n')



            """"q = len(procedure.at(addr).instructions)

            if q < 32:
                intensity = 0
            elif q < 128:
                intensity = 64
            elif q < 512:
                intensity = 128
            elif q < 2048:
                intensity = 192
            else:
                intensity = 255
            """
            intensity = 0

            f.write('    ' + addr_symbol(addr) + ' [fillcolor="#FF{0:02x}{0:02x}"];\n'.format(255-intensity))
            f.write('    ' + addr_symbol(addr) + ' [style="filled"];\n')

            for c in info.calls:
                f.write('    ' + addr_symbol(addr) + ' -> ' + addr_symbol(c) + ';\n')

        f.write("}\n")
Пример #4
0
def update_info(proc):
    print "Updating info for", proc.addr
    info = database.procInfo(proc.addr)
    info.depset = proc.getDependencySet()
    info.has_switch = proc.has_switch
    info.suspicious_switch = proc.suspicious_switch
    info.has_suspicious_instr = proc.has_suspicious_instr
    info.has_nop = proc.has_nop
    info.has_ambig_calls = proc.has_ambig_calls
    info.length = proc.length
    # info.is_current = all(database.procInfo(sub).is_current for sub in proc.calls())
    info.calls = proc.calls()
    info.tail_calls = proc.tailCalls()
    info.memreads = proc.memreads
    info.memwrites = proc.memwrites
    info.save()