示例#1
0
    def render(self, r):
        """
        Writes the procedure info, name, the callers, callees etc
        :param r:
        """
        with r.lineAddress(self.addr), r.comment():
            r.write("Menu: /home | /data | /jump | /proc | /bank")
            r.hline()

            r.startNewLine()
            r.write("Procedure flow ")
            r.writeSymbol(self.addr, 'procedure')

            r.startNewLine()
            r.write("  This procedure is called by: ")
            r.writeList(ProcAddress(x) for x in sorted(self.info.callers))

            r.startNewLine()
            r.write("  This procedure calls: ")
            r.writeList(ProcAddress(x) for x in sorted(self.proc.calls()))

            r.hline()

        with r.indent():
            self.proc.render(r)
示例#2
0
    def render(self, renderer):
        c = self.proj.database.connection.cursor()

        c.execute('select addr from procs where has_ambig_calls=1')
        renderer.startNewLine()
        renderer.add('ambig calls:')
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                ProcAddress(addr).render(renderer)

        c.execute('select addr from procs where suspicious_switch=1')
        renderer.startNewLine()
        renderer.add('suspicious switch:')
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                ProcAddress(addr).render(renderer)

        c.execute('select addr from procs where has_suspicious_instr=1')
        renderer.startNewLine()
        renderer.add('suspicious instr:')
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                ProcAddress(addr).render(renderer)

        c.close()
示例#3
0
    def render(self, renderer):
        bank_name = "{:04X}".format(self.bank)

        c = self.proj.database.connection.cursor()

        renderer.startNewLine()
        renderer.add('public interface:')
        c.execute(
            'select destination from calls where substr(source, 0, 5)<>? and substr(destination, 0, 5)=? group by destination order by destination',
            (bank_name, bank_name))
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                ProcAddress(addr).render(renderer)

        renderer.startNewLine()
        renderer.add('dependencies:')
        c.execute(
            'select destination from calls where substr(source, 0, 5)=? and substr(destination, 0, 5)<>? group by source order by source',
            (bank_name, bank_name))
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                ProcAddress(addr).render(renderer)

        renderer.startNewLine()
        renderer.add('reads:')
        c.execute(
            'select addr from memref where substr(proc, 0, 5)=? and type=? group by addr order by addr',
            (bank_name, 'read'))
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                DataAddress(addr).render(renderer)

        renderer.startNewLine()
        renderer.add('writes:')
        c.execute(
            'select addr from memref where substr(proc, 0, 5)=? and type=? group by addr order by addr',
            (bank_name, 'write'))
        with renderer.indent():
            for addr, in c.fetchall():
                renderer.startNewLine()
                DataAddress(addr).render(renderer)

        c.close()
示例#4
0
    def render(self, r):
        with r.lineAddress(self.addr), r.comment():
            r.hline()

            r.startNewLine()
            r.write("data ")
            r.writeSymbol(self.addr, 'data')

            r.startNewLine()
            r.write("  reads: ")
            r.writeList(ProcAddress(x) for x in sorted(self.reads))

            r.startNewLine()
            r.write("  writes: ")
            r.writeList(ProcAddress(x) for x in sorted(self.writes))

            r.hline()
示例#5
0
    def addFakeBlock(self, proj, addr):
        pos = len(self.blocks)
        self.block_id_at_addr[addr] = pos

        instr = TailCall(proj, ProcAddress(addr))

        from .flowcontrol import Block
        self.blocks.append(Block([instr]))

        self.block_starts.append(addr)
        self._childs[pos] = [None]
示例#6
0
    def render(self, r):

        with r.lineAddress(self.addr), r.comment():
            r.hline()

            r.startNewLine()
            r.write("procedure ")
            r.writeSymbol(self.addr, 'procedure')

            r.startNewLine()
            r.write("  callers: ")
            r.writeList(ProcAddress(x) for x in sorted(self.info.callers))

            r.startNewLine()
            r.write("  calls: ")
            r.writeList(ProcAddress(x) for x in sorted(self.info.calls))

            r.hline()
        with r.indent():
            self.proc.render(r)
示例#7
0
    def __init__(self, proj, addr):
        self.addr = addr
        self.targets = []

        for i in range(256):
            a = addr.offset(i * 2)
            lo = proj.rom.get(a)
            hi = proj.rom.get(a.offset(1))
            value = address.fromVirtualAndCurrent((hi << 8) | lo, addr)

            if not value.inPhysicalMem():
                break

            self.targets.append(ProcAddress(value))
示例#8
0
    def __init__(self, proj, addr):
        self.addr = addr
        self.targets = []
        romconfig = Config(proj.filename, rom=True)
        jumptables = romconfig.get(["Analysis", "Jumptable-List"])
        try:
            size = jumptables[str(addr)]
        except KeyError:
            size = 256
        for i in range(size):
            a = addr.offset(i * 2)
            lo = proj.rom.get(a)
            hi = proj.rom.get(a.offset(1))
            value = address.fromVirtualAndCurrent((hi << 8) | lo, addr)

            if not value.inPhysicalMem():
                print "breaking"
                break

            self.targets.append(ProcAddress(value))