def __init__(self, parent=None, show_linenumes=False, completer=True): super(JsCodeEditor, self).__init__(parent) self.setFont(get_os_monospace_font()) self._show_linenums = show_linenumes keywords = [] keywords_path = home_path() + 'keywords.json' if os.path.exists(keywords_path): with open(keywords_path, 'r') as f: try: keywords = json.load(f) except: pass if self._show_linenums: self.ui_line_numbers = JsCodeEditLineNums(self) self.blockCountChanged.connect(self.update_linenum_width) self.updateRequest.connect(self.update_line_numbers) self.update_linenum_width(0) self.setAutoFillBackground(True) # default distance is 80 self.setTabStopDistance(self.fontMetrics().width('9999')) self.highlighter = JsHighlighter(keywords, parent=self.document()) if completer: # code completion self.completer = DwarfCompleter(keywords) self.completer.setWidget(self) self.completer.setCompletionMode(QCompleter.PopupCompletion) self.completer.setCaseSensitivity(Qt.CaseInsensitive) self.completer.insertText.connect(self.insertCompletion) else: self.completer = None
def dump_keywords(self): kw = sorted(self._script.exports.keywords()) with open(utils.home_path() + 'keywords.json', 'w') as f: f.write(json.dumps(kw))
def load_script(self, script=None, spawned=False, break_at_start=False): try: if not os.path.exists(utils.resource_path('lib/core.js')): raise self.CoreScriptNotFoundError('core.js not found!') with open(utils.resource_path('lib/core.js'), 'r') as core_script: script_content = core_script.read() self._script = self._process.create_script(script_content, runtime="v8") self._script.on('message', self._on_message) self._script.on('destroyed', self._on_script_destroyed) self._script.load() break_at_start = break_at_start or self._app_window.dwarf_args.break_start # we invalidate the arg in any case (set this from ui needs a store in args for an eventual restore session) self._app_window.dwarf_args.break_start = break_at_start is_debug = self._app_window.dwarf_args.debug_script # this break_at_start have same behavior from args or from the checkbox i added self._script.exports.init(break_at_start, is_debug, spawned, True) if not os.path.exists(utils.home_path() + 'keywords.json'): self.dump_keywords() # resume immediately self.resume_proc() for plugin in self._app_window.plugin_manager.plugins: plugin_instance = self._app_window.plugin_manager.plugins[plugin] try: self.dwarf_api('evaluateFunction', plugin_instance.__get_agent__()) except Exception as e: pass if script is not None: if os.path.exists(script): with open(script, 'r') as script_file: user_script = script_file.read() self.dwarf_api('evaluateFunction', user_script) self.onScriptLoaded.emit() return 0 except frida.ProcessNotFoundError: error_msg = 'Process not found (ProcessNotFoundError)' was_error = True except frida.ProcessNotRespondingError: error_msg = 'Process not responding (ProcessNotRespondingError)' was_error = True except frida.TimedOutError: error_msg = 'Frida timeout (TimedOutError)' was_error = True except frida.ServerNotRunningError: error_msg = 'Frida not running (ServerNotRunningError)' was_error = True except frida.TransportError: error_msg = 'Frida timeout was reached (TransportError)' was_error = True if was_error: utils.show_message_box(error_msg) return 1
def __init__(self, dwarf_args, flags=None): super(AppWindow, self).__init__(flags) self.dwarf_args = dwarf_args self.session_manager = SessionManager(self) self.session_manager.sessionCreated.connect(self.session_created) self.session_manager.sessionStopped.connect(self.session_stopped) self.session_manager.sessionClosed.connect(self.session_closed) self._tab_order = [ 'debug', 'modules', 'ranges', 'jvm-inspector', 'jvm-debugger' ] self._is_newer_dwarf = False self.q_settings = QSettings(utils.home_path() + "dwarf_window_pos.ini", QSettings.IniFormat) self.menu = self.menuBar() self.view_menu = None # dockwidgets self.watchpoints_dwidget = None self.breakpoint_dwiget = None self.bookmarks_dwiget = None self.registers_dock = None self.console_dock = None self.backtrace_dock = None self.threads_dock = None # panels self.asm_panel = None self.backtrace_panel = None self.bookmarks_panel = None self.console_panel = None self.context_panel = None self.debug_panel = None self.contexts_list_panel = None self.data_panel = None self.ftrace_panel = None self.breakpoints_panel = None self.objc_inspector_panel = None self.java_inspector_panel = None self.java_explorer_panel = None self.java_trace_panel = None self.modules_panel = None self.ranges_panel = None self.search_panel = None self.smali_panel = None self.watchpoints_panel = None self._ui_elems = [] self.setWindowTitle( 'Dwarf - A debugger for reverse engineers, crackers and security analyst' ) # load external assets _app = QApplication.instance() # themes self.prefs = Prefs() utils.set_theme(self.prefs.get('dwarf_ui_theme', 'dark'), self.prefs) # load font if os.path.exists(utils.resource_path('assets/Anton.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/Anton.ttf')) else: QFontDatabase.addApplicationFont(':/assets/Anton.ttf') if os.path.exists(utils.resource_path('assets/OpenSans-Regular.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Regular.ttf')) else: QFontDatabase.addApplicationFont(':/assets/OpenSans-Regular.ttf') if os.path.exists(utils.resource_path('assets/OpenSans-Bold.ttf')): QFontDatabase.addApplicationFont( utils.resource_path('assets/OpenSans-Bold.ttf')) else: QFontDatabase.addApplicationFont(':/assets/OpenSans-Bold.ttf') font = QFont("OpenSans", 9, QFont.Normal) # TODO: add settingsdlg font_size = self.prefs.get('dwarf_ui_font_size', 12) font.setPixelSize(font_size) _app.setFont(font) # mainwindow statusbar self.progressbar = QProgressBar() self.progressbar.setRange(0, 0) self.progressbar.setVisible(False) self.progressbar.setFixedHeight(15) self.progressbar.setFixedWidth(100) self.progressbar.setTextVisible(False) self.progressbar.setValue(30) self.statusbar = QStatusBar(self) self.statusbar.setAutoFillBackground(False) self.statusbar.addPermanentWidget(self.progressbar) self.statusbar.setObjectName("statusbar") self.setStatusBar(self.statusbar) self.main_tabs = QTabWidget(self) self.main_tabs.setMovable(False) self.main_tabs.setTabsClosable(True) self.main_tabs.setAutoFillBackground(True) self.main_tabs.tabCloseRequested.connect(self._on_close_tab) self.setCentralWidget(self.main_tabs) # pluginmanager self.plugin_manager = PluginManager(self) self.plugin_manager.reload_plugins() self.welcome_window = None if dwarf_args.any == '': self.welcome_window = WelcomeDialog(self) self.welcome_window.setModal(True) self.welcome_window.onIsNewerVersion.connect( self._enable_update_menu) self.welcome_window.onUpdateComplete.connect( self._on_dwarf_updated) self.welcome_window.setWindowTitle( 'Welcome to Dwarf - A debugger for reverse engineers, crackers and security analyst' ) self.welcome_window.onSessionSelected.connect(self._start_session) # wait for welcome screen self.hide() self.welcome_window.show() else: print('* Starting new Session') self._start_session(dwarf_args.target)
def __init__(self, app): self._app = app self._plugins_path = os.path.join(home_path(), 'plugins') sys.path.append(self._plugins_path) self._plugins = {}