Compare commits

...
27 Commits
Author SHA1 Message Date
PYDT cf4762ad04 Add files via upload 2023-10-15 09:17:04 +08:00
PYDT 6ba920e26a Add files via upload 2023-10-14 17:07:00 +08:00
PYDT a66acf0ef9 Delete requirements.txt 2023-10-14 17:01:56 +08:00
PYDT 8ab982ac38 Update README.md 2023-10-14 17:00:02 +08:00
PYDT 0c32a126a9 Update README.md 2023-10-14 16:56:45 +08:00
PYDT fd47881f88 Update README.md 2023-10-14 16:53:26 +08:00
PYDT 61298235fd Add files via upload 2023-10-14 12:24:43 +08:00
PYDT 4a38277c3e Add files via upload 2023-10-14 00:05:34 +08:00
PYDT fd7912f631 Add files via upload 2023-10-13 21:04:42 +08:00
mtkiao129 4f1b0e99e4 Add files via upload
add Python module list
2023-10-13 20:57:16 +08:00
PYDT 086e375cea Add files via upload 2023-10-13 20:00:57 +08:00
PYDT f90b132ccb Add files via upload 2023-10-13 18:42:29 +08:00
PYDT f4bd217445 Add files via upload 2023-10-13 18:28:58 +08:00
PYDT 5524e2f689 Add files via upload 2023-10-13 17:38:57 +08:00
PYDT 42b8201f37 Add files via upload 2023-10-13 15:15:19 +08:00
PYDT f71c821128 Add files via upload 2023-10-13 12:47:20 +08:00
PYDT 28330d3ad6 Add files via upload 2023-10-13 09:01:57 +08:00
PYDT 5afd576a3c Add files via upload 2023-10-12 11:39:03 +08:00
PYDT edcf82d139 Add files via upload 2023-10-12 09:50:21 +08:00
PYDT 69e5143a27 Add files via upload 2023-10-11 20:43:54 +08:00
PYDT 215d0faa53 Add files via upload 2023-10-11 20:11:28 +08:00
PYDT 470142a640 Add files via upload 2023-10-11 11:54:56 +08:00
PYDT 8e67a8d679 Add files via upload 2023-10-11 11:52:38 +08:00
PYDT be5baf9c87 Add files via upload 2023-10-11 11:04:42 +08:00
PYDT 7a05e42f3f Delete PYAS_Function_Full.zip 2023-10-11 11:04:19 +08:00
PYDT 34240ec01f Delete PYAS_Function.py 2023-10-11 11:03:55 +08:00
PYDT 0bf6eccb8b Add files via upload 2023-10-11 11:03:09 +08:00
6 changed files with 53 additions and 94 deletions

No files matched your search

+37 -30
View File
@@ -19,7 +19,7 @@ class MainWindow_Controller(QMainWindow):
self.setAttribute(Qt.WA_TranslucentBackground)
self.setWindowFlags(Qt.FramelessWindowHint)
self.pyas = str(sys.argv[0]).replace("\\", "/")
self.pyas_version = "2.8.6"
self.pyas_version = "2.8.7"
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.init_tray_icon()
@@ -350,7 +350,7 @@ class MainWindow_Controller(QMainWindow):
widget.setAutoFillBackground(True)
self.timer = QTimer()
self.timer.timeout.connect(self.timeout)
self.timer.start(0)
self.timer.start(2)
def timeout(self):
if self.opacity.i < 1:
@@ -457,7 +457,7 @@ class MainWindow_Controller(QMainWindow):
self.timer.stop()
x, y = event.x(), event.y()
if event.button()==Qt.LeftButton and x >= 10 and x <= 841 and y >= 10 and y <= 49:
self.m_flag=True
self.m_flag = True
self.m_Position=event.globalPos()-self.pos()
event.accept()
self.timer = QTimer()
@@ -480,7 +480,7 @@ class MainWindow_Controller(QMainWindow):
self.setWindowOpacity(self.pyas_opacity/100)
else:
self.timer.stop()
self.m_flag=False
self.m_flag = False
self.setCursor(QCursor(Qt.ArrowCursor))
self.timer = QTimer()
self.timer.timeout.connect(update_opacity)
@@ -499,21 +499,29 @@ class MainWindow_Controller(QMainWindow):
pat2.drawRoundedRect(rect, 1, 1)
def show_pyas_ui(self):
def update_opacity():
if self.pyas_opacity <= 100:
self.pyas_opacity += 1
self.setWindowOpacity(self.pyas_opacity/100)
else:
self.timer.stop()
self.show()
self.pyas_opacity = 0
while self.pyas_opacity < 100:
time.sleep(0.001)
self.pyas_opacity += 1
self.setWindowOpacity(self.pyas_opacity/100)
QApplication.processEvents()
self.timer = QTimer()
self.timer.timeout.connect(update_opacity)
self.timer.start(2)
def hide_pyas_ui(self):
while self.pyas_opacity > 0:
time.sleep(0.001)
self.pyas_opacity -= 1
self.setWindowOpacity(self.pyas_opacity/100)
QApplication.processEvents()
self.hide()
def update_opacity():
if self.pyas_opacity >= 0:
self.pyas_opacity -= 1
self.setWindowOpacity(self.pyas_opacity/100)
else:
self.timer.stop()
self.hide()
self.timer = QTimer()
self.timer.timeout.connect(update_opacity)
self.timer.start(2)
def showMinimized(self):
self.hide_pyas_ui()
@@ -521,7 +529,6 @@ class MainWindow_Controller(QMainWindow):
def closeEvent(self, event):
if QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要退出 PYAS 和所有防護嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
self.hide_pyas_ui()
event.accept()
else:
event.ignore()
@@ -638,7 +645,7 @@ class MainWindow_Controller(QMainWindow):
def Virus_Scan_output_menu(self, point):
def copyPathFunc():
item_row = None
item_row = False
for i in self.ui.Virus_Scan_output.selectedIndexes():
item_row = self.virus_list[i.row()]
if item_row:
@@ -807,22 +814,21 @@ class MainWindow_Controller(QMainWindow):
if os.path.isfile(text):
with open(text, "r", encoding="utf-8") as f:
text = f.read()
return any(sn in str(text) for sn in scripts_list)
return any(sn.lower() in str(text).lower() for sn in scripts_list)
except:
return False
def pe_scan(self, file):
try:
pe_func = []
with pefile.PE(file) as pe:
fn = []
for entry in pe.DIRECTORY_ENTRY_IMPORT:
for func in entry.imports:
try:
fn.append(str(func.name, "utf-8"))
pe_func.append(str(func.name, "utf-8"))
except:
pass
return fn in function_list
return False
return pe_func in function_list
except:
return False
@@ -1151,11 +1157,12 @@ class MainWindow_Controller(QMainWindow):
if p.pid not in existing_processes:
existing_processes.add(p.pid)
while self.proc_protect:
time.sleep(0.1)
time.sleep(0.05)
for p in psutil.process_iter():
try:
if p.pid not in existing_processes:
existing_processes.add(p.pid)
psutil.Process(p.pid).suspend()
name, file, cmd = p.name(), p.exe().replace("\\", "/"), p.cmdline()
if ":/Windows" in file or ":/Program" in file:
if "powershell" in name and self.api_scan(cmd[-1].split("'")[-2]):
@@ -1173,6 +1180,7 @@ class MainWindow_Controller(QMainWindow):
if self.api_scan(file) or self.pe_scan(file):
p.kill()
self.send_notify(self.trans("惡意軟體攔截: ")+name)
psutil.Process(p.pid).resume()
gc.collect()
except:
pass
@@ -1197,13 +1205,12 @@ class MainWindow_Controller(QMainWindow):
try:
time.sleep(0.5)
with open(r"\\.\PhysicalDrive0", "r+b") as f:
if self.mbr_value[510:512] == b'\x55\xAA':
if f.read(512) != self.mbr_value:
f.seek(0)
f.write(self.mbr_value)
self.proc.kill()
self.send_notify(self.trans("惡意行為攔截: ")+self.proc.name())
else:
if self.mbr_value[510:512] != b'\x55\xAA':
self.proc.kill()
self.send_notify(self.trans("惡意行為攔截: ")+self.proc.name())
elif f.read(512) != self.mbr_value:
f.seek(0)
f.write(self.mbr_value)
self.proc.kill()
self.send_notify(self.trans("惡意行為攔截: ")+self.proc.name())
except:
-1
View File
@@ -1 +0,0 @@
function_list = [['LoadLibraryA', 'GetProcAddress', 'SetUnhandledExceptionFilter', 'GetCurrentProcess', 'TerminateProcess', 'IsProcessorFeaturePresent', 'QueryPerformanceCounter', 'GetCurrentProcessId', 'GetCurrentThreadId', 'GetSystemTimeAsFileTime', 'InitializeSListHead', 'IsDebuggerPresent', 'GetModuleHandleW', 'UnhandledExceptionFilter', 'GetDC', '?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ', '?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z', '?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ', '?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z', '??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAE@XZ', '?getloc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QBE?AVlocale@2@XZ', '?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z', '?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ', '?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ', '?unshift@?$codecvt@DDU_Mbstatet@@@std@@QBEHAAU_Mbstatet@@PAD1AAPAD@Z', '?setg@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAD00@Z', '?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXXZ', '?_Init@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXPAPAD0PAH001@Z', '??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ', '??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z', '?in@?$codecvt@DDU_Mbstatet@@@std@@QBEHAAU_Mbstatet@@PBD1AAPBDPAD3AAPAD@Z', '?out@?$codecvt@DDU_Mbstatet@@@std@@QBEHAAU_Mbstatet@@PBD1AAPBDPAD3AAPAD@Z', '?eback@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ', '?gptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ', '?pptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ', '?egptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ', '?gbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z', '?epptr@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBEPADXZ', '?_Gndec@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ', '?_Gninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ', '?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ', '?pbump@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEXH@Z', '?_Pninc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IAEPADXZ', '?_Getcat@?$codecvt@DDU_Mbstatet@@@std@@SAIPAPBVfacet@locale@2@PBV42@@Z', '?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z', '?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ', '??1?$basic_streambuf@DU?$char_traits@D@std@@@std@@UAE@XZ', '?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JXZ', '?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPAD_J@Z', '?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAE_JPBD_J@Z', '??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ', '??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z', '??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ', '?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PAD_J@Z', '?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z', '?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@U_Mbstatet@@@2@XZ', '?width@ios_base@std@@QAE_J_J@Z', '?width@ios_base@std@@QBE_JXZ', '?flags@ios_base@std@@QBEHXZ', '?good@ios_base@std@@QBE_NXZ', '?always_noconv@codecvt_base@std@@QBE_NXZ', '??Bid@locale@std@@QAEIXZ', '?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAE_JPBD_J@Z', '??1_Lockit@std@@QAE@XZ', '??0_Lockit@std@@QAE@H@Z', '?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A', '?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ', '?uncaught_exception@std@@YA_NXZ', '?_Xout_of_range@std@@YAXPBD@Z', '?id@?$codecvt@DDU_Mbstatet@@@std@@2V0locale@2@A', '?_Fiopen@std@@YAPAU_iobuf@@PBDHH@Z', '?_Xlength_error@std@@YAXPBD@Z', '?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IBE_JXZ', '_CxxThrowException', '__current_exception_context', '__std_exception_copy', '__std_exception_destroy', '__CxxFrameHandler3', 'memcpy', '__current_exception', 'memset', '_except_handler4_common', 'memmove', '_fseeki64', '__p__commode', 'fsetpos', 'ungetc', 'setvbuf', 'fgetpos', 'fwrite', '_set_fmode', '_get_stream_buffer_pointers', '__stdio_common_vfprintf', 'fgetc', 'fclose', 'fflush', '__acrt_iob_func', 'fputc', 'fread', '_lock_file', '_unlock_file', 'exit', '_exit', '_configure_narrow_argv', '__p___argc', '_initterm_e', '_cexit', '_c_exit', '_register_thread_local_exe_atexit_callback', '_initterm', '_set_app_type', '_get_initial_narrow_environment', '_seh_filter_exe', '_initialize_onexit_table', '_register_onexit_function', '_crt_atexit', '_controlfp_s', 'terminate', '_initialize_narrow_environment', '_invalid_parameter_noinfo_noreturn', '__p___argv', 'free', '_set_new_mode', 'malloc', '_callnewh', '__setusermatherr', '_configthreadlocale'], ['GetCurrentProcess', 'FindNextFileA', 'FindClose', 'GetSystemDirectoryA', 'DeleteFileA', 'SetFileAttributesA', 'ExitProcess', 'FLine truncated
Binary file not shown.
+9 -58
View File
@@ -1,15 +1,8 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'C:\Users\User\Documents\Project\Python\PYAS\Library\Qtui\PYAS_Interface.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys, PYAS_Resource
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
@@ -21,8 +14,7 @@ class Ui_MainWindow(object):
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
MainWindow.setFont(font)
MainWindow.setFocusPolicy(QtCore.Qt.TabFocus)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/icon/Icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
icon = QtGui.QIcon(QFileIconProvider().icon(QFileInfo(str(sys.argv[0]))))
MainWindow.setWindowIcon(icon)
MainWindow.setIconSize(QtCore.QSize(64, 64))
MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
@@ -831,7 +823,7 @@ class Ui_MainWindow(object):
self.State_title.setAlignment(QtCore.Qt.AlignCenter)
self.State_title.setObjectName("State_title")
self.State_icon = QtWidgets.QLabel(self.State_widget)
self.State_icon.setGeometry(QtCore.QRect(250, 20, 171, 171))
self.State_icon.setGeometry(QtCore.QRect(250, 30, 171, 171))
font = QtGui.QFont()
font.setFamily("Microsoft YaHei")
font.setPointSize(1)
@@ -860,38 +852,7 @@ class Ui_MainWindow(object):
font.setStyleStrategy(QtGui.QFont.PreferAntialias)
self.State_output.setFont(font)
self.State_output.setAutoFillBackground(False)
self.State_output.setStyleSheet("QScrollBar:vertical\n"
"{\n"
" border: none;\n"
" background: transparent;\n"
" width: 10px;\n"
"}\n"
" \n"
"QScrollBar::handle:vertical\n"
"{\n"
" background-color: rgba(200, 200, 200,1);\n"
" min-height: 30px;\n"
" border-radius:3px;\n"
" width: 6px;\n"
" }\n"
" \n"
"QScrollBar::add-line:vertical\n"
"{\n"
" border: none;\n"
" height: 0px;\n"
" }\n"
" \n"
" QScrollBar::sub-line:vertical\n"
"{\n"
" border: none;\n"
" height: 0px;\n"
"}\n"
" \n"
" QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical\n"
" { \n"
" background:transparent;\n"
" border-radius:3px;\n"
"}")
self.State_output.setStyleSheet("")
self.State_output.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustIgnored)
self.State_output.setUndoRedoEnabled(True)
self.State_output.setTextInteractionFlags(QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse)
@@ -1859,7 +1820,6 @@ class Ui_MainWindow(object):
self.Language_Choose_widget_2.raise_()
self.Theme_title.raise_()
self.Protection_widget.raise_()
self.State_widget.raise_()
self.Setting_widget.raise_()
self.About_widget.raise_()
self.Tools_widget.raise_()
@@ -1868,6 +1828,7 @@ class Ui_MainWindow(object):
self.Virus_Scan_widget.raise_()
self.Window_widget.raise_()
self.Navigation_Bar.raise_()
self.State_widget.raise_()
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
@@ -1909,14 +1870,7 @@ class Ui_MainWindow(object):
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Microsoft YaHei\'; font-size:11pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">asdasas</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">dasd</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">a</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">sd</p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">asd</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">as</p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">dasd</p></body></html>"))
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"))
self.State_log.setText(_translate("MainWindow", "日誌:"))
self.About_Back.setText(_translate("MainWindow", "返回"))
self.PYAS_Version.setText(_translate("MainWindow", "PYAS v2.3.5"))
@@ -1962,11 +1916,8 @@ class Ui_MainWindow(object):
self.Theme_Blue.setText(_translate("MainWindow", "藍色主題"))
self.Theme_Red.setText(_translate("MainWindow", "紅色主題"))
self.Theme_Green.setText(_translate("MainWindow", "綠色主題"))
import PYAS_Resource
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
+1 -1
View File
@@ -1,7 +1,7 @@
import pyinstaller_versionfile
pyinstaller_versionfile.create_versionfile(
output_file="versionfile.txt",
version='2.8.6',
version='2.8.7',
company_name="PYAS Security",
file_description="Python Antivirus Software",
internal_name="PYAS",
+6 -4
View File
@@ -1,9 +1,8 @@
# PYAS (Python Antivirus Software)
![PYAS](https://github.com/87owo/PYAS/assets/85057800/46f46cf0-dbf3-4a33-b28d-234f610f1a07)
![PYAS](https://github.com/87owo/PYAS/assets/85057800/153bcad9-18ab-4c81-bcb6-186434d0ef1b)
## Official Website
https://pyantivirus.wixsite.com/pyas ,
https://github.com/87owo/PYAS
https://pyantivirus.wixsite.com/pyas , https://github.com/87owo/PYAS
## MIT License
https://github.com/87owo/PYAS/blob/main/LICENSE.md
@@ -11,8 +10,11 @@ https://github.com/87owo/PYAS/blob/main/LICENSE.md
## Support System
Windows 8.1, 10, 11 (64-bit), Ram 1GB, Rom 1GB or higher
## Requirements
psutil==5.9.5, pefile==2023.2.7, requests==2.31.0, pyperclip==1.8.2, pywin32==306, PyQt5==5.15.9
## Import Module
os, gc, sys, time, json, requests, pyperclip, psutil, ctypes, pywin32, subprocess, xml, hashlib, pefile, PyQt5, threading, PYAS_Language, PYAS_Scripts, PYAS_Function, PYAS_Extension, PYAS_Interface
os, gc, sys, time, json, psutil, hashlib, pefile, socket, msvcrt, requests, pyperclip, win32file, win32gui, win32api, win32con, xml, PYAS_Scripts, PYAS_Function, PYAS_Extension, PYAS_Language, PYAS_Interface, threading, PyQt5
## Special Thanks
360, Wix, VirusShare, mtkiao129, LenStevens