def _init_widgets(self): layout = QGridLayout() row = 0 header_label = QLabel(self) header_label.setText("Exploration strategy:") layout.addWidget(header_label, row, 0) row += 1 options_container = QGroupBox(self) options = QVBoxLayout() for strategy, cls in sorted( angr.exploration_techniques.__dict__.items()): if hasattr( cls, "mro" ) and angr.exploration_techniques.ExplorationTechnique in type.mro( cls): child = QRadioButton() child.setText(strategy) child.strategy = strategy child.toggled.connect(self.selected) options.addWidget(child) self.strategies[strategy] = cls scroll_area = QScrollArea(self) scroll_area.setWidgetResizable(True) widget = QWidget() scroll_area.setWidget(widget) layout_scroll = QVBoxLayout(widget) layout_scroll.addWidget(options_container) options_container.setLayout(options) layout.addWidget(scroll_area, row, 0) row += 1 constructor_box = QPlainTextEdit(self) highlight = PythonHighlighter(constructor_box.document()) constructor_box.setWordWrapMode(QTextOption.WordWrap) self._constructor_box = constructor_box layout.addWidget(constructor_box, row, 0) row += 1 # buttons ok_button = QPushButton(self) ok_button.setText('OK') def do_ok(): constructor_txt = constructor_box.toPlainText() try: strategy = eval(constructor_txt) strategy.project = self.instance.project self.simgr.strategies[strategy.__class__.__name__] = strategy self.close() except NameError as e: # error QMessageBox.about( self, 'Error', f"{str(e)}, \nMake sure to fill in all positional arguments." ) ok_button.clicked.connect(do_ok) cancel_button = QPushButton(self) cancel_button.setText('Cancel') def do_cancel(): self.close() cancel_button.clicked.connect(do_cancel) buttons_layout = QHBoxLayout() buttons_layout.addWidget(ok_button) buttons_layout.addWidget(cancel_button) self.main_layout.addLayout(layout) self.main_layout.addLayout(buttons_layout)
def _init_widgets(self): if len(self.strategies) == 0: QMessageBox.about( self, 'Error', "No strategies available\nCreate a strategy in Symbolic Execution -> Settings -> Add Strategy" ) return layout = QGridLayout() row = 0 addr = self.instance.project.entry if self._addr is None else self._addr function = self.instance.project.kb.functions.floor_func(addr) fn_name = function.name fn_addr = function.addr header_label = QLabel(self) header_label.setText( f"Exploration strategy for function {fn_name} @ address {hex(fn_addr)}:" ) layout.addWidget(header_label, row, 0) row += 1 options_container = QGroupBox(self) options = QVBoxLayout() for strategy, cls in self.strategies.items(): child = QRadioButton() child.setText(strategy) child.strategy = strategy child.toggled.connect(self.selected) options.addWidget(child) scroll_area = QScrollArea(self) scroll_area.setWidgetResizable(True) widget = QWidget() scroll_area.setWidget(widget) layout_scroll = QVBoxLayout(widget) layout_scroll.addWidget(options_container) options_container.setLayout(options) layout.addWidget(scroll_area, row, 0) row += 1 # buttons ok_button = QPushButton(self) ok_button.setText('OK') def do_ok( ): # TODO: parse call insn for this function and set end of explore at that addr if self._selected is not None: self.simgr.fn_strategy[ fn_addr] = self._selected # TODO: select from options self.close() ok_button.clicked.connect(do_ok) # TODO: add validation for OK button enable/disable def validation_update(): ok_button.setDisabled(bool(validation_failures)) cancel_button = QPushButton(self) cancel_button.setText('Cancel') def do_cancel(): self.close() cancel_button.clicked.connect(do_cancel) buttons_layout = QHBoxLayout() buttons_layout.addWidget(ok_button) buttons_layout.addWidget(cancel_button) self.main_layout.addLayout(layout) self.main_layout.addLayout(buttons_layout)