Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e370e776a | ||
|
|
ab6b319738 | ||
|
|
aca03cacf9 | ||
|
|
01b5e7ced0 | ||
|
|
6d8ef1d4a4 | ||
|
|
f029636757 | ||
|
|
168b396daa | ||
|
|
0873a59392 | ||
|
|
3c646f57e6 | ||
|
|
940db64678 | ||
|
|
da1c980743 | ||
|
|
e3a4b636f7 | ||
|
|
9434898efa | ||
|
|
5d1c17e6ff | ||
|
|
4f736b352a | ||
|
|
037e2fbab1 | ||
|
|
4b24858631 | ||
|
|
81904a3a7b | ||
|
|
6e63a789cb | ||
|
|
4b977ec4df | ||
|
|
fa692caaa8 | ||
|
|
7082003e4a | ||
|
|
dec35d9b8a | ||
|
|
90711465ba | ||
|
|
1bb74f20b4 | ||
|
|
b2cce37490 | ||
|
|
22e41eeacc | ||
|
|
600f2543a6 | ||
|
|
9e7185ae6d | ||
|
|
11725afa5a | ||
|
|
3bb94d05be | ||
|
|
7290db72e8 | ||
|
|
4dc92b081e | ||
|
|
68c614d9dd | ||
|
|
efca8d0161 | ||
|
|
6d86b15800 | ||
|
|
f43b2df6fc | ||
|
|
9f3eb593f8 | ||
|
|
9ca7c41fe7 | ||
|
|
f39746c116 | ||
|
|
88f1dc2c01 | ||
|
|
ee3daae665 | ||
|
|
9a47f06c2a |
No files matched your search
@@ -1,41 +1,39 @@
|
||||
import os, gc, sys, time, json, requests
|
||||
import psutil, ctypes, win32con, win32gui
|
||||
import win32file, win32api, subprocess
|
||||
import xml.etree.ElementTree as et
|
||||
from hashlib import md5, sha1, sha256
|
||||
from pefile import PE, DIRECTORY_ENTRY
|
||||
import os, gc, sys, time, json, psutil
|
||||
import subprocess, requests, msvcrt
|
||||
import win32gui, win32api, win32con
|
||||
import hashlib, pefile, win32file
|
||||
import xml.etree.ElementTree as xmlet
|
||||
from PYAS_Scripts import scripts_list
|
||||
from PYAS_Language import translations
|
||||
from PYAS_Function import function_list
|
||||
from PYAS_Extension import slist, alist
|
||||
from PYAS_Language import translate_dict
|
||||
from PYAS_Interface import Ui_MainWindow
|
||||
from PyQt5 import QtWidgets, QtGui, QtCore
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtCore import *
|
||||
from threading import Thread
|
||||
from PyQt5.QtWidgets import *
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
|
||||
class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
class MainWindow_Controller(QMainWindow):
|
||||
def __init__(self):
|
||||
super(MainWindow_Controller, self).__init__()
|
||||
self.setAttribute(Qt.WA_TranslucentBackground)
|
||||
self.setWindowFlags(Qt.FramelessWindowHint)
|
||||
self.pyas = str(sys.argv[0]).replace("\\", "/")
|
||||
self.pyas_version = "2.8.4"
|
||||
self.ui = Ui_MainWindow()
|
||||
self.ui.setupUi(self)
|
||||
self.init_library()
|
||||
self.init_configs()
|
||||
self.init_whitelist()
|
||||
self.init_blocklist()
|
||||
self.init_tray_icon()
|
||||
self.init_virus_list()
|
||||
self.init_state_safe()
|
||||
self.init_config_path()
|
||||
self.init_config_list()
|
||||
self.init_config_boot()
|
||||
self.init_config_json()
|
||||
self.init_config_qtui()
|
||||
self.init_change_lang()
|
||||
self.init_control()
|
||||
self.init_threads()
|
||||
self.show_pyas_ui()
|
||||
|
||||
def init_tray_icon(self):
|
||||
self.tray_icon = QSystemTrayIcon(self)
|
||||
self.tray_icon.setIcon(QFileIconProvider().icon(QFileInfo(self.pyas)))
|
||||
self.tray_icon.activated.connect(self.show_pyas_ui)
|
||||
self.tray_icon.show()
|
||||
self.init_threads()
|
||||
|
||||
def init_threads(self):
|
||||
self.protect_proc_init()
|
||||
@@ -45,34 +43,13 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.protect_enh_init()
|
||||
self.block_window_init()
|
||||
|
||||
def init_configs(self):
|
||||
self.scan_file = False
|
||||
self.block_window = True
|
||||
self.pyas_opacity = 0
|
||||
self.pyas_version = "2.8.2"
|
||||
self.ui.Theme_White.setChecked(True)
|
||||
self.pyas = str(sys.argv[0]).replace("\\", "/")
|
||||
self.key = self.pyas_key()
|
||||
self.json = self.init_config_json()
|
||||
self.set_system_safe()
|
||||
self.init_config_lang()
|
||||
self.init_config_sens()
|
||||
self.init_boot_config()
|
||||
self.init_config_ui()
|
||||
def init_tray_icon(self):
|
||||
self.tray_icon = QSystemTrayIcon(self)
|
||||
self.tray_icon.setIcon(QFileIconProvider().icon(QFileInfo(self.pyas)))
|
||||
self.tray_icon.activated.connect(self.show_pyas_ui)
|
||||
self.tray_icon.show()
|
||||
|
||||
def pyas_key(self):
|
||||
try:
|
||||
with open(self.pyas, "rb") as f:
|
||||
text = str(md5(f.read()).hexdigest())
|
||||
response = requests.get("http://27.147.30.238:5001/pyas", params={"key": text}, timeout=3)
|
||||
if response.status_code == 200 and response.text == "True":
|
||||
return ""
|
||||
else:
|
||||
return "(安全密鑰錯誤)"
|
||||
except:
|
||||
return "(網路連接錯誤)"
|
||||
|
||||
def init_library(self):
|
||||
def init_config_path(self):
|
||||
try:
|
||||
if not os.path.exists("C:/Windows/SysWOW64/PYAS"):
|
||||
os.makedirs("C:/Windows/SysWOW64/PYAS")
|
||||
@@ -83,47 +60,44 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
with open("C:/Windows/SysWOW64/PYAS/PYAS.json", "w", encoding="utf-8") as f:
|
||||
f.write(json.dumps(config, indent=4, ensure_ascii=False))
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
def init_whitelist(self):
|
||||
try:
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "r", encoding="utf-8") as f:
|
||||
self.whitelist = [line.strip() for line in f.readlines()]
|
||||
except:
|
||||
pass
|
||||
|
||||
def init_virus_list(self):
|
||||
try:
|
||||
self.virus_lock = {}
|
||||
self.virus_list = []
|
||||
self.virus_list_ui = []
|
||||
except:
|
||||
pass
|
||||
|
||||
def init_config_list(self):
|
||||
try:
|
||||
self.whitelist = []
|
||||
|
||||
def init_blocklist(self):
|
||||
try:
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "r", encoding="utf-8") as f:
|
||||
self.blocklist = [line.strip() for line in f.readlines()]
|
||||
except:
|
||||
if os.path.exists("C:/Windows/SysWOW64/PYAS/Whitelist.txt"):
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "r", encoding="utf-8") as f:
|
||||
self.whitelist = [line.strip() for line in f.readlines()]
|
||||
self.blocklist = []
|
||||
if os.path.exists("C:/Windows/SysWOW64/PYAS/Blocklist.txt"):
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "r", encoding="utf-8") as f:
|
||||
self.blocklist = [line.strip() for line in f.readlines()]
|
||||
except:
|
||||
pass
|
||||
|
||||
def init_boot_config(self):
|
||||
def init_config_boot(self):
|
||||
try:
|
||||
with open(r"\\.\PhysicalDrive0", "r+b") as f:
|
||||
self.mbr_value = f.read(512)
|
||||
if self.mbr_value[510:512] != b'\x55\xAA':
|
||||
self.mbr_value = False
|
||||
except:
|
||||
self.mbr_value = None
|
||||
self.mbr_value = False
|
||||
|
||||
def init_config_json(self):
|
||||
if not os.path.exists("C:/Windows/SysWOW64/PYAS/PYAS.json"):
|
||||
self.write_config({"language":"en_US","high_sensitivity":0,"cloud_services":1})
|
||||
with open("C:/Windows/SysWOW64/PYAS/PYAS.json", "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
|
||||
def init_config_lang(self):
|
||||
self.language = self.json.get("language", "en_US")
|
||||
if self.language == "zh_TW":
|
||||
self.ui.Language_Traditional_Chinese.setChecked(True)
|
||||
elif self.language == "zh_CN":
|
||||
self.ui.Language_Simplified_Chinese.setChecked(True)
|
||||
else:
|
||||
self.ui.Language_English.setChecked(True)
|
||||
self.init_lang_text()
|
||||
|
||||
def init_config_sens(self):
|
||||
self.json = json.load(f)
|
||||
self.high_sensitivity = self.json.get("high_sensitivity", 0)
|
||||
if self.high_sensitivity == 1:
|
||||
self.ui.high_sensitivity_switch_Button.setText(self.trans("已開啟"))
|
||||
@@ -136,8 +110,16 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.cloud_services_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,200,20,100);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,200,20,120);}""")
|
||||
self.language = self.json.get("language", "en_US")
|
||||
if self.language == "zh_TW":
|
||||
self.ui.Language_Traditional_Chinese.setChecked(True)
|
||||
elif self.language == "zh_CN":
|
||||
self.ui.Language_Simplified_Chinese.setChecked(True)
|
||||
else:
|
||||
self.ui.Language_English.setChecked(True)
|
||||
|
||||
def init_control(self):
|
||||
self.ui.Theme_White.setChecked(True)
|
||||
self.ui.Close_Button.clicked.connect(self.close)
|
||||
self.ui.Minimize_Button.clicked.connect(self.showMinimized)
|
||||
self.ui.Menu_Button.clicked.connect(self.show_menu)
|
||||
@@ -169,9 +151,9 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.high_sensitivity_switch_Button.clicked.connect(self.change_sensitive)
|
||||
self.ui.cloud_services_switch_Button.clicked.connect(self.change_cloud_service)
|
||||
self.ui.Add_White_list_Button.clicked.connect(self.add_white_list)
|
||||
self.ui.Language_Traditional_Chinese.clicked.connect(self.change_lang)
|
||||
self.ui.Language_Simplified_Chinese.clicked.connect(self.change_lang)
|
||||
self.ui.Language_English.clicked.connect(self.change_lang)
|
||||
self.ui.Language_Traditional_Chinese.clicked.connect(self.init_change_lang)
|
||||
self.ui.Language_Simplified_Chinese.clicked.connect(self.init_change_lang)
|
||||
self.ui.Language_English.clicked.connect(self.init_change_lang)
|
||||
self.ui.Theme_White.clicked.connect(self.change_theme)
|
||||
self.ui.Theme_Black.clicked.connect(self.change_theme)
|
||||
self.ui.Theme_Green.clicked.connect(self.change_theme)
|
||||
@@ -179,7 +161,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.Theme_Blue.clicked.connect(self.change_theme)
|
||||
self.ui.Theme_Red.clicked.connect(self.change_theme)
|
||||
|
||||
def init_config_ui(self):
|
||||
def init_config_qtui(self):
|
||||
self.ui.widget_2.lower()
|
||||
self.ui.Navigation_Bar.raise_()
|
||||
self.ui.Window_widget.raise_()
|
||||
@@ -190,20 +172,20 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.Process_Timer = QTimer()
|
||||
self.Process_Timer.timeout.connect(self.process_list)
|
||||
self.ui.License_terms.setText('''Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''')
|
||||
self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow = QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow.setOffset(0,0)
|
||||
self.effect_shadow.setBlurRadius(10)
|
||||
self.effect_shadow.setColor(QtCore.Qt.gray)
|
||||
self.effect_shadow.setColor(Qt.gray)
|
||||
self.ui.widget_2.setGraphicsEffect(self.effect_shadow)
|
||||
self.effect_shadow2 = QtWidgets.QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow2 = QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow2.setOffset(0,0)
|
||||
self.effect_shadow2.setBlurRadius(10)
|
||||
self.effect_shadow2.setColor(QtCore.Qt.gray)
|
||||
self.effect_shadow2.setColor(Qt.gray)
|
||||
self.ui.Navigation_Bar.setGraphicsEffect(self.effect_shadow2)
|
||||
self.effect_shadow3 = QtWidgets.QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow3 = QGraphicsDropShadowEffect(self)
|
||||
self.effect_shadow3.setOffset(0,0)
|
||||
self.effect_shadow3.setBlurRadius(7)
|
||||
self.effect_shadow3.setColor(QtCore.Qt.gray)
|
||||
self.effect_shadow3.setColor(Qt.gray)
|
||||
self.ui.Window_widget.setGraphicsEffect(self.effect_shadow3)
|
||||
self.ui.Virus_Scan_choose_widget.hide()
|
||||
self.ui.Virus_Scan_widget.hide()
|
||||
@@ -215,7 +197,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.Setting_widget.hide()
|
||||
self.ui.About_widget.hide()
|
||||
|
||||
def change_lang(self):
|
||||
def init_change_lang(self):
|
||||
try:
|
||||
self.ui.State_output.clear()
|
||||
if self.ui.Language_Traditional_Chinese.isChecked():
|
||||
@@ -232,7 +214,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.bug_event(e)
|
||||
|
||||
def trans(self, text):
|
||||
for k, v in translations.get(self.json["language"], translations).items():
|
||||
for k, v in translate_dict.get(self.json["language"], translate_dict).items():
|
||||
text = text.replace(str(k), str(v))
|
||||
return text
|
||||
|
||||
@@ -277,7 +259,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.Window_Block_Button.setText(self.trans("軟體彈窗攔截"))
|
||||
self.ui.Repair_System_Network_Button.setText(self.trans("系統網路修復"))
|
||||
self.ui.About_Back.setText(self.trans("返回"))
|
||||
self.ui.PYAS_Version.setText(self.trans(f"PYAS V{self.pyas_version} {self.key}"))
|
||||
self.ui.PYAS_Version.setText(self.trans(f"PYAS V{self.pyas_version}"))
|
||||
self.ui.GUI_Made_title.setText(self.trans("介面製作:"))
|
||||
self.ui.GUI_Made_Name.setText(self.trans("mtkiao"))
|
||||
self.ui.Core_Made_title.setText(self.trans("核心製作:"))
|
||||
@@ -330,10 +312,9 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.Navigation_Bar.setStyleSheet("""QWidget#Navigation_Bar {background-color:rgb(0,190,255);}""")
|
||||
|
||||
def change_animation(self,widget):
|
||||
x = 170
|
||||
y = widget.pos().y()
|
||||
x, y = 170, widget.pos().y()
|
||||
self.anim = QPropertyAnimation(widget, b"geometry")
|
||||
widget.setGeometry(QtCore.QRect(x - 100,y, 671,481))
|
||||
widget.setGeometry(QRect(x - 100,y, 671,481))
|
||||
self.anim.setKeyValueAt(0.2, QRect(x - 60,y,671,481))
|
||||
self.anim.setKeyValueAt(0.4, QRect(x - 10,y,671,481))
|
||||
self.anim.setKeyValueAt(0.7, QRect(x - 3,y,671,481))
|
||||
@@ -341,8 +322,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.anim.start()
|
||||
|
||||
def change_animation_2(self,nx,ny):
|
||||
x = self.ui.label.pos().x()
|
||||
y = self.ui.label.pos().y()
|
||||
x, y = self.ui.label.pos().x(), self.ui.label.pos().y()
|
||||
self.anim2 = QPropertyAnimation(self.ui.label, b"geometry")
|
||||
if y > ny:
|
||||
self.anim2.setKeyValueAt(0.4, QRect(nx,ny + 25, 5, 35))
|
||||
@@ -361,15 +341,24 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.anim2.start()
|
||||
|
||||
def change_animation_3(self,widget,time):
|
||||
self.opacity = QtWidgets.QGraphicsOpacityEffect()
|
||||
self.opacity = QGraphicsOpacityEffect()
|
||||
self.opacity.setOpacity(0)
|
||||
self.opacity.i = self.opacity.opacity()
|
||||
widget.setGraphicsEffect(self.opacity)
|
||||
widget.setAutoFillBackground(True)
|
||||
self.draw(widget=widget,time=time)
|
||||
self.timer = QTimer()
|
||||
self.timer.timeout.connect(self.timeout)
|
||||
self.timer.start(0)
|
||||
|
||||
def timeout(self):
|
||||
if self.opacity.i < 1:
|
||||
self.opacity.i += 0.02
|
||||
self.opacity.setOpacity(self.opacity.i)
|
||||
else:
|
||||
self.timer.stop()
|
||||
|
||||
def change_animation_4(self,widget,time,ny,ny2):
|
||||
x = widget.pos().x()
|
||||
y = widget.pos().y()
|
||||
x, y = widget.pos().x(), widget.pos().y()
|
||||
self.anim4 = QPropertyAnimation(widget, b"geometry")
|
||||
self.anim4.setDuration(time)
|
||||
self.anim4.setStartValue(QRect(x, y, 141, ny))
|
||||
@@ -378,26 +367,13 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def change_animation_5(self,widget,x,y,nx,ny):
|
||||
self.anim = QPropertyAnimation(widget, b"geometry")
|
||||
widget.setGeometry(QtCore.QRect(x,y - 45, nx,ny))
|
||||
widget.setGeometry(QRect(x,y - 45, nx,ny))
|
||||
self.anim.setKeyValueAt(0.2, QRect(x,y - 30,nx,ny))
|
||||
self.anim.setKeyValueAt(0.4, QRect(x,y - 10,nx,ny))
|
||||
self.anim.setKeyValueAt(0.7, QRect(x,y - 3,nx,ny))
|
||||
self.anim.setKeyValueAt(1, QRect(x,y,nx,ny))
|
||||
self.anim.start()
|
||||
|
||||
def draw(self,widget,time):
|
||||
self.opacity.i = 0
|
||||
def timeout():
|
||||
if self.opacity.i < 100:
|
||||
self.opacity.i += 2
|
||||
self.opacity.setOpacity(self.opacity.i/100)
|
||||
widget.setGraphicsEffect(self.opacity)
|
||||
else:
|
||||
self.timer.stop()
|
||||
self.timer = QTimer()
|
||||
self.timer.timeout.connect(timeout)
|
||||
self.timer.start(5)
|
||||
|
||||
def change_state_widget(self):
|
||||
if self.ui.State_widget.isHidden():
|
||||
self.change_animation_2(20,50)
|
||||
@@ -477,8 +453,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.setWindowOpacity(self.pyas_opacity/100)
|
||||
else:
|
||||
self.timer.stop()
|
||||
x = event.x()
|
||||
y = event.y()
|
||||
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_Position=event.globalPos()-self.pos()
|
||||
@@ -523,6 +498,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def show_pyas_ui(self):
|
||||
self.show()
|
||||
self.pyas_opacity = 0
|
||||
while self.pyas_opacity < 100:
|
||||
time.sleep(0.001)
|
||||
self.pyas_opacity += 1
|
||||
@@ -543,22 +519,15 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def closeEvent(self, event):
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要退出 PYAS 和所有防護嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.block_window = False
|
||||
self.proc_protect = False
|
||||
self.file_protect = False
|
||||
self.mbr_protect = False
|
||||
self.reg_protect = False
|
||||
self.enh_protect = False
|
||||
self.scan_file = False
|
||||
self.tray_icon.hide()
|
||||
self.hide_pyas_ui()
|
||||
QApplication.instance().quit()
|
||||
event.ignore()
|
||||
event.accept()
|
||||
else:
|
||||
event.ignore()
|
||||
|
||||
def bug_event(self, error):
|
||||
try:
|
||||
print(f"[Error] {error}")
|
||||
QMessageBox.critical(self,self.trans("錯誤"),self.trans(f"錯誤: {error}"),QMessageBox.Ok)
|
||||
QMessageBox.critical(self,self.trans("錯誤"),error,QMessageBox.Ok)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -566,7 +535,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
now_time = time.strftime('%Y/%m/%d %H:%M:%S')
|
||||
self.ui.State_output.append(f"[{now_time}] {text}")
|
||||
self.tray_icon.showMessage(now_time, text, 5)
|
||||
self.tray_icon.showMessage(now_time, text, 5000)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -576,50 +545,46 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
Main_About = QAction(self.trans("關於"),self)
|
||||
self.WindowMenu.addAction(Main_Settings)
|
||||
self.WindowMenu.addAction(Main_About)
|
||||
Qusetion = self.WindowMenu.exec_(self.ui.Menu_Button.mapToGlobal(QtCore.QPoint(0, 30)))
|
||||
if Qusetion == Main_About:
|
||||
if self.ui.About_widget.isHidden():
|
||||
self.ui.About_widget.show()
|
||||
self.ui.About_widget.raise_()
|
||||
self.ui.Navigation_Bar.raise_()
|
||||
self.ui.Window_widget.raise_()
|
||||
self.change_animation_3(self.ui.About_widget,0.5)
|
||||
self.change_animation_5(self.ui.About_widget,170,50,671,481)
|
||||
self.setting_back()
|
||||
if Qusetion == Main_Settings:
|
||||
if self.ui.Setting_widget.isHidden():
|
||||
self.ui.Setting_widget.show()
|
||||
self.ui.About_widget.hide()
|
||||
self.ui.Setting_widget.raise_()
|
||||
self.ui.Window_widget.raise_()
|
||||
self.change_animation_3(self.ui.Setting_widget,0.5)
|
||||
self.change_animation_5(self.ui.Setting_widget,10,50,831,481)
|
||||
Qusetion = self.WindowMenu.exec_(self.ui.Menu_Button.mapToGlobal(QPoint(0, 30)))
|
||||
if Qusetion == Main_About and self.ui.About_widget.isHidden():
|
||||
self.ui.About_widget.show()
|
||||
self.ui.About_widget.raise_()
|
||||
self.ui.Navigation_Bar.raise_()
|
||||
self.ui.Window_widget.raise_()
|
||||
self.change_animation_3(self.ui.About_widget,0.5)
|
||||
self.change_animation_5(self.ui.About_widget,170,50,671,481)
|
||||
self.setting_back()
|
||||
if Qusetion == Main_Settings and self.ui.Setting_widget.isHidden():
|
||||
self.ui.Setting_widget.show()
|
||||
self.ui.About_widget.hide()
|
||||
self.ui.Setting_widget.raise_()
|
||||
self.ui.Window_widget.raise_()
|
||||
self.change_animation_3(self.ui.Setting_widget,0.5)
|
||||
self.change_animation_5(self.ui.Setting_widget,10,50,831,481)
|
||||
|
||||
def change_sensitive(self):
|
||||
sw_state = self.ui.high_sensitivity_switch_Button.text()
|
||||
if sw_state == self.trans("已關閉") and QMessageBox.warning(self,self.trans("警告"),self.trans("高靈敏度模式可能會誤報檔案,您確定要開啟嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.high_sensitivity = 1
|
||||
self.json["high_sensitivity"] = 1
|
||||
self.write_config(self.json)
|
||||
self.ui.high_sensitivity_switch_Button.setText(self.trans("已開啟"))
|
||||
self.ui.high_sensitivity_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,200,20,100);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,200,20,120);}""")
|
||||
elif sw_state == self.trans("已開啟"):
|
||||
if sw_state == self.trans("已開啟"):
|
||||
self.high_sensitivity = 0
|
||||
self.json["high_sensitivity"] = 0
|
||||
self.write_config(self.json)
|
||||
self.ui.high_sensitivity_switch_Button.setText(self.trans("已關閉"))
|
||||
self.ui.high_sensitivity_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,20,20,30);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,20,20,50);}""")
|
||||
elif QMessageBox.warning(self,self.trans("警告"),self.trans("此選項可能會誤報檔案,您確定要開啟嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.high_sensitivity = 1
|
||||
self.json["high_sensitivity"] = 1
|
||||
self.ui.high_sensitivity_switch_Button.setText(self.trans("已開啟"))
|
||||
self.ui.high_sensitivity_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,200,20,100);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,200,20,120);}""")
|
||||
self.write_config(self.json)
|
||||
|
||||
def change_cloud_service(self):
|
||||
sw_state = self.ui.cloud_services_switch_Button.text()
|
||||
if sw_state == self.trans("已關閉"):
|
||||
self.cloud_services = 1
|
||||
self.json["cloud_services"] = 1
|
||||
self.write_config(self.json)
|
||||
self.ui.cloud_services_switch_Button.setText(self.trans("已開啟"))
|
||||
self.ui.cloud_services_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,200,20,100);border-radius: 15px;}
|
||||
@@ -627,41 +592,99 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
elif sw_state == self.trans("已開啟"):
|
||||
self.cloud_services = 0
|
||||
self.json["cloud_services"] = 0
|
||||
self.write_config(self.json)
|
||||
self.ui.cloud_services_switch_Button.setText(self.trans("已關閉"))
|
||||
self.ui.cloud_services_switch_Button.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,20,20,30);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,20,20,50);}""")
|
||||
self.write_config(self.json)
|
||||
|
||||
def set_system_safe(self):
|
||||
def init_state_safe(self):
|
||||
try:
|
||||
self.safe = True
|
||||
self.ui.State_icon.setPixmap(QtGui.QPixmap(":/icon/Check.png"))
|
||||
self.ui.State_icon.setPixmap(QPixmap(":/icon/Check.png"))
|
||||
self.ui.State_title.setText(self.trans("此裝置已受到防護"))
|
||||
except:
|
||||
pass
|
||||
|
||||
def set_system_unsafe(self):
|
||||
def init_state_unsafe(self):
|
||||
try:
|
||||
self.safe = False
|
||||
self.ui.State_icon.setPixmap(QtGui.QPixmap(":/icon/Close.png"))
|
||||
self.ui.State_icon.setPixmap(QPixmap(":/icon/Close.png"))
|
||||
self.ui.State_title.setText(self.trans("此裝置當前不安全"))
|
||||
except:
|
||||
pass
|
||||
|
||||
def init_scan(self):
|
||||
self.scan_file = True
|
||||
self.Virus_List = []
|
||||
self.Virus_List_Ui = []
|
||||
self.ui.Virus_Scan_Solve_Button.hide()
|
||||
self.ui.Virus_Scan_choose_widget.hide()
|
||||
self.ui.Virus_Scan_choose_Button.hide()
|
||||
self.ui.Virus_Scan_Break_Button.show()
|
||||
self.Virus_List_output=QStringListModel()
|
||||
self.Virus_List_output.setStringList(self.Virus_List)
|
||||
self.ui.Virus_Scan_output.setModel(self.Virus_List_output)
|
||||
self.ui.Virus_Scan_text.setText(self.trans("正在初始化中"))
|
||||
QApplication.processEvents()
|
||||
try:
|
||||
self.ui.Virus_Scan_text.setText(self.trans("正在初始化中"))
|
||||
QApplication.processEvents()
|
||||
for file in self.virus_list:
|
||||
try:
|
||||
msvcrt.locking(self.virus_lock[file], msvcrt.LK_UNLCK, 0)
|
||||
os.close(self.virus_lock[file])
|
||||
del self.virus_lock[file]
|
||||
except:
|
||||
continue
|
||||
self.scan_file = True
|
||||
self.init_virus_list()
|
||||
self.ui.Virus_Scan_Solve_Button.hide()
|
||||
self.ui.Virus_Scan_choose_widget.hide()
|
||||
self.ui.Virus_Scan_choose_Button.hide()
|
||||
self.ui.Virus_Scan_Break_Button.show()
|
||||
self.virus_list_output = QStringListModel()
|
||||
self.virus_list_output.setStringList(self.virus_list)
|
||||
self.ui.Virus_Scan_output.setModel(self.virus_list_output)
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
def virus_solve(self):
|
||||
try:
|
||||
self.ui.Virus_Scan_Solve_Button.hide()
|
||||
for file in self.virus_list:
|
||||
try:
|
||||
self.ui.Virus_Scan_text.setText(self.trans("正在刪除: ")+file)
|
||||
QApplication.processEvents()
|
||||
msvcrt.locking(self.virus_lock[file], msvcrt.LK_UNLCK, 0)
|
||||
os.close(self.virus_lock[file])
|
||||
os.remove(file)
|
||||
except:
|
||||
continue
|
||||
self.init_state_safe()
|
||||
self.init_virus_list()
|
||||
self.virus_list_output.setStringList(self.virus_list)
|
||||
self.ui.Virus_Scan_output.setModel(self.virus_list_output)
|
||||
self.ui.Virus_Scan_text.setText(self.trans("成功: 刪除成功"))
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
def write_scan(self, state, file):
|
||||
try:
|
||||
self.virus_list.append(file)
|
||||
self.virus_list_ui.append(f"[{state}] {file}")
|
||||
self.virus_list_output.setStringList(self.virus_list_ui)
|
||||
self.ui.Virus_Scan_output.setModel(self.virus_list_output)
|
||||
self.virus_lock[file] = os.open(file, os.O_RDWR)
|
||||
msvcrt.locking(self.virus_lock[file], msvcrt.LK_NBLCK, 0)
|
||||
except:
|
||||
pass
|
||||
|
||||
def answer_scan(self):
|
||||
try:
|
||||
if self.virus_list:
|
||||
self.init_state_unsafe()
|
||||
self.ui.Virus_Scan_Solve_Button.show()
|
||||
self.ui.Virus_Scan_Break_Button.hide()
|
||||
self.ui.Virus_Scan_choose_Button.show()
|
||||
text = self.trans(f"當前發現 {len(self.virus_list)} 個病毒")
|
||||
else:
|
||||
self.virus_scan_break()
|
||||
self.init_state_safe()
|
||||
text = self.trans("當前未發現病毒")
|
||||
self.ui.Virus_Scan_text.setText(text)
|
||||
self.send_notify(text)
|
||||
gc.collect()
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
def virus_scan_break(self):
|
||||
self.scan_file = False
|
||||
@@ -676,69 +699,24 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
else:
|
||||
self.ui.Virus_Scan_choose_widget.hide()
|
||||
|
||||
def write_scan(self,state,file):
|
||||
try:
|
||||
self.Virus_List.append(file)
|
||||
self.Virus_List_Ui.append(f"[{state}] {file}")
|
||||
self.Virus_List_output.setStringList(self.Virus_List_Ui)
|
||||
self.ui.Virus_Scan_output.setModel(self.Virus_List_output)
|
||||
except:
|
||||
pass
|
||||
|
||||
def answer_scan(self):
|
||||
if self.Virus_List == []:
|
||||
self.set_system_safe()
|
||||
self.virus_scan_break()
|
||||
text = self.trans("當前未發現病毒")
|
||||
else:
|
||||
self.virus_scan_break()
|
||||
self.set_system_unsafe()
|
||||
self.Virus_List_output.setStringList(self.Virus_List_Ui)
|
||||
self.ui.Virus_Scan_output.setModel(self.Virus_List_output)
|
||||
self.ui.Virus_Scan_Solve_Button.show()
|
||||
text = self.trans(f"當前發現 {len(self.Virus_List)} 個病毒")
|
||||
self.ui.Virus_Scan_text.setText(text)
|
||||
self.send_notify(text)
|
||||
|
||||
def virus_solve(self):
|
||||
try:
|
||||
for file in self.Virus_List:
|
||||
try:
|
||||
self.ui.Virus_Scan_text.setText(self.trans("正在刪除: ")+file)
|
||||
QApplication.processEvents()
|
||||
os.remove(file)
|
||||
except:
|
||||
continue
|
||||
self.set_system_safe()
|
||||
self.Virus_List = []
|
||||
self.Virus_List_Ui = []
|
||||
self.ui.Virus_Scan_Solve_Button.hide()
|
||||
self.Virus_List_output.setStringList(self.Virus_List)
|
||||
self.ui.Virus_Scan_output.setModel(self.Virus_List_output)
|
||||
self.ui.Virus_Scan_text.setText(self.trans("成功: 刪除成功"))
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
def file_scan(self):
|
||||
try:
|
||||
file, ftype = QFileDialog.getOpenFileName(self,self.trans("病毒掃描"),"C:/")
|
||||
if file:
|
||||
file = str(QFileDialog.getOpenFileName(self,self.trans("病毒掃描"),"C:/")[0])
|
||||
if file and file != self.pyas:
|
||||
self.init_scan()
|
||||
self.start_scan(file)
|
||||
self.answer_scan()
|
||||
gc.collect()
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
self.virus_scan_break()
|
||||
|
||||
def path_scan(self):
|
||||
try:
|
||||
path = QFileDialog.getExistingDirectory(self,self.trans("病毒掃描"),"C:/")
|
||||
path = str(QFileDialog.getExistingDirectory(self,self.trans("病毒掃描"),"C:/"))
|
||||
if path:
|
||||
self.init_scan()
|
||||
self.traverse_path(path)
|
||||
self.answer_scan()
|
||||
gc.collect()
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
self.virus_scan_break()
|
||||
@@ -750,28 +728,27 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
if os.path.exists(f"{chr(65+d)}:/"):
|
||||
self.traverse_path(f"{chr(65+d)}:/")
|
||||
self.answer_scan()
|
||||
gc.collect()
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
self.virus_scan_break()
|
||||
|
||||
def start_scan(self, file):
|
||||
try:
|
||||
file_type = str("."+file.split(".")[-1]).lower()
|
||||
file_type = str(f".{file.split('.')[-1]}").lower()
|
||||
if self.high_sensitivity == 1:
|
||||
if self.api_scan(file):
|
||||
self.write_scan(self.trans("惡意"),file)
|
||||
elif self.scr_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
elif self.pe_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
elif self.scr_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
elif file_type in slist and self.sign_scan(file):
|
||||
if self.api_scan(file):
|
||||
self.write_scan(self.trans("惡意"),file)
|
||||
elif self.scr_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
elif self.pe_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
elif self.scr_scan(file):
|
||||
self.write_scan(self.trans("可疑"),file)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -785,11 +762,11 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
continue
|
||||
elif os.path.isdir(file):
|
||||
self.traverse_path(file)
|
||||
else:
|
||||
elif file != self.pyas:
|
||||
self.ui.Virus_Scan_text.setText(self.trans(f"正在掃描: ")+file)
|
||||
QApplication.processEvents()
|
||||
self.start_scan(file)
|
||||
gc.collect()
|
||||
gc.collect()
|
||||
except:
|
||||
continue
|
||||
|
||||
@@ -797,24 +774,25 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
if self.cloud_services == 1:
|
||||
with open(file, "rb") as f:
|
||||
text = str(md5(f.read()).hexdigest())
|
||||
text = str(hashlib.md5(f.read()).hexdigest())
|
||||
strBody = f'-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="md5s"\r\n\r\n{text}\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="format"\r\n\r\nXML\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="product"\r\n\r\n360zip\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="combo"\r\n\r\n360zip_main\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="v"\r\n\r\n2\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="osver"\r\n\r\n5.1\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="vk"\r\n\r\na03bc211\r\n-------------------------------7d83e2d7a141e\r\nContent-Disposition: form-data; name="mid"\r\n\r\n8a40d9eff408a78fe9ec10a0e7e60f62\r\n-------------------------------7d83e2d7a141e--'
|
||||
response = requests.post('http://qup.f.360.cn/file_health_info.php', data=strBody, timeout=3)
|
||||
return response.status_code == 200 and float(et.fromstring(response.text).find('.//e_level').text) > 50
|
||||
return response.status_code == 200 and float(xmlet.fromstring(response.text).find('.//e_level').text) > 50
|
||||
except:
|
||||
return False
|
||||
|
||||
def sign_scan(self, file):
|
||||
try:
|
||||
with PE(file, fast_load=True) as pe:
|
||||
return pe.OPTIONAL_HEADER.DATA_DIRECTORY[DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]].VirtualAddress == 0
|
||||
with pefile.PE(file, fast_load=True) as pe:
|
||||
return pe.OPTIONAL_HEADER.DATA_DIRECTORY[pefile.DIRECTORY_ENTRY["IMAGE_DIRECTORY_ENTRY_SECURITY"]].VirtualAddress == 0
|
||||
except:
|
||||
return True
|
||||
|
||||
def scr_scan(self, file):
|
||||
def scr_scan(self, text):
|
||||
try:
|
||||
with open(file, "r", encoding="utf-8") as f:
|
||||
text = f.read()
|
||||
if os.path.isfile(text):
|
||||
with open(text, "r", encoding="utf-8") as f:
|
||||
text = f.read()
|
||||
return any(sn in text for sn in scripts_list)
|
||||
except:
|
||||
return False
|
||||
@@ -822,7 +800,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
def pe_scan(self, file):
|
||||
try:
|
||||
fn = []
|
||||
with PE(file) as pe:
|
||||
with pefile.PE(file) as pe:
|
||||
for entry in pe.DIRECTORY_ENTRY_IMPORT:
|
||||
for func in entry.imports:
|
||||
try:
|
||||
@@ -943,7 +921,10 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def repair_system_wallpaper(self):
|
||||
try:
|
||||
ctypes.windll.user32.SystemParametersInfoW(0x0014, 0, 'C:/Windows/web/wallpaper/windows/img0.jpg', 0x01 | 0x02)
|
||||
key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER, "Control Panel\\Desktop", 0, win32con.KEY_SET_VALUE)
|
||||
win32api.RegSetValueEx(key, "Wallpaper", 0, win32con.REG_SZ, 'C:/Windows/web/wallpaper/windows/img0.jpg')
|
||||
win32api.RegCloseKey(key)
|
||||
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, 'C:/Windows/web/wallpaper/windows/img0.jpg', win32con.SPIF_SENDCHANGE)
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -964,9 +945,9 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要清理系統垃圾嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.total_deleted_size = 0
|
||||
self.traverse_temp(f"C:/Users/{os.getlogin()}/AppData/Local/Temp")
|
||||
self.traverse_temp(f"C:/Windows/Temp")
|
||||
self.traverse_temp(f"C:/$Recycle.Bin")
|
||||
self.traverse_temp(f"C:/Users/{os.getlogin()}/AppData/Local/Temp/")
|
||||
self.traverse_temp(f"C:/Windows/Temp/")
|
||||
self.traverse_temp(f"C:/$Recycle.Bin/")
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功清理了 {self.total_deleted_size} 位元的系統垃圾"),QMessageBox.Ok)
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
@@ -987,26 +968,19 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def add_white_list(self):
|
||||
try:
|
||||
file, filetype= QFileDialog.getOpenFileName(self,self.trans("增加到白名單"),"C:/","All File *.*")
|
||||
if file not in ["", "PYAS"]:
|
||||
if str(file.replace("\\", "/")) not in self.whitelist:
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要增加到白名單嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
try:
|
||||
self.whitelist.append(str(file.replace("\\", "/")))
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "a+", encoding="utf-8") as f:
|
||||
f.write(str(file.replace("\\", "/"))+'\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功增加到白名單: ")+str(file.replace("\\", "/")),QMessageBox.Ok)
|
||||
except:
|
||||
self.bug_event('增加到白名單失敗')
|
||||
elif QMessageBox.warning(self,self.trans("警告"),self.trans(f"您確定要取消增加到白名單嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
try:
|
||||
self.whitelist.remove(str(file.replace("\\", "/")))
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "w", encoding="utf-8") as f:
|
||||
for file in self.whitelist:
|
||||
f.write(f'{file}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功取消增加到白名單: ")+str(file.replace("\\", "/")),QMessageBox.Ok)
|
||||
except:
|
||||
self.bug_event('取消增加到白名單失敗')
|
||||
file = str(QFileDialog.getOpenFileName(self,self.trans("增加到白名單"),"C:/")[0]).replace("\\", "/")
|
||||
if file and file not in self.whitelist:
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要增加到白名單嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.whitelist.append(file)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "a+", encoding="utf-8") as f:
|
||||
f.write(f"{file}\n")
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功增加到白名單: ")+file,QMessageBox.Ok)
|
||||
elif file and QMessageBox.warning(self,self.trans("警告"),self.trans("您確定要取消增加到白名單嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
self.whitelist.remove(file)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Whitelist.txt", "w", encoding="utf-8") as f:
|
||||
for white_file in self.whitelist:
|
||||
f.write(f'{white_file}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功取消增加到白名單: ")+file,QMessageBox.Ok)
|
||||
except Exception as e:
|
||||
self.bug_event(e)
|
||||
|
||||
@@ -1014,28 +988,22 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
self.block_window = False
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans("請選擇要攔截的軟體彈窗"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
while self.block_window == False:
|
||||
while not self.block_window:
|
||||
window_name = str(win32gui.GetWindowText(win32gui.GetForegroundWindow()))
|
||||
QApplication.processEvents()
|
||||
if window_name not in ["", "PYAS"]:
|
||||
if window_name not in ["","PYAS",self.trans("警告")]:
|
||||
if window_name not in self.blocklist:
|
||||
if QMessageBox.warning(self,self.trans("警告"),self.trans(f"您確定要攔截 {window_name} 嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
try:
|
||||
self.blocklist.append(window_name)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "a+", encoding="utf-8") as f:
|
||||
f.write(f'{window_name}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功增加到彈窗攔截: ")+window_name,QMessageBox.Ok)
|
||||
except:
|
||||
self.bug_event('增加到彈窗攔截失敗')
|
||||
self.blocklist.append(window_name)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "a+", encoding="utf-8") as f:
|
||||
f.write(f'{window_name}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功增加到彈窗攔截: ")+window_name,QMessageBox.Ok)
|
||||
elif QMessageBox.warning(self,self.trans("警告"),self.trans(f"您確定要取消攔截 {window_name} 嗎?"),QMessageBox.Yes|QMessageBox.No) == 16384:
|
||||
try:
|
||||
self.blocklist.remove(window_name)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "w", encoding="utf-8") as f:
|
||||
for window_name in self.blocklist:
|
||||
f.write(f'{window_name}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功取消彈窗攔截: ")+window_name,QMessageBox.Ok)
|
||||
except:
|
||||
self.bug_event('取消到彈窗攔截失敗')
|
||||
self.blocklist.remove(window_name)
|
||||
with open("C:/Windows/SysWOW64/PYAS/Blocklist.txt", "w", encoding="utf-8") as f:
|
||||
for block_name in self.blocklist:
|
||||
f.write(f'{block_name}\n')
|
||||
QMessageBox.information(self,self.trans("成功"),self.trans(f"成功取消彈窗攔截: ")+window_name,QMessageBox.Ok)
|
||||
self.block_window = True
|
||||
self.block_window_init()
|
||||
except Exception as e:
|
||||
@@ -1047,12 +1015,12 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
|
||||
def block_software_window(self):
|
||||
while self.block_window:
|
||||
time.sleep(0.2)
|
||||
for window_name in self.blocklist:
|
||||
try:
|
||||
try:
|
||||
time.sleep(0.2)
|
||||
for window_name in self.blocklist:
|
||||
win32gui.PostMessage(win32gui.FindWindow(None, window_name), win32con.WM_SYSCOMMAND, win32con.SC_CLOSE, 0)
|
||||
except:
|
||||
pass
|
||||
except:
|
||||
pass
|
||||
|
||||
def repair_network(self):
|
||||
try:
|
||||
@@ -1071,8 +1039,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
try:
|
||||
self.Process_list_app = []
|
||||
self.Process_list_app_pid = []
|
||||
self.Process_list_iter = psutil.process_iter()
|
||||
for p in self.Process_list_iter:
|
||||
for p in psutil.process_iter():
|
||||
try:
|
||||
self.Process_list_app.append(f"{p.name()} ({p.pid}) > {p.exe()}")
|
||||
self.Process_list_app_pid.append(p.pid)
|
||||
@@ -1130,7 +1097,7 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
self.ui.Protection_switch_Button_2.setStyleSheet("""
|
||||
QPushButton{border:none;background-color:rgba(20,200,20,100);border-radius: 15px;}
|
||||
QPushButton:hover{background-color:rgba(20,200,20,120);}""")
|
||||
Thread(target=self.protect_file_thread, args=("C:/Users/",), daemon=True).start()
|
||||
Thread(target=self.protect_file_thread, daemon=True).start()
|
||||
|
||||
def protect_boot_init(self):
|
||||
if self.ui.Protection_switch_Button_3.text() == self.trans("已開啟"):
|
||||
@@ -1182,72 +1149,71 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
if p.pid not in existing_processes:
|
||||
existing_processes.add(p.pid)
|
||||
while self.proc_protect:
|
||||
try:
|
||||
time.sleep(0.1)
|
||||
for p in psutil.process_iter():
|
||||
time.sleep(0.1)
|
||||
for p in psutil.process_iter():
|
||||
try:
|
||||
if p.pid not in existing_processes:
|
||||
existing_processes.add(p.pid)
|
||||
name, file, cmd = p.name(), p.exe().replace("\\", "/"), p.cmdline()
|
||||
if file == self.pyas or file in self.whitelist:
|
||||
continue
|
||||
elif ":/Windows" in file and self.enh_protect:
|
||||
if "cmd.exe" in name and self.api_scan(" ".join(cmd[2:])):
|
||||
if ":/Windows" in file and self.enh_protect:
|
||||
if "powershell" in name and self.api_scan(cmd[-1].split("'")[-2]):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意腳本攔截: ")+name)
|
||||
elif "powershell.exe" in name and self.api_scan(cmd[-1].split("'")[-2]):
|
||||
elif "cmd.exe" in name and self.api_scan(" ".join(cmd[2:])):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意腳本攔截: ")+name)
|
||||
elif self.api_scan(cmd[-1]) or self.scr_scan(cmd):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意軟體攔截: ")+name)
|
||||
elif ":/Program" in file and self.enh_protect:
|
||||
if self.sign_scan(file) and self.api_scan(file):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意軟體攔截: ")+name)
|
||||
elif self.api_scan(file) or self.pe_scan(file):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意軟體攔截: ")+name)
|
||||
else:
|
||||
self.p_name = name
|
||||
elif file != self.pyas and file not in self.whitelist:
|
||||
self.proc = p
|
||||
if self.api_scan(file) or self.pe_scan(file):
|
||||
p.kill()
|
||||
self.send_notify(self.trans("惡意軟體攔截: ")+name)
|
||||
gc.collect()
|
||||
except:
|
||||
pass
|
||||
except:
|
||||
pass
|
||||
|
||||
def protect_proc_kill(self,proc):
|
||||
try:
|
||||
for p in psutil.process_iter():
|
||||
if p.name() == proc:
|
||||
p.kill()
|
||||
return True
|
||||
return False
|
||||
except:
|
||||
return False
|
||||
|
||||
def protect_file_thread(self,path):
|
||||
hDir = win32file.CreateFile(path,win32con.GENERIC_READ,win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE|win32con.FILE_SHARE_DELETE,None,win32con.OPEN_EXISTING,win32con.FILE_FLAG_BACKUP_SEMANTICS,None)
|
||||
def protect_file_thread(self):
|
||||
hDir = win32file.CreateFile("C:/Users/",win32con.GENERIC_READ,win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE|win32con.FILE_SHARE_DELETE,None,win32con.OPEN_EXISTING,win32con.FILE_FLAG_BACKUP_SEMANTICS,None)
|
||||
self.ransom_block = False
|
||||
while self.file_protect:
|
||||
try:
|
||||
for action, file in win32file.ReadDirectoryChangesW(hDir,1024,True,win32con.FILE_NOTIFY_CHANGE_FILE_NAME|win32con.FILE_NOTIFY_CHANGE_DIR_NAME|win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES|win32con.FILE_NOTIFY_CHANGE_SIZE|win32con.FILE_NOTIFY_CHANGE_LAST_WRITE|win32con.FILE_NOTIFY_CHANGE_SECURITY,None,None):
|
||||
file = str(f"{path}{file}").replace("\\", "/")
|
||||
file_end = str(f".{file.split('.')[-1]}").lower()
|
||||
file_mid = str(f".{file.split('.')[-2]}").lower()
|
||||
if action == 1 or action == 3:
|
||||
if file_mid in alist and self.protect_proc_kill(self.p_name):
|
||||
self.send_notify(self.trans("勒索軟體攔截: ")+self.p_name)
|
||||
elif file_end in slist and self.api_scan(file):
|
||||
os.remove(file)
|
||||
self.send_notify(self.trans("惡意檔案刪除: ")+file)
|
||||
gc.collect()
|
||||
except:
|
||||
pass
|
||||
for action, file in win32file.ReadDirectoryChangesW(hDir,1024,True,win32con.FILE_NOTIFY_CHANGE_FILE_NAME|win32con.FILE_NOTIFY_CHANGE_DIR_NAME|win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES|win32con.FILE_NOTIFY_CHANGE_SIZE|win32con.FILE_NOTIFY_CHANGE_LAST_WRITE|win32con.FILE_NOTIFY_CHANGE_SECURITY,None,None):
|
||||
try:
|
||||
if action and "AppData" not in file:
|
||||
if action == 1 and str(f".{file.split('.')[-2]}").lower() in alist:
|
||||
self.proc.kill()
|
||||
self.send_notify(self.trans("勒索軟體攔截: ")+self.proc.name())
|
||||
elif action == 2 and str(f".{file.split('.')[-1]}").lower() in alist:
|
||||
if self.ransom_block:
|
||||
self.proc.kill()
|
||||
self.ransom_block = False
|
||||
self.send_notify(self.trans("勒索軟體攔截: ")+self.proc.name())
|
||||
else:
|
||||
self.ransom_block = True
|
||||
gc.collect()
|
||||
except:
|
||||
pass
|
||||
|
||||
def protect_boot_thread(self):
|
||||
while self.mbr_protect and self.mbr_value:
|
||||
try:
|
||||
time.sleep(0.2)
|
||||
with open(r"\\.\PhysicalDrive0", "r+b") as f:
|
||||
if f.read(512) != self.mbr_value:
|
||||
f.seek(0)
|
||||
f.write(self.mbr_value)
|
||||
if self.protect_proc_kill(self.p_name):
|
||||
self.send_notify(self.trans("惡意行為攔截: ")+self.p_name)
|
||||
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:
|
||||
self.proc.kill()
|
||||
self.send_notify(self.trans("惡意行為攔截: ")+self.proc.name())
|
||||
self.init_config_boot()
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -1263,8 +1229,8 @@ class MainWindow_Controller(QtWidgets.QMainWindow):
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
QtCore.QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
|
||||
QtGui.QGuiApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
||||
app = QtWidgets.QApplication(sys.argv)
|
||||
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
|
||||
QGuiApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
|
||||
app = QApplication(sys.argv)
|
||||
MainWindow_Controller()
|
||||
sys.exit(app.exec_())
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
slist = [".exe",".dll",".com",".msi",".scr",
|
||||
".bat",".cmd",".ps1",".vbs",".js"]
|
||||
|
||||
alist = [".exe",".dll",".ppt",".pptx",".wps",
|
||||
alist = [".ppt",".pptx",".wps",".txt",".rtf",
|
||||
".pdf",".xls",".xlsx",".doc",".docx",
|
||||
".jpg",".jpeg",".png",".webp",".gif",
|
||||
".mp3",".wav",".aac",".ogg",".flac",
|
||||
".mp4",".avi",".mov",".wmv",".mkv",
|
||||
".zip",".gz",".7z",".rar",".tar"]
|
||||
".zip",".7z",".rar",".exe",".dll"]
|
||||
+1
-1
@@ -1 +1 @@
|
||||
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
|
||||
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
|
||||
+52
-52
@@ -1,52 +1,52 @@
|
||||
translations = {"zh_TW": {"已开启":"已開啟","已关闭":"已關閉","On":"已開啟","Off":"已關閉"},
|
||||
"zh_CN": {"已開啟":"已开启","已關閉":"已关闭","On":"已开启","Off":"已关闭",
|
||||
"軟體":"软件","檔案":"文件","確定":"确认","設定":"设置","關於":"关于",
|
||||
"錯誤":"错误","實時":"实时","發現":"发现","關閉":"关闭","裝置":"设备",
|
||||
"總數":"总数","註冊":"注册","圖標":"图标","路徑":"路径","網路":"网络",
|
||||
"位元":"字节","彈窗":"弹窗","靈敏":"敏感","誤報":"误报","簽":"签",
|
||||
"項":"项","掃":"扫","試":"试","黃":"黄","嗎":"吗","防":"保","鑰":"钥",
|
||||
"當":"当","後":"后","護":"护","導":"导","區":"区","復":"复","攔":"拦",
|
||||
"請":"请","統":"统","刪":"删","進":"进","個":"个","選":"选","啟":"启",
|
||||
"監":"监","並":"并","徑":"径","盤":"盘","隱":"隐","動":"动","狀":"状",
|
||||
"誌":"志","這":"这","會":"会","題":"题","擇":"择","語":"语","無":"无",
|
||||
"顯":"显","變":"变","戶":"户","碼":"码","雲":"云","訂":"订","稱":"称",
|
||||
"類":"类","輸":"输","執":"执","數":"数","尋":"寻","網":"网","詢":"询",
|
||||
"製":"制","員":"员","許":"许","條":"条","藍":"蓝","紅":"红","綠":"绿",
|
||||
"態":"态","務":"务","連":"连","檢":"检","測":"测","關":"关","強":"强",
|
||||
"驅":"驱","為":"为","腳":"脚","增":"增","單":"单","開":"开"},
|
||||
"en_US": {"已開啟":"On","已關閉":"Off","已开启":"On","已关闭":"Off",",":", ",
|
||||
"立即刪除":"Delete Now","安全模式":"Safe Mode","官方網站":"Website",
|
||||
"惡意檔案":"Virus ","惡意軟體":"Malware ","勒索軟體":"Ransom ",
|
||||
"惡意腳本":"Script ","惡意行為":"Behavior ","可疑軟體":"Suspicious ",
|
||||
"許可條款":"License Terms","惡意":"Malicious","可疑":"Suspicious",
|
||||
"啟用":"Enable ","禁用":"Disable ","正在初始化中":"Initializing ",
|
||||
"正在掃描":"Scanning ","正在刪除":"Deleting ","最小化到":"Minimize To ",
|
||||
"確定要":"Sure Want To ","靈敏度":"Sensitivity ","更新":"Update",
|
||||
"白色主題":"White","黑色主題":"Black","黃色主題":"Yellow","紅色主題":"Red",
|
||||
"藍色主題":"Blue","綠色主題":"Green","語言":"Language ","製作":"Make",
|
||||
"測試人員":"Testers","版本資訊":"Information","無效簽名":"Unsign ",
|
||||
"註冊表":"Registry ","退出":"Quit ","檔案":"File ","當前":"Currently ",
|
||||
"狀態":"State ","掃描":"Scan ","工具":"Tools ","防護":"Protect ",
|
||||
"失敗":"Failed ","請":"Please ","路徑":"Path ","方式":"Method ",
|
||||
"需要":"Need ","病毒":"Virus ","選擇":"Select ","返回":"Back",
|
||||
"受到":"Been ","錯誤":"Error","完成":"Complete ","引擎":"Engine ",
|
||||
"托盤":"Tray ","圖標":"Icon ","不安全":"Unsafe","增強":"Enhanced ",
|
||||
"系統":"System ","雲端":"Cloud ","重啟":"Reboot ","修復":"Repair ",
|
||||
"裝置":"Device ","發現":"Found ","成功":"Success ","清理":"Cleanup ",
|
||||
"確定":"OK","執行":"Execute ","警告":"Warning ","使用":"Use ",
|
||||
"網路":"Network ","變更":"Change ","總數":"Total","結束":"End ",
|
||||
"選項":"Options ","監控":"Monitor ","連接":"Connect ","可以":"To ",
|
||||
"進程":"Process ","攔截":"Block ","引導":"Boot ","刪除":"Delete ",
|
||||
"分區":"Partition ","設定":"Settings","關於":"About","模式":"Mode ",
|
||||
"提高":"Improve ","安全":"Security ","顯色":"Color ","主題":"Themes ",
|
||||
"風險":"Risk ","介面":"GUI ","核心":"Core ","服務":"Services ",
|
||||
"管理":"Manage","所有":"All ","全盤":"Full ","取消":"Cancel ",
|
||||
"垃圾":"Junk ","位元":"byte ","本機":"Computer ","停止":"Stop ",
|
||||
"增加到":"Add File To ","白名單":"White List ","軟體":"Software ",
|
||||
"增加":"Add","移除":"Delete","項目":"Items ","生成":"Create ",
|
||||
"開啟":"Open ","您":"You ","此":"This ","並":"And ","未":"Not ",
|
||||
"高":"High ","新":"New ","和":"And ","可能會":"Possible ","會":"Can ",
|
||||
"日誌":"Log","已":"Has ","彈窗":"Window ","要":"To ","驅動":"Drive ",
|
||||
"的":"","顯示":"","個":"","嗎":"","中":"","了":"","行":"","稱":"",
|
||||
"密鑰":"Key ","檢測":"Detect ","誤報":"False Positive ","立即":"",
|
||||
" ":" "}}
|
||||
translate_dict = {"zh_TW": {"已开启":"已開啟","已关闭":"已關閉","On":"已開啟","Off":"已關閉"},
|
||||
"zh_CN": {"已開啟":"已开启","已關閉":"已关闭","On":"已开启","Off":"已关闭",
|
||||
"軟體":"软件","檔案":"文件","確定":"确认","設定":"设置","關於":"关于",
|
||||
"錯誤":"错误","實時":"实时","發現":"发现","關閉":"关闭","裝置":"设备",
|
||||
"總數":"总数","註冊":"注册","圖標":"图标","路徑":"路径","網路":"网络",
|
||||
"位元":"字节","彈窗":"弹窗","靈敏":"敏感","誤報":"误报","簽":"签",
|
||||
"項":"项","掃":"扫","試":"试","黃":"黄","嗎":"吗","防":"保","鑰":"钥",
|
||||
"當":"当","後":"后","護":"护","導":"导","區":"区","復":"复","攔":"拦",
|
||||
"請":"请","統":"统","刪":"删","進":"进","個":"个","選":"选","啟":"启",
|
||||
"監":"监","並":"并","徑":"径","盤":"盘","隱":"隐","動":"动","狀":"状",
|
||||
"誌":"志","這":"这","會":"会","題":"题","擇":"择","語":"语","無":"无",
|
||||
"顯":"显","變":"变","戶":"户","碼":"码","雲":"云","訂":"订","稱":"称",
|
||||
"類":"类","輸":"输","執":"执","數":"数","尋":"寻","網":"网","詢":"询",
|
||||
"製":"制","員":"员","許":"许","條":"条","藍":"蓝","紅":"红","綠":"绿",
|
||||
"態":"态","務":"务","連":"连","檢":"检","測":"测","關":"关","強":"强",
|
||||
"驅":"驱","為":"为","腳":"脚","增":"增","單":"单","開":"开","惡":"恶"},
|
||||
"en_US": {"已開啟":"On","已關閉":"Off","已开启":"On","已关闭":"Off",",":", ",
|
||||
"立即刪除":"Delete Now","安全模式":"Safe Mode","官方網站":"Website",
|
||||
"惡意檔案":"Virus ","惡意軟體":"Malware ","勒索軟體":"Ransom ",
|
||||
"惡意腳本":"Script ","惡意行為":"Behavior ","可疑軟體":"Suspicious ",
|
||||
"許可條款":"License Terms","惡意":"Malicious","可疑":"Suspicious",
|
||||
"啟用":"Enable ","禁用":"Disable ","正在初始化中":"Initializing ",
|
||||
"正在掃描":"Scanning ","正在刪除":"Deleting ","最小化到":"Minimize To ",
|
||||
"確定要":"Sure Want To ","靈敏度":"Sensitivity ","更新":"Update",
|
||||
"白色主題":"White","黑色主題":"Black","黃色主題":"Yellow","紅色主題":"Red",
|
||||
"藍色主題":"Blue","綠色主題":"Green","語言":"Language ","製作":"Make",
|
||||
"測試人員":"Testers","版本資訊":"Information","無效簽名":"Unsign ",
|
||||
"註冊表":"Registry ","退出":"Quit ","檔案":"File ","當前":"Currently ",
|
||||
"狀態":"State ","掃描":"Scan ","工具":"Tools ","防護":"Protect ",
|
||||
"失敗":"Failed ","請":"Please ","路徑":"Path ","方式":"Method ",
|
||||
"需要":"Need ","病毒":"Virus ","選擇":"Select ","返回":"Back",
|
||||
"受到":"Been ","錯誤":"Error","完成":"Complete ","引擎":"Engine ",
|
||||
"托盤":"Tray ","圖標":"Icon ","不安全":"Unsafe","增強":"Enhanced ",
|
||||
"系統":"System ","雲端":"Cloud ","重啟":"Reboot ","修復":"Repair ",
|
||||
"裝置":"Device ","發現":"Found ","成功":"Success ","清理":"Cleanup ",
|
||||
"確定":"OK","執行":"Execute ","警告":"Warning ","使用":"Use ",
|
||||
"網路":"Network ","變更":"Change ","總數":"Total","結束":"End ",
|
||||
"選項":"Options ","監控":"Monitor ","連接":"Connect ","可以":"To ",
|
||||
"進程":"Process ","攔截":"Block ","引導":"Boot ","刪除":"Delete ",
|
||||
"分區":"Partition ","設定":"Settings","關於":"About","模式":"Mode ",
|
||||
"提高":"Improve ","安全":"Security ","顯色":"Color ","主題":"Themes ",
|
||||
"風險":"Risk ","介面":"GUI ","核心":"Core ","服務":"Services ",
|
||||
"管理":"Manage","所有":"All ","全盤":"Full ","取消":"Cancel ",
|
||||
"垃圾":"Junk ","位元":"byte ","本機":"Computer ","停止":"Stop ",
|
||||
"增加到":"Add File To ","白名單":"White List ","軟體":"Software ",
|
||||
"增加":"Add","移除":"Delete","項目":"Items ","生成":"Create ",
|
||||
"開啟":"Open ","您":"You ","此":"This ","並":"And ","未":"Not ",
|
||||
"高":"High ","新":"New ","和":"And ","可能會":"Possible ","會":"Can ",
|
||||
"日誌":"Log","已":"Has ","彈窗":"Window ","要":"To ","驅動":"Drive ",
|
||||
"的":"","顯示":"","個":"","嗎":"","中":"","了":"","行":"","稱":"",
|
||||
"密鑰":"Key ","檢測":"Detect ","誤報":"False Positive ","立即":"",
|
||||
" ":" "}}
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
import pyinstaller_versionfile
|
||||
pyinstaller_versionfile.create_versionfile(
|
||||
output_file="versionfile.txt",
|
||||
version='2.8.2',
|
||||
version='2.8.4',
|
||||
company_name="PYAS Security",
|
||||
file_description="Python Antivirus Software",
|
||||
internal_name="PYAS",
|
||||
|
||||
Reference in new issue
Block a user