예제 #1
0
def get_bininfo(bv):
	if bv is None:
		filename = ""
		if len(sys.argv) > 1:
			filename = sys.argv[1]
		else:
			filename = interaction.get_open_filename_input("Filename:")
			if filename is None:
				log.log_warn("No file specified")
				sys.exit(1)

		bv = BinaryViewType.get_view_of_file(filename)
		log.redirect_output_to_log()
		log.log_to_stdout(True)

	contents = "## %s ##\n" % bv.file.filename
	contents += "- START: 0x%x\n\n" % bv.start
	contents += "- ENTRY: 0x%x\n\n" % bv.entry_point
	contents += "- ARCH: %s\n\n" % bv.arch.name
	contents += "### First 10 Functions ###\n"

	contents += "| Start | Name   |\n"
	contents += "|------:|:-------|\n"
	for i in xrange(min(10, len(bv.functions))):
		contents += "| 0x%x | %s |\n" % (bv.functions[i].start, bv.functions[i].symbol.full_name)

	contents += "### First 10 Strings ###\n"
	contents += "| Start | Length | String |\n"
	contents += "|------:|-------:|:-------|\n"
	for i in xrange(min(10, len(bv.strings))):
		start = bv.strings[i].start
		length = bv.strings[i].length
		string = bv.read(start, length)
		contents += "| 0x%x |%d | %s |\n" % (start, length, string)
	return contents
def command_load_mapfile(view):
    filename = interaction.get_open_filename_input('Map File', '*.map')

    if filename is not None:
        task = RunInBackground('Loading map file', load_map_file, view,
                               filename)
        task.start()
예제 #3
0
def command_load_idcfile(view):
    filename = interaction.get_open_filename_input('IDC File', '*.idc')

    if filename is not None:
        task = RunInBackground('Loading idc file', load_idc_file, view,
                               filename)
        task.start()
예제 #4
0
def trace_detect_function(bv):
    path = get_open_filename_input("Select a ppsspp trace file", ext="*.txt")

    if not path:
        return

    functions = 0
    duplicates = 0

    fp = open(path, "r")

    for line in fp.readlines():
        line = line.strip()

        chks = line.split(" ")

        if len(chks) != 3:
            print("Invalid file format")
            return

        if chks[0] != "CALL":
            continue

        addr = int(chks[1], 16)
        fns = bv.get_functions_containing(addr)

        if not fns:
            bv.create_user_function(addr, plat=bv.platform)
            functions += 1
        else:
            duplicates += 1

    print(f"Loading {functions} functions. Found {duplicates} duplicates")
예제 #5
0
def get_bininfo(bv):
    if bv is None:
        filename = ""
        if len(sys.argv) > 1:
            filename = sys.argv[1]
        else:
            filename = interaction.get_open_filename_input("Filename:")
            if filename is None:
                log.log_warn("No file specified")
                sys.exit(1)

        bv = BinaryViewType.get_view_of_file(filename)
        log.log_to_stdout(True)

    contents = "## %s ##\n" % os.path.basename(bv.file.filename)
    contents += "- START: 0x%x\n\n" % bv.start
    contents += "- ENTRY: 0x%x\n\n" % bv.entry_point
    contents += "- ARCH: %s\n\n" % bv.arch.name
    contents += "### First 10 Functions ###\n"

    contents += "| Start | Name   |\n"
    contents += "|------:|:-------|\n"
    for i in range(min(10, len(bv.functions))):
        contents += "| 0x%x | %s |\n" % (bv.functions[i].start,
                                         bv.functions[i].symbol.full_name)

    contents += "### First 10 Strings ###\n"
    contents += "| Start | Length | String |\n"
    contents += "|------:|-------:|:-------|\n"
    for i in range(min(10, len(bv.strings))):
        start = bv.strings[i].start
        length = bv.strings[i].length
        string = bv.read(start, length)
        contents += "| 0x%x |%d | %s |\n" % (start, length, string)
    return contents
예제 #6
0
def md380r2symbols(view):
    """This loads an MD380Tools symbols file in Radare2 format."""
    filename=get_open_filename_input("Select GNU LD symbols file from MD380Tools.")
    if filename:
        print("Opening: %s"%filename);
        importr2symbols(view,filename);
    else:
        print("Aborting.");
예제 #7
0
def get_workspace():
    choice = get_choice_input("Select Trace Type", "Input",
                              ["Trace File", "Manticore Workspace"])
    if choice == 0:
        workspace = get_open_filename_input("Trace File")
    else:
        workspace = get_directory_name_input("Workspace Directory")
    return workspace
예제 #8
0
def get_filename():
    global FILENAME
    if FILENAME == None:
        FILENAME = os.getenv("BINARY_NINJA_FILENAME")
        if FILENAME == None:
            FILENAME = interaction.get_open_filename_input(
                "File to disassemble (please select it again)")
    return FILENAME
예제 #9
0
def function_source_code_start(view):
    filename_asm_json = get_open_filename_input('Asm-json file', "*.asm.json")
    workspace = os.path.dirname(filename_asm_json)

    solidity_ln = SolidityLineNumber(filename_asm_json, workspace=workspace)

    contracts = solidity_ln.contracts.keys()
    contract_index = get_choice_input('Name of the contract',
                                      'Name of the contract', contracts)
    contract_name = contracts[contract_index]

    PrintSourceCode(solidity_ln, contract_name, view)
예제 #10
0
def get_bin_view(bv):
    if bv is None:
        filename = ""
        if len(sys.argv) > 1:
            filename = sys.argv[1]
        else:
            filename = interaction.get_open_filename_input("Filename:")
            if filename is None:
                log.log_warn("No file specified")
                sys.exit(1)
        bv = BinaryViewType.get_view_of_file(filename)
        log.log_to_stdout(True)
        return bv
예제 #11
0
파일: view.py 프로젝트: psifertex/wakare-ui
def _load_db(bv):
    path = get_open_filename_input("Select trace database")

    if not path:
        return None

    path = path.decode("UTF-8")

    try:
        db = TraceDB(bv, path)
        return db
    except TraceDBError as e:
        _print_error("Database error", "Loading error: {}".format(e))
    except sqlite3.Error as e:
        _print_error("Database error", "sqlite error: {}".format(e))
예제 #12
0
def map_ovl(bv):
    path = get_open_filename_input("Select an ovl file", ext="*.ovl")

    if not path:
        return

    ovl = _parse_ovl_file(path)

    if not ovl:
        return

    data, load_addr = ovl
    print("Loading ovl at address: 0x{:08x}".format(load_addr))

    bv.add_user_segment(load_addr, len(data), 0, len(data),
            SegmentFlag.SegmentReadable | SegmentFlag.SegmentExecutable)
    bv.write(load_addr, data)
def browse_type_library(ctx):
    view = ctx.binaryView

    if view is None:
        return

    lib_path: bytes = get_open_filename_input("typelibrary filename:", "*.bntl")

    if lib_path is None:
        return

    lib_path = lib_path.decode("utf-8")

    lib = TypeLibrary.load_from_file(lib_path)

    browser = TypeLibraryBrowser(view, lib)
    browser.exec_()
예제 #14
0
    def load_virtual_calls(self):
        json_file = interaction.get_open_filename_input(
            "Load virtual calls", "*.json")
        with open(json_file.decode("utf-8")) as f:
            devi_json_data = json.load(f)

        if self.version < devi_json_data["deviVersion"]:
            print(
                "[!] devi JSON file has a more recent version than IDA plugin!"
            )
            print("[!] we try parsing anyway!")
        if self.version > devi_json_data["deviVersion"]:
            print(
                "[!] Your devi_ida and devi_frida versions are out of sync. Update your devi_ida!"
            )

        if self.version == devi_json_data["deviVersion"]:
            self.devirtualize_calls(devi_json_data["calls"],
                                    devi_json_data["modules"])
        elif devi_json_data["deviVersion"] == 0.1:
            self.devirtualize_calls_v01(devi_json_data["calls"])
예제 #15
0
def load_svd(bv, svd_file=None):
    if not svd_file:
        svd_file = get_open_filename_input("SVD File")
    if isinstance(svd_file, str):
        svd_file = bytes(svd_file, encoding="utf-8")
    if not os.access(svd_file, os.R_OK):
        log_error(f"SVD Browser: Unable to open {svd_file}")
        return
    log_info(f"SVD Loader: Loading {svd_file}")
    device = parse(svd_file)
    peripherals = device['peripherals'].values()
    base_peripherals = [p for p in peripherals if 'derives' not in p]
    derived_peripherals = [p for p in peripherals if 'derives' in p]

    def register_peripheral(p, struct_type):
        bv.add_user_section(p['name'], p['base'], p['size'],
                            SectionSemantics.ReadWriteDataSectionSemantics)
        bv.add_user_segment(
            p['base'], p['size'], 0, 0, SegmentFlag.SegmentContainsData
            | SegmentFlag.SegmentReadable | SegmentFlag.SegmentWritable)
        bv.define_data_var(p['base'], struct_type)
        bv.define_user_symbol(
            Symbol(SymbolType.ImportedDataSymbol, p['base'], p['name']))

    for p in base_peripherals:
        s = Structure()
        for r in p['registers'].values():
            if r['size'] is None:
                s.insert(r['offset'], Type.int(4, False), r['name'])
            else:
                s.insert(r['offset'], Type.int(int(r['size'] / 8), False),
                         r['name'])
        struct_type = Type.structure_type(s)
        bv.define_user_type(p['name'], struct_type)
        register_peripheral(p, struct_type)

    for p in derived_peripherals:
        struct_type = bv.get_type_by_name(
            device['peripherals'][p['derives']]['name'])
        register_peripheral(p, struct_type)
 def load_data(self, bv):
     prompt_file = get_open_filename_input("filename")
     if(not prompt_file):
         return
     input_file = open(prompt_file)
     try:
         harness_data = json.loads(input_file.read())
     except json.decoder.JSONDecodeError:
         show_message_box("Afl-Unicorn", "Invalid json file",
                                         MessageBoxButtonSet.OKButtonSet, MessageBoxIcon.ErrorIcon)
         return
     if self.start != None or self.end != None or len(self.avoid_addresses) > 0:
         self.clear_data(bv)
     binja.log_info("JSON data: start: 0x{0:08x}, end: 0x{1:08x}, avoided addresses: {2}".format(
         harness_data['start'], harness_data['end'], [hex(x) for x in harness_data['avoid_addresses']]))
     self.start = harness_data['start']
     self.end = harness_data['end']
     self.set_start_address(bv, self.start)
     self.set_end_address(bv, self.end)
     for addr in harness_data['avoid_addresses']:
         self.avoid_address(bv, addr)
     input_file.close()
예제 #17
0
def db_load(bv):
    global LOADED_DB

    if LOADED_DB:
        res = show_message_box(
            "Database loading",
            "A trace is already loaded. Do you want to overwrite it ?",
            buttons=MessageBoxButtonSet.YesNoButtonSet,
            icon=MessageBoxIcon.WarningIcon)
        if not res:
            return

        LOADED_DB = None

    path = get_open_filename_input("Select trace database")

    if not path:
        return

    path = path.decode("UTF-8")

    try:
        LOADED_DB = TraceDB(bv, path)

        text = ""
        text += "Mappings: {:n}\n".format(LOADED_DB.mapping_count)
        text += "Branches: {:n}\n".format(LOADED_DB.branch_count)
        text += "bb hits : {:n}\n".format(LOADED_DB.hitcount_count)

        show_message_box("Trace info", text)
    except sqlite3.Error as e:
        _print_error("Database error", "sqlite error: {}".format(e))
        LOADED_DB = None
    except TraceDBError as e:
        _print_error("Database error", "Loading error: {}".format(e))
        LOADED_DB = None
예제 #18
0
 def load_virtual_calls(self):
     json_file = interaction.get_open_filename_input("Load virtual calls", "*.json")
     with open(json_file.decode("utf-8")) as f:
         json_objects = json.load(f)
     self.devirtualize_calls(json_objects["calls"])
예제 #19
0
def function_coverage_start(view):
    visited = get_open_filename_input('Visited file', "visited.txt")
    Coverage(view, visited)
예제 #20
0
def function_coverage_start(view):
    visited = get_open_filename_input('visited.txt or *.trace')
    if visited:
        colorer = GraphColorer(view)
        colorer.color(visited)