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