class ProcessList(QWidget): """ ProcessListWidget wich shows running Processes on Device Includes a Refresh Button to manually start refreshthread args: device needed Signals: onProcessSelected([pid, name]) - pid(int) name(str) onRefreshError(str) """ onProcessSelected = pyqtSignal(list, name='onProcessSelected') onRefreshError = pyqtSignal(str, name='onRefreshError') def __init__(self, device, parent=None): super(ProcessList, self).__init__(parent=parent) # if not isinstance(device, frida.core.Device): # print('No FridaDevice') # return self._device = device self.process_list = DwarfListView() model = QStandardItemModel(0, 2, parent) model.setHeaderData(0, Qt.Horizontal, "PID") model.setHeaderData(0, Qt.Horizontal, Qt.AlignCenter, Qt.TextAlignmentRole) model.setHeaderData(1, Qt.Horizontal, "Name") self.process_list.doubleClicked.connect(self._on_item_clicked) v_box = QVBoxLayout() v_box.setContentsMargins(0, 0, 0, 0) v_box.addWidget(self.process_list) self.refresh_button = QPushButton('Refresh') self.refresh_button.clicked.connect(self._on_refresh_procs) self.refresh_button.setEnabled(False) v_box.addWidget(self.refresh_button) self.setLayout(v_box) self.process_list.setModel(model) self.process_list.header().setSectionResizeMode( 0, QHeaderView.ResizeToContents) self.procs_update_thread = ProcsThread(self, self._device) self.procs_update_thread.add_proc.connect(self._on_add_proc) self.procs_update_thread.is_error.connect(self._on_error) self.procs_update_thread.is_finished.connect(self._on_refresh_finished) self.procs_update_thread.device = self._device self.procs_update_thread.start() # ************************************************************************ # **************************** Properties ******************************** # ************************************************************************ @property def device(self): """ Sets Device needs frida.core.device """ return self._device @device.setter def device(self, value): self.set_device(value) # ************************************************************************ # **************************** Functions ********************************* # ************************************************************************ def clear(self): """ Clears the List """ self.process_list.clear() def set_device(self, device): """ Set frida Device """ if isinstance(device, frida.core.Device): self._device = device self.procs_update_thread.device = device self._on_refresh_procs() # ************************************************************************ # **************************** Handlers ********************************** # ************************************************************************ def _on_item_clicked(self, model_index): model = self.process_list.model() index = model.itemFromIndex(model_index).row() if index != -1: sel_pid = self.process_list.get_item_text(index, 0) sel_name = self.process_list.get_item_text(index, 1) self.onProcessSelected.emit([int(sel_pid), sel_name]) def _on_add_proc(self, item): model = self.process_list.model() pid = QStandardItem() pid.setText(str(item['pid'])) pid.setTextAlignment(Qt.AlignCenter) name = QStandardItem() name.setText(item['name']) model.appendRow([pid, name]) def _on_error(self, error_str): self.onRefreshError.emit(error_str) def _on_refresh_procs(self): if not self._device: return if self.procs_update_thread.isRunning(): self.procs_update_thread.terminate() if not self.procs_update_thread.isRunning(): self.clear() self.refresh_button.setEnabled(False) self.procs_update_thread.device = self._device self.procs_update_thread.start() def _on_refresh_finished(self): self.refresh_button.setEnabled(True)
class SpawnsList(QWidget): """ ProcessListWidget wich shows running Processes on Device Includes a Refresh Button to manually start refreshthread args: device needed Signals: onProcessSelected([pid, name]) - pid(int) name(str) onRefreshError(str) """ onProcessSelected = pyqtSignal(list, name='onProcessSelected') onRefreshError = pyqtSignal(str, name='onRefreshError') def __init__(self, device, parent=None): super(SpawnsList, self).__init__(parent=parent) self.break_at_start = False self._device = device self.spawn_list = DwarfListView() model = QStandardItemModel(0, 2, parent) model.setHeaderData(0, Qt.Horizontal, "Name") model.setHeaderData(1, Qt.Horizontal, "Package") self.spawn_list.doubleClicked.connect(self._on_item_clicked) v_box = QVBoxLayout() v_box.setContentsMargins(0, 0, 0, 0) v_box.addWidget(self.spawn_list) break_spawn_start = QCheckBox('Break at spawn') break_spawn_start.stateChanged.connect(self._on_toggle_break_spawn) v_box.addWidget(break_spawn_start) self.refresh_button = QPushButton('Refresh') self.refresh_button.clicked.connect(self._on_refresh_procs) self.refresh_button.setEnabled(False) v_box.addWidget(self.refresh_button) self.setLayout(v_box) self.spawn_list.setModel(model) self.spawn_list.header().setSectionResizeMode( 0, QHeaderView.ResizeToContents) self.spaw_update_thread = SpawnsThread(self, self._device) self.spaw_update_thread.add_spawn.connect(self._on_add_proc) self.spaw_update_thread.is_error.connect(self._on_error) self.spaw_update_thread.is_finished.connect(self._on_refresh_finished) self.spaw_update_thread.device = self._device self.spaw_update_thread.start() # ************************************************************************ # **************************** Properties ******************************** # ************************************************************************ @property def device(self): """ Sets Device needs frida.core.device """ return self._device @device.setter def device(self, value): self.set_device(value) # ************************************************************************ # **************************** Functions ********************************* # ************************************************************************ def clear(self): """ Clears the List """ self.spawn_list.clear() def set_device(self, device): """ Set frida Device """ if isinstance(device, frida.core.Device): self._device = device self.spaw_update_thread.device = device self._on_refresh_procs() # ************************************************************************ # **************************** Handlers ********************************** # ************************************************************************ def _on_item_clicked(self, model_index): model = self.spawn_list.model() index = model.itemFromIndex(model_index).row() if index != -1: sel_pid = self.spawn_list.get_item_text(index, 0) if model_index.column() == 0: sel_name = model.data(model_index, Qt.UserRole + 2) else: sel_name = self.spawn_list.get_item_text(index, 1) self.onProcessSelected.emit([sel_pid, sel_name]) def _on_add_proc(self, item): model = self.spawn_list.model() name = QStandardItem() name.setText(item[0]) name.setData(item[1], Qt.UserRole + 2) package = QStandardItem() package.setText(item[1]) model.appendRow([name, package]) def _on_error(self, error_str): self.onRefreshError.emit(error_str) def _on_refresh_procs(self): if not self._device: return if self.spaw_update_thread.isRunning(): self.spaw_update_thread.terminate() if not self.spaw_update_thread.isRunning(): self.clear() self.refresh_button.setEnabled(False) self.spaw_update_thread.device = self._device self.spaw_update_thread.start() def _on_refresh_finished(self): self.spawn_list.resizeColumnToContents(0) self.refresh_button.setEnabled(True) def _on_toggle_break_spawn(self, state): self.break_at_start = state == Qt.Checked