예제 #1
0
파일: ui.py 프로젝트: Vector35/debugger
def cb_process_run(bv):
    def switch_view():
        dh = DockHandler.getActiveDockHandler()
        vf = dh.getViewFrame()
        vf.setViewType('Debugger:' + bv.view_type)

    debug_state = binjaplug.get_state(bv)
    if debug_state.ui.debug_view is None:
        execute_on_main_thread_and_wait(switch_view)

    if debug_state.ui.debug_view is not None:
        debug_state.ui.debug_view.controls.actionRun.trigger()
    def unmap_memory(self, start: int, length: int) -> None:
        memory: BinaryView = self.view.session_data.get("emulator.memory.view")
        if memory is None:
            raise KeyError("Memory View not found")

        # TODO
        # Implement page tables oh god
        # Otherwise we're gonna blow up memory every time we map
        # something and unmap it
        execute_on_main_thread_and_wait(
            self.view.session_data["emulator.memory.model"].beginResetModel)
        memory.remove_user_segment(start, length)
        execute_on_main_thread_and_wait(
            self.view.session_data["emulator.memory.model"].endResetModel)
예제 #3
0
 def perform_attach_thread():
     try:
         self.debug_state.attach()
         execute_on_main_thread_and_wait(perform_attach_after)
     except ConnectionRefusedError:
         execute_on_main_thread_and_wait(
             lambda: perform_attach_error('ERROR: Connection Refused'))
     except TimeoutError:
         execute_on_main_thread_and_wait(
             lambda: perform_attach_error('ERROR: Connection Refused'))
     except Exception as e:
         execute_on_main_thread_and_wait(
             lambda: perform_attach_error('ERROR: ' + ' '.join(e.args)))
         traceback.print_exc(file=sys.stderr)
예제 #4
0
 def perform_step_return_thread():
     (reason, data) = self.debug_state.step_return()
     execute_on_main_thread_and_wait(
         lambda: self.handle_stop_return(reason, data))
     execute_on_main_thread_and_wait(
         lambda: self.debug_state.ui.context_display())
예제 #5
0
 def perform_step_return_thread():
     (reason, data) = self.debug_state.step_return()
     execute_on_main_thread_and_wait(
         lambda: perform_step_return_after(reason, data))
예제 #6
0
 def perform_step_over_il_thread():
     (reason, data) = self.debug_state.step_over(graph_type)
     execute_on_main_thread_and_wait(
         lambda: perform_step_over_il_after(reason, data))
예제 #7
0
 def perform_resume_thread():
     (reason, data) = self.debug_state.go()
     execute_on_main_thread_and_wait(
         lambda: perform_resume_after(reason, data))
예제 #8
0
        def perform_run_thread():
            while True:
                try:
                    self.debug_state.run()
                    execute_on_main_thread_and_wait(perform_run_after)
                except ConnectionRefusedError:
                    execute_on_main_thread_and_wait(
                        lambda: perform_run_error('ERROR: Connection Refused'))
                except DebugAdapter.ProcessStartError as e:
                    execute_on_main_thread_and_wait(
                        lambda: perform_run_error(str(e)))
                except DebugAdapter.NotExecutableError as e:
                    fpath = e.args[0]
                    if platform.system() != 'Windows':
                        msg = '%s is not executable, would you like to set +x and retry?' % fpath
                        res = show_message_box(
                            'Error', msg, MessageBoxButtonSet.YesNoButtonSet,
                            MessageBoxIcon.ErrorIcon)
                        if res == MessageBoxButtonResult.YesButton:
                            os.chmod(fpath, os.stat(fpath).st_mode | 0o100)
                            continue
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: Target Not Executable'))
                except DebugAdapter.NotInstalledError as e:
                    execute_on_main_thread_and_wait(
                        lambda: self.alert_need_install(e.args[0]))
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: Debugger Not Installed'))
                except DebugAdapter.PermissionDeniedError as e:
                    execute_on_main_thread_and_wait(
                        lambda: perform_run_error('ERROR: Permission denied'))
                    if platform.system() == 'Darwin':
                        res = show_message_box(
                            'Error',
                            'Developer tools need to be enabled to debug programs. This can be authorized either from here or by starting a debugger in Xcode.',
                            MessageBoxButtonSet.OKButtonSet,
                            MessageBoxIcon.ErrorIcon)
                except Exception as e:
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: ' + ' '.join(e.args)))
                    traceback.print_exc(file=sys.stderr)

                break
예제 #9
0
    def on_stdout(self, output):
        def on_stdout_main_thread(output):
            console_widget = self.widget('Debugger Console')
            console_widget.notifyStdout(output)

        execute_on_main_thread_and_wait(lambda: on_stdout_main_thread(output))
    def write_register(self, reg_name: str, value: int):
        registers = self.view.session_data.get("emulator.registers", [])
        if not registers:
            self.view.session_data["emulator.registers"] = registers

        regs = {
            r[0]: (i, r[1])
            for i, r in enumerate(
                self.view.session_data.get("emulator.registers", []))
        }

        if reg_name.startswith('temp'):
            register = RegisterInfo(reg_name, self.view.address_size)
        else:
            register = self.view.arch.regs[reg_name]

        size = register.size
        offset = register.offset
        extend = register.extend
        full_width_reg = register.full_width_reg

        if full_width_reg == reg_name:
            if not regs or reg_name.startswith('temp'):
                regs[reg_name] = (0, None)
            execute_on_main_thread_and_wait(
                self.view.session_data["emulator.registers.model"].startUpdate)
            registers[regs[reg_name][0]] = (reg_name, value)
            execute_on_main_thread_and_wait(
                self.view.session_data["emulator.registers.model"].endUpdate)

            if reg_name == self.view.arch.stack_pointer:
                execute_on_main_thread_and_wait(lambda: self.view.session_data[
                    'emulator.stack.model'].update(value))
            return

        full_width_value = self.read_register(full_width_reg)

        mask = (1 << (offset * 8)) - 1
        mask ^= (1 << ((size + offset) * 8)) - 1
        shifted_value = value << (offset * 8)
        masked_value = shifted_value & mask

        full_width_size = self.view.arch.regs[full_width_reg].size

        full_width_mask = (1 << (full_width_size * 8)) - 1
        full_width_mask ^= mask

        if extend == ImplicitRegisterExtend.NoExtend:
            full_width_value = masked_value | (full_width_mask
                                               & full_width_value)

        elif extend == ImplicitRegisterExtend.ZeroExtendToFullWidth:
            full_width_value = masked_value | (full_width_value &
                                               ((1 <<
                                                 ((size + offset) * 8)) - 1))

        elif extend == ImplicitRegisterExtend.SignExtendToFullWidth:
            sign_bit = shifted_value & (1 << ((size + offset - 1) * 8))
            full_width_value = masked_value | (full_width_value &
                                               ((1 <<
                                                 ((size + offset) * 8)) - 1))
            if sign_bit:
                full_width_value |= full_width_mask ^ ((1 << (
                    (size + offset) * 8)) - 1)

        if not regs:
            regs[full_width_reg] = (full_width_reg, full_width_value)

        execute_on_main_thread_and_wait(
            self.view.session_data["emulator.registers.model"].startUpdate)
        registers[regs[full_width_reg][0]] = (full_width_reg, full_width_value)
        execute_on_main_thread_and_wait(
            self.view.session_data["emulator.registers.model"].endUpdate)
예제 #11
0
        def perform_run_thread():
            while True:
                try:
                    self.debug_state.run()
                    execute_on_main_thread_and_wait(perform_run_after)
                except ConnectionRefusedError:
                    execute_on_main_thread_and_wait(
                        lambda: perform_run_error('ERROR: Connection Refused'))
                except DebugAdapter.NotExecutableError as e:
                    fpath = e.args[0]
                    if platform.system() != 'Windows':
                        msg = '%s is not executable, would you like to set +x and retry?' % fpath
                        res = show_message_box(
                            'Error', msg, MessageBoxButtonSet.YesNoButtonSet,
                            MessageBoxIcon.ErrorIcon)
                        if res == MessageBoxButtonResult.YesButton:
                            os.chmod(fpath, os.stat(fpath).st_mode | 0o100)
                            continue
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: Target Not Executable'))
                except DebugAdapter.NotInstalledError as e:
                    execute_on_main_thread_and_wait(
                        lambda: self.alert_need_install(e.args[0]))
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: Debugger Not Installed'))
                except Exception as e:
                    execute_on_main_thread_and_wait(lambda: perform_run_error(
                        'ERROR: ' + ' '.join(e.args)))
                    traceback.print_exc(file=sys.stderr)

                break
예제 #12
0
def signal_sync_done(bv, _results):
    """ Callback designed to run the update_wrapper function again immediately after we've had our first successful sync
    after being unable to succesfully sync. Has to run on the main thread to prevent a crash. The outer lambda function
    calls the update wrapper, while the inner lambda function acts as a stub so that wrapped() doesn't fail. """
    execute_on_main_thread_and_wait(lambda: update_wrapper(
        lambda _: log_info("Called update wrapper within callback"), bv))