Пример #1
0
    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)
Пример #2
0
    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)