Ejemplo n.º 1
0
    def _updateActionRecentDocuments(self):

        # Add items to the list, if necessary
        for idx in range(len(self._actionRecentDocuments)+1, self._preferences.maximumRecentDocuments()+1):

            actionRecentDocument = QAction(self)
            actionRecentDocument.setObjectName(f"actionRecentDocument_{idx}")
            actionRecentDocument.triggered.connect(lambda data=actionRecentDocument.data(): self._onActionOpenRecentDocumentTriggered(data))

            self._actionRecentDocuments.append(actionRecentDocument)

        # Remove items from the list, if necessary
        while len(self._actionRecentDocuments) > self._preferences.maximumRecentDocuments():
            self._actionRecentDocuments.pop()

        # Update items
        for idx in range(len(self._actionRecentDocuments)):
            text = None
            data = None
            show = False

            if idx < len(self._recentDocuments):
                text = self.tr("{0} [{1}]").format(QFileInfo(self._recentDocuments[idx]).fileName(), self._recentDocuments[idx])
                data = self._recentDocuments[idx]
                show = True

            self._actionRecentDocuments[idx].setText(text)
            self._actionRecentDocuments[idx].setData(data)
            self._actionRecentDocuments[idx].setVisible(show)
Ejemplo n.º 2
0
    def onFrozenRightClick(self, point: QPoint):
        @Slot(str, str)
        def onGekuendigt(mv_id: str, datum: str):
            #Model aktualisieren
            model.setBis(index.row(), datum)

        tv = self._view.tableView
        #model = tv.getTableModel()
        model = tv.getModel()
        index = tv.indexAt(point)
        if not index.column() in (model.nameColumnIdx, model.sollColumnIdx):
            return

        mv_id = model.getId(index.row())
        menu = QMenu(tv)
        if index.column() == model.nameColumnIdx:
            action = QAction("Dieses Mietverhältnis beenden")
            action.setData("K")
            menu.addAction(action)
            menu.addSeparator()
            action2 = QAction("Mietverhältnisdaten anzeigen")
            action2.setData("A")
            menu.addAction(action2)
        else:
            action = QAction("Nettomiete und NKV anzeigen")
            menu.addAction(action)
        action = menu.exec_(tv.viewport().mapToGlobal(point))
        if action and index.column() == model.nameColumnIdx:
            if action.data() == "K":
                c = MiniKuendigungsController(self._view)
                c.mietverhaeltnisGekuendigt.connect(onGekuendigt)
                c.kuendigeMietverhaeltnisUsingMiniDialog(mv_id)
            else:
                self._showMietverhaeltnis(mv_id, point)
        elif action and index.column() == model.sollColumnIdx:
            netto, nkv = BusinessLogic.inst().getNettomieteUndNkv(
                mv_id, self._currentYear, self._currentCheckMonth)
            box = QMessageBox()
            box.setWindowTitle("Teile der Bruttomiete")
            box.setIcon(QMessageBox.Information)
            box.setText("Nettomiete:\t%.2f €\n\n"
                        "Nebenkosten:\t%.2f €" % (netto, nkv))
            box.exec_()
Ejemplo n.º 3
0
    def _sequenceOpened(self, filename, begin, end, streams):
        """
        Notifies about an opened sequence.

        :param filename: the filename which has been opened
        :param begin: timestamp of sequence's first sample
        :param end: timestamp of sequence's last sample
        :param streams: list of streams in the sequence
        :return: None
        """
        assertMainThread()
        self.beginTime = begin
        self.preventSeek = True
        self.positionSlider.setRange(0, (end - begin) // 1000000)
        self.preventSeek = False
        self.beginLabel.setText(self._timeToString(0))
        self.endLabel.setText(self._timeToString((end - begin) // 1000000))
        self._currentTimestampChanged(begin)
        try:
            self.browser.blockSignals(True)
            self.browser.setActive(filename)
            self.browser.scrollTo(filename)
        finally:
            self.browser.blockSignals(False)
        self._selectedStream = None
        for a in self.actGroupStream.actions():
            logger.debug("Remove stream group action: %s", a.data())
            self.actGroupStream.removeAction(a)
        for stream in streams:
            act = QAction(stream, self.actGroupStream)
            act.triggered.connect(
                lambda cstream=stream: self.setSelectedStream(cstream))
            act.setCheckable(True)
            act.setChecked(False)
            logger.debug("Add stream group action: %s", act.data())
            self.actGroupStreamMenu.addAction(act)
        QTimer.singleShot(250, self.scrollToCurrent)
        super()._sequenceOpened(filename, begin, end, streams)
Ejemplo n.º 4
0
 def set_unit_type(self, sender: QAction) -> None:
     val = UnitType(sender.data())
     self._viewer_widget.engine.unit_type = val
     self._settings.setValue("unit_type", val)
Ejemplo n.º 5
0
class AngrWidget(cutter.CutterDockWidget, Ui_AngrWidget):
    def __init__(self, parent, action):
        try:
            super(AngrWidget, self).__init__(parent, action)
            register_debugger(cutterDebugger())
            self.stateMgr = None
            self.main = parent

            self.findAddrs = []
            self.avoidAddrs = []
            self.symAddrs = {}

            self.setObjectName("angr_cutter")
            self.setWindowTitle("AngrCutter")

            self.setupLayout()
            self.show()

            self.setupActions()

            self.startButton.clicked.connect(self.startExplore)
            self.applySimButton.clicked.connect(self.applySim)

            cutter.core().toggleDebugView.connect(self.debugStateChanged)
            cutter.core().refreshAll.connect(self.refreshAll)

        except Exception as e:
            printMessage(traceback.format_exc(), LogLevel.ERROR)

    def refreshAll(self):
        # Update baddr in refreshall since it happens after analysis and file changes
        self.baddr = int(cutter.cmd("e bin.baddr").strip('\n'), 16)

    def setupLayout(self):
        self.setupUi(self)

        self.viewRegisters = RegistersTable(self)
        self.regTableBox.addWidget(self.viewRegisters)

        self.startButton.setDisabled(True)
        self.stopButton.setDisabled(True)
        self.applySimButton.setDisabled(True)

        self.memoryCombo.setCurrentIndex(get_memory_type())
        self.memoryCombo.currentIndexChanged.connect(self.setMemoryType)

    def setupActions(self):
        self.findAddrAction = QAction("Angr - find address", self)
        self.avoidAddrAction = QAction("Angr - avoid address", self)
        self.symAddrAction = QAction("Angr - symbolize address", self)
        self.unsetAddrAction = QAction("Angr - unset address", self)

        # Disassembly menu actions
        menu = self.main.getContextMenuExtensions(cutter.MainWindow.ContextMenuType.Disassembly)
        menu.addAction(self.findAddrAction)
        menu.addAction(self.avoidAddrAction)
        menu.addAction(self.symAddrAction)
        menu.addAction(self.unsetAddrAction)
        menu.addSeparator()

        # Addressable menu actions
        menu = self.main.getContextMenuExtensions(cutter.MainWindow.ContextMenuType.Addressable)
        menu.addAction(self.symAddrAction)
        menu.addAction(self.unsetAddrAction)
        menu.addSeparator()

        self.findAddrAction.triggered.connect(self.setFindAddr)
        self.avoidAddrAction.triggered.connect(self.setAvoidAddr)
        self.unsetAddrAction.triggered.connect(self.unsetAddr)
        self.symAddrAction.triggered.connect(self.setSymAddr)

    def unsetAddr(self):
        offset = self.unsetAddrAction.data()
        if offset in self.findAddrs:
            self.findAddrs.remove(offset)
            self.updateFindAddrLine()
        if offset in self.avoidAddrs:
            self.avoidAddrs.remove(offset)
            self.updateAvoidAddrLine()
        if offset in self.symAddrs:
            del self.symAddrs[offset]
            self.updateSymAddrLine()

        cutter.cmd("ecH- @ %d" % offset)

    def setSymAddr(self):
        offset = int(self.symAddrAction.data())
        if offset in self.avoidAddrs or offset in self.findAddrs or offset in self.symAddrs:
            printMessage("Address %s was already set" %
                         hex(offset), LogLevel.WARNING)
            return

        dialog = SymAddrDialog()
        dialog.exec_()
        size = dialog.getSize()

        self.symAddrs[offset] = size
        self.updateSymAddrLine()
        cutter.cmd("ecHi black @ %d" % offset)

    def setFindAddr(self):
        offset = int(self.findAddrAction.data())
        if offset in self.avoidAddrs or offset in self.findAddrs or offset in self.symAddrs:
            printMessage("Address %s was already set" %
                         hex(offset), LogLevel.WARNING)
            return

        self.findAddrs.append(offset)
        self.updateFindAddrLine()
        cutter.cmd("ecHi blue @ %d" % offset)

    def setAvoidAddr(self):
        offset = int(self.avoidAddrAction.data())
        if offset in self.avoidAddrs or offset in self.findAddrs or offset in self.symAddrs:
            printMessage("Address %s was already set" %
                         hex(offset), LogLevel.WARNING)
            return

        self.avoidAddrs.append(offset)
        self.updateAvoidAddrLine()
        cutter.cmd("ecHi yellow @ %d" % offset)

    def setMemoryType(self):
        set_memory_type(self.memoryCombo.currentIndex())

    def update(self):
        self.updateFindAddrLine()
        self.updateAvoidAddrLine()
        self.updateSymAddrLine()

    def updateFindAddrLine(self):
        self.findLine.setText(",".join([hex(addr) for addr in self.findAddrs]))

    def updateAvoidAddrLine(self):
        self.avoidLine.setText(
            ",".join([hex(addr) for addr in self.avoidAddrs]))

    def updateSymAddrLine(self):
        self.symLine.setText(",".join([hex(addr) + '-' + hex(addr + self.symAddrs[addr])
                                       for addr in self.symAddrs]))

    def applySim(self):
        self.stateMgr.to_dbg(self.simMgr.found[0])
        # Synchronize all widgets with the applied memory/register values
        cutter.core().refreshAll.emit()
        # Return to the previous seek
        cutter.cmd("s %d" % cutter.core().getProgramCounterValue())

    def startExplore(self):
        if len(self.findAddrs) == 0:
            printMessage(
                "You have to set a find address to explore to", LogLevel.WARNING)
            return

        self.stateMgr = StateManager()
        self.simMgr = self.stateMgr.simulation_manager()

        # Configure symbolic memory addresses and registers
        for addr in self.symAddrs:
            self.stateMgr.sim(addr, self.symAddrs[addr])
        for reg in self.viewRegisters.symRegs:
            self.stateMgr.sim(
                self.stateMgr[reg], self.viewRegisters.symRegs[reg])

        # Start exploration
        printMessage("Starting exploration with find (%s) and avoid (%s)" %
                     (self.findAddrs, self.avoidAddrs,), LogLevel.INFO)
        printMessage("Symbolics are: " +
                     str(self.stateMgr.symbolics), LogLevel.INFO)
        self.simMgr.explore(find=self.findAddrs, avoid=self.avoidAddrs)

        # Attempt to print the results
        if len(self.simMgr.found):
            printMessage("Found: " + str(self.simMgr.found[0]), LogLevel.INFO)

            conc = self.stateMgr.concretize(self.simMgr.found[0])
            for addr in conc:
                printMessage("0x%x ==> %s" %
                             (addr, repr(conc[addr])), LogLevel.INFO)

            self.applySimButton.setDisabled(False)
        else:
            printMessage("Failed to find a state", LogLevel.ERROR)
            self.applySimButton.setDisabled(True)

        # Synchronize displays
        cutter.core().refreshAll.emit()
        # Return to the previous seek
        cutter.cmd("s %d" % cutter.core().getProgramCounterValue())

    def debugStateChanged(self):
        # Calculate the diff based on the previous baddr
        baddr = int(cutter.cmd("e bin.baddr").strip('\n'), 16)
        diff = baddr - self.baddr
        self.baddr = baddr

        if cutter.core().currentlyDebugging:
            disableUi = False
        else:
            del self.stateMgr
            self.stateMgr = None
            disableUi = True
            # applySim can be enabled only after startExplore
            self.applySimButton.setDisabled(True)

        # Enable exploration action when in debug mode
        self.startButton.setDisabled(disableUi)
        self.stopButton.setDisabled(disableUi)

        # Rebase addresses
        tmp = []
        for addr in self.findAddrs:
            tmp.append(addr + diff)
        self.findAddrs = tmp

        tmp = []
        for addr in self.avoidAddrs:
            tmp.append(addr + diff)
        self.avoidAddrs = tmp

        tmp = {}
        for addr in self.symAddrs:
            tmp[addr + diff] = self.symAddrs[addr]
        self.symAddrs = tmp

        self.update()