# from binaryninja import * import os import webbrowser import time try: from urllib import pathname2url # Python 2.x except: from urllib.request import pathname2url # Python 3.x from binaryninja.interaction import get_save_filename_input, show_message_box from binaryninja.enums import MessageBoxButtonSet, MessageBoxIcon, MessageBoxButtonResult, InstructionTextTokenType, BranchType from binaryninja.plugin import PluginCommand colors = {'green': [162, 217, 175], 'red': [222, 143, 151], 'blue': [128, 198, 233], 'cyan': [142, 230, 237], 'lightCyan': [176, 221, 228], 'orange': [237, 189, 129], 'yellow': [237, 223, 179], 'magenta': [218, 196, 209], 'none': [74, 74, 74]} escape_table = { "'": "'", ">": ">", "<": "<", '"': """, ' ': " " } def escape(toescape): toescape = toescape.decode('utf-8').encode('ascii', 'xmlcharrefreplace') # handle extended unicode return ''.join(escape_table.get(i, i) for i in toescape) # still escape the basics def save_svg(bv, function): address = hex(function.start).replace('L', '') path = os.path.dirname(bv.file.filename) origname = os.path.basename(bv.file.filename) filename = os.path.join(path, 'binaryninja-{filename}-{function}.html'.format(filename=origname, function=address)) outputfile = get_save_filename_input('File name for export_svg', 'HTML files (*.html)', filename) if outputfile is None: return content = render_svg(function, origname) output = open(outputfile, 'w') output.write(content) output.close() result = show_message_box("Open SVG", "Would you like to view the exported SVG?", buttons = MessageBoxButtonSet.YesNoButtonSet, icon = MessageBoxIcon.QuestionIcon) if result == MessageBoxButtonResult.YesButton: url = 'file:{}'.format(pathname2url(outputfile)) webbrowser.open(url) def instruction_data_flow(function, address): ''' TODO: Extract data flow information ''' length = binaryninja.function.view.get_instruction_length(address) bytes = binaryninja.function.view.read(address, length) hex = bytes.encode('hex') padded = ' '.join([hex[i:i + 2] for i in range(0, len(hex), 2)]) return 'Opcode: {bytes}'.format(bytes=padded) def render_svg(function, origname): graph = binaryninja.function.create_graph() graph.layout_and_wait() heightconst = 15 ratio = 0.48 widthconst = heightconst * ratio output = '''
''' output += '''' output += 'This CFG generated by Binary Ninja from {filename} on {timestring}.
'.format(filename = origname, timestring = time.strftime("%c")) output += '' return output PluginCommand.register_for_function("Export to SVG", "Exports an SVG of the current function", save_svg)