Пример #1
0
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.api = Api.ApiOS()
        self.baseManager = bm.BaseManager()
        self.scannerManager = sm.ScannerManager()

        self.pathBase = self.baseManager.loadSettings()
        if (self.pathBase is None):
            self.pathBase = ""
        self.ui.tbBasePath.setText(self.pathBase)

        #self.ui.btnRun.clicked.connect(lambda: self.startScan())

        # Обработчик сигнала
        self.signalCount.connect(self.signalCountHandler, Qt.QueuedConnection)
        self.signalFindVirus.connect(self.signalFindVirusHandler,
                                     Qt.QueuedConnection)
        self.signalScanFolder.connect(self.signalScanFolderHandler,
                                      Qt.QueuedConnection)
        self.signalScanFile.connect(self.signalScanFileHandler,
                                    Qt.QueuedConnection)
        self.signalCommit.connect(self.signalCommitHandler,
                                  Qt.QueuedConnection)
Пример #2
0
class ScannerManager:

    isStop = False
    api = Api.ApiOS()

    def thread(my_func):
        def wrapper(*args, **kwargs):
            my_thread = threading.Thread(target=my_func,
                                         args=args,
                                         kwargs=kwargs)
            my_thread.start()

        return wrapper

    @thread
    def ScanAll(self, path, signalCount, signalFindVirus, signalScanFolder,
                signalScanFile, commit, virusBase, settings):
        gen = fm.getGeneratorForFolder(path)

        i = 0
        countVirus = 0
        for item in gen:
            if (self.isStop):
                commit.emit({"status": "commit"})
                return
            for file in item[2]:
                signalScanFile.emit({"file": file})
                signalScanFolder.emit({"folder": item[0]})

                result = self.checkFileWithBase(
                    {
                        "name": file,
                        "path": item[0] + "\\" + file
                    }, virusBase, settings)

                if (result != None):
                    countVirus += 1
                    signalFindVirus.emit({
                        "count": countVirus,
                        "newFinds": result
                    })

                i += 1
                signalCount.emit({"countScan": i})

        commit.emit({"status": "commit"})

    def checkFileWithBase(self, file, virusBase, settings):
        cm = CheckingManager.CheckingManager()

        for virusPattern in virusBase:
            if (settings['FileNameScan'] != "unused"):
                for name in virusPattern['fnames']:
                    if (name == ""):
                        continue
                    if (cm.CheckingName(
                            file['name'], name,
                            settings['FileNameScan'] == "Selected")):
                        return {
                            "file": file,
                            "pattern": name,
                            "virus": virusPattern,
                            "type": "in_name"
                        }

            if (settings['FileExiptionScan'] != "unused"):
                for fexeption in virusPattern['fexeptions']:
                    if (fexeption == ""):
                        continue
                    if (cm.CheckingExtension(
                            file['name'], fexeption,
                            settings['FileExiptionScan'] == "Selected")):
                        return {
                            "file": file,
                            "pattern": fexeption,
                            "virus": virusPattern,
                            "type": "in_exeption"
                        }

            if (settings['FileScan'] != "unused"):
                for data in virusPattern['patterns']:
                    if (data == ""):
                        continue
                    if (cm.ChackingFileByBinaryPattern(file['path'], data)):
                        return {
                            "file": file,
                            "pattern": data,
                            "virus": virusPattern,
                            "type": "in_exeption"
                        }

        return None
Пример #3
0
class CheckingManager:
    api = Api.ApiOS()

    def splitFileName(self, fileName):
        sep = '.'
        vals = fileName.split(sep)
        name = ""
        extension = ""

        for i in range(len(vals)):
            if (i == 0):
                name = vals[i]
                continue

            if (i < len(vals) - 1):
                name += sep + vals[i]
                continue

            extension = vals[i]

        return {"name": name, "extension": extension}

    def CheckingName(self, fileName, pattern, deepScan=False):
        file = self.splitFileName(fileName)

        if (not deepScan):
            if (unicode(file['name']) == pattern
                    and not unicode(file['extension']) in self.api.EXCEPTIONS):
                return True
        else:
            if (unicode(file['name']).find(pattern) > -1
                    and not unicode(file['extension']) in self.api.EXCEPTIONS):
                return True
        return False

    def CheckingExtension(self, fileName, pattern, deepScan=False):
        file = self.splitFileName(fileName)

        if (not deepScan):
            if (unicode(file['extension']) == pattern
                    and not unicode(file['extension']) in self.api.EXCEPTIONS):
                return True
        else:
            if (unicode(file['extension']).find(pattern) > -1
                    and not unicode(file['extension']) in self.api.EXCEPTIONS):
                return True
        return False

    def ChackingFileByBinaryPattern(self, path, pattern):
        try:
            file = self.splitFileName(path)
            if (unicode(file['extension']) in self.api.EXCEPTIONS):
                return False

            with open(path, 'rb', 0) as file, \
                closing(mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ)) as s:
                if (s.find(pattern) != -1):
                    return True
        except:
            return False
        return False

    def CheckWithGenerator():
        gen = FileManager.getGeneratorForFolder()