Compare commits

...
40 Commits
Author SHA1 Message Date
PYDT 7a6aba5a2a Add files via upload 2025-02-22 23:18:46 -08:00
PYDT ca0ec1f99d Add files via upload 2025-02-22 23:18:09 -08:00
PYDT 4e167486a1 Add files via upload 2025-02-16 14:51:54 -08:00
PYDT 503bbcd995 Add files via upload 2025-02-16 14:51:20 -08:00
PYDT b160d2f634 Add files via upload 2025-02-16 00:27:25 -08:00
PYDT 2e7628a837 Add files via upload 2025-02-15 03:40:02 -08:00
PYDT 1259948ed7 Update README_zh_TW.md 2025-02-15 15:49:09 +08:00
PYDT 81881ae1a4 Update README_zh_CN.md 2025-02-15 15:48:35 +08:00
PYDT 0b5c581aca Update README.md 2025-02-15 15:47:42 +08:00
PYDT eb3614ed0c Add files via upload 2025-02-14 09:01:50 -08:00
PYDT eb50513277 Add files via upload 2025-02-14 01:10:11 -08:00
PYDT c3af73b8cf Add files via upload 2025-02-13 08:41:54 -08:00
PYDT b552164a13 Add files via upload 2025-02-13 07:42:33 -08:00
PYDT b6dc9ecadb Add files via upload 2025-02-13 07:04:08 -08:00
PYDT 0723dc8dbb Add files via upload 2025-02-13 06:24:22 -08:00
PYDT 0b1fffb5bf Add files via upload 2025-02-13 06:03:33 -08:00
PYDT a39d87e5c5 Add files via upload 2025-02-13 05:52:51 -08:00
PYDT 0b0c3310cf Add files via upload 2025-02-13 05:36:46 -08:00
PYDT f75c3750a5 Add files via upload 2025-02-13 04:15:07 -08:00
PYDT 3da760721b Add files via upload 2025-02-13 03:15:23 -08:00
PYDT a9ad3feeec Add files via upload 2025-02-12 19:27:01 -08:00
PYDT 479c4ade67 Add files via upload 2025-02-12 18:32:50 -08:00
PYDT 84afa3e714 Add files via upload 2025-02-12 18:32:11 -08:00
PYDT 9a69665bab Add files via upload 2025-02-12 18:30:14 -08:00
PYDT fea34ee937 Add files via upload 2025-02-12 01:15:57 -08:00
PYDT ff2412c65d Add files via upload 2025-02-12 01:15:19 -08:00
PYDT 658953860a Add files via upload 2025-02-12 01:13:55 -08:00
PYDT b473783527 Add files via upload 2025-02-09 02:11:01 -08:00
PYDT 7e590d4925 Add files via upload 2025-02-08 17:37:01 -08:00
PYDT 232fd3e2f2 Add files via upload 2025-02-08 17:16:21 -08:00
PYDT 9ea25fb77c Add files via upload 2025-02-08 16:55:43 -08:00
PYDT 6c47136de3 Add files via upload 2025-02-08 16:33:55 -08:00
PYDT 6fae29b488 Add files via upload 2025-02-08 07:11:31 -08:00
PYDT 7ed8cc9380 Add files via upload 2025-02-06 23:38:20 -08:00
PYDT 142e9d1028 Add files via upload 2025-02-05 06:56:05 -08:00
PYDT c96c30ff9a Add files via upload 2025-02-04 19:22:57 -08:00
PYDT 337f1cc100 Add files via upload 2025-02-04 19:21:48 -08:00
PYDT c3cb89dbea Add files via upload 2025-02-02 08:53:39 -08:00
PYDT 445bd1f668 Add files via upload 2025-02-02 08:51:46 -08:00
PYDT 1bded908c1 Add files via upload 2025-01-13 13:28:19 +08:00
13 changed files with 19086 additions and 5557 deletions

No files matched your search

+2 -2
View File
@@ -5,7 +5,7 @@
"Detect": ["Pefile/General", "Script/General"],
"Pixels": [224, 224],
"Resize": [224, 224, 1, "nearest"],
"Values": 90
"Values": 95
}
Binary file not shown.
+19 -52
View File
@@ -772,31 +772,26 @@ rule General_28 {
author = "PYAS Security"
date = "2024-06-12"
strings:
$s1 = "GNU C11 6.3.0" ascii
$s2 = "GCC: (MinGW.org GCC-6.3.0-1) 6.3.0" fullword ascii
$s3 = "___mingw_readdir" fullword ascii
$s4 = "___mingw_closedir" fullword ascii
$s5 = "___mingw_seekdir" fullword ascii
$s6 = "%d is not a prime number." fullword ascii
$s7 = "___mingw_rewinddir" fullword ascii
$s8 = "__mingw32_init_mainargs" fullword ascii
$s9 = "___mingw_telldir" fullword ascii
$s10 = "Enter an integer: " fullword ascii
$s11 = "___mingw_opendir" fullword ascii
$s12 = "/home/keith/" ascii
$s13 = "../../../src/gcc-6.3.0/libgcc" ascii
$s14 = "___mingw_dirname" fullword ascii
$s15 = "_isPrime`" fullword ascii
$s16 = "%d is a prime number." fullword ascii
$s17 = ".weak.__Jv_RegisterClasses.___EH_FRAME_BEGIN__" fullword ascii
$s18 = "-mtune=generic" ascii
$s19 = "-march=i586" ascii
$s20 = "-g -g -g -O2 -O2 -O2" ascii
$s21 = "-fbuilding-libgcc" ascii
$s22 = "-fno-stack-protector" ascii
$x1 = "schemas.microsoft.com" wide
$x2 = "Client Worker Thread" ascii
$s1 = "A6BFEA43-501F-456F-A845-983D3AD7B8F0" wide
$s2 = "upgrader" wide
$s3 = "rtvscan.exe" wide
$s4 = "Enable-WindowsOptionalFeature -FeatureName" wide
$s5 = "remupd.exe" fullword wide
$s6 = "Mcshield.exe" fullword wide
$s7 = "mssecess.exe" fullword wide
$s8 = "RavMonD.exe" fullword wide
$s9 = "KvMonXP.exe" fullword wide
$s10 = "baiduSafeTray.exe" fullword wide
$s11 = "Qavanijeb.exe" fullword wide
$s12 = "%s --> Error: %d, EC: %d" fullword ascii
$s13 = "wscript.exe //E:vbscript" wide
$s14 = "upgrader_64" wide
$s15 = "Process Data Error" fullword wide
condition:
uint16(0) == 0x5a4d and filesize < 500KB and
8 of them
uint16(0) == 0x5a4d and filesize < 1000KB and
1 of ($x*) and 6 of them
}
rule General_29 {
@@ -1442,31 +1437,3 @@ rule General_52 {
uint16(0) == 0x5a4d and filesize < 2000KB and
8 of them
}
rule General_53 {
meta:
description = "53"
author = "PYAS Security"
date = "2024-06-12"
strings:
$x1 = "schemas.microsoft.com" wide
$x2 = "Client Worker Thread" ascii
$s1 = "A6BFEA43-501F-456F-A845-983D3AD7B8F0" wide
$s2 = "upgrader" wide
$s3 = "rtvscan.exe" wide
$s4 = "Enable-WindowsOptionalFeature -FeatureName" wide
$s5 = "remupd.exe" fullword wide
$s6 = "Mcshield.exe" fullword wide
$s7 = "mssecess.exe" fullword wide
$s8 = "RavMonD.exe" fullword wide
$s9 = "KvMonXP.exe" fullword wide
$s10 = "baiduSafeTray.exe" fullword wide
$s11 = "Qavanijeb.exe" fullword wide
$s12 = "%s --> Error: %d, EC: %d" fullword ascii
$s13 = "wscript.exe //E:vbscript" wide
$s14 = "upgrader_64" wide
$s15 = "Process Data Error" fullword wide
condition:
uint16(0) == 0x5a4d and filesize < 1000KB and
1 of ($x*) and 6 of them
}
File diff suppressed because it is too large. Load diff
+314 -188
View File
@@ -1,6 +1,6 @@
import os, gc, sys, time, json
import ctypes, ctypes.wintypes
import msvcrt, pyperclip
import requests, msvcrt, pyperclip
from PYAS_Engine import YRScan, DLScan
from PYAS_Suffixes import file_types
from PYAS_Language import translate_dict
@@ -49,12 +49,15 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
super(MainWindow_Controller, self).__init__()
self.setAttribute(Qt.WA_TranslucentBackground)
self.setWindowFlags(Qt.FramelessWindowHint)
self.init_config_pyas() # 初始化程式
def init_config_pyas(self):
self.init_config_vars() # 初始化變數
self.init_config_path() # 初始化路徑
self.init_config_read() # 初始化配置
self.init_config_wdll() # 初始化系統
self.init_config_boot() # 初始化引導
self.init_config_proc() # 初始化進程
self.init_config_list() # 初始化列表
self.init_config_data() # 初始化引擎
self.init_config_icon() # 初始化圖標
self.init_config_qtui() # 初始化介面
@@ -67,31 +70,36 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
def init_config_vars(self): # 初始化變數
self.pyae_version = "AI Engine"
self.pyas_version = "3.2.7"
self.pyas_version = "3.3.0"
self.mbr_value = None
self.track_proc = None
self.first_startup = 1
self.pyas_opacity = 0
self.gc_collect = 0
self.block_window = 0
self.total_scan = 0
self.scan_time = 0
self.virus_lock = {}
self.virus_list = []
self.virus_list_ui = []
self.Process_quantity = 0
self.Process_list_all_pid = []
self.config_json = {
self.default_json = {
"language_ui": "en_US", # "en_US", "zh_TW", "zh_CN"
"theme_color": "White", # "Solid color" or "Theme path"
"theme_color": "White", # "Solid color" or "./Theme/Path"
"product_key": "None", # "None" or "XXXXX-X..."
"service_url": "None", # "None" or "http://..."
"proc_protect": 1, # "0" (Close), "1" (Open)
"file_protect": 1, # "0" (Close), "1" (Open)
"sys_protect": 1, # "0" (Close), "1" (Open)
"net_protect": 1, # "0" (Close), "1" (Open)
"cus_protect": 0, # "0" (Close), "1" (Open)
"sensitivity": 0, # "0" (Medium), "1" (High)
"extend_mode": 0, # "0" (False), "1" (True)
"white_lists": [],
"block_lists": []}
self.pass_windows = [
{'': ''}, {'PYAS': 'Qt5152QWindowIcon'},
{'': 'Shell_TrayWnd'}, {'': 'WorkerW'}]
def init_config_path(self): # 初始化路徑
try:
@@ -105,8 +113,27 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
except Exception as e:
print(e)
def reset_options(self): # 重置所有設定
if self.question_event("您確定要重置所有設定嗎?"):
self.clean_function()
self.config_json = self.default_json
self.init_config_write(self.config_json)
self.init_config_pyas()
def clean_function(self): # 清理運行函數
self.first_startup = 1
self.block_window = 0
self.config_json["proc_protect"] = 0
self.config_json["file_protect"] = 0
self.config_json["sys_protect"] = 0
self.config_json["net_protect"] = 0
self.virus_scan_break()
self.protect_drv_init()
self.gc_collect = 0
def init_config_read(self): # 初始化配置
try:
self.config_json = {}
if not os.path.exists(self.path_conf):
os.makedirs(self.path_conf)
if not os.path.exists(self.file_conf):
@@ -155,9 +182,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
except Exception as e:
print(e)
def init_config_proc(self): # 初始化引導
def init_config_list(self): # 初始化列表
try:
self.exist_process = self.get_process_list()
self.exist_connections = self.get_connections_list()
except Exception as e:
print(e)
@@ -168,6 +196,9 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
for file in files:
file_path = os.path.join(root, file)
self.model.load_model(file_path)
except Exception as e:
print(e)
try:
self.rules = YRScan()
for root, dirs, files in os.walk(self.path_rules):
for file in files:
@@ -218,7 +249,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.About_widget.hide()
self.ui.State_output.style().polish(self.ui.State_output.verticalScrollBar())
self.ui.Virus_Scan_output.style().polish(self.ui.Virus_Scan_output.verticalScrollBar())
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.ui.License_terms.setText('''MIT License\n\nPermission 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.''')
def init_config_conn(self): # 初始化交互
self.ui.Close_Button.clicked.connect(self.close)
@@ -228,6 +259,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Tools_Button.clicked.connect(self.change_tools_widget)
self.ui.Virus_Scan_Button.clicked.connect(self.change_scan_widget)
self.ui.Protection_Button.clicked.connect(self.change_protect_widget)
self.ui.Setting_Button.clicked.connect(self.change_setting_widget)
self.ui.Virus_Scan_output.setContextMenuPolicy(Qt.CustomContextMenu)
self.ui.Virus_Scan_output.customContextMenuRequested.connect(self.Virus_Scan_output_menu)
self.ui.Virus_Scan_Solve_Button.clicked.connect(self.virus_solve)
@@ -237,23 +269,25 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Path_Scan_Button.clicked.connect(self.path_scan)
self.ui.Disk_Scan_Button.clicked.connect(self.disk_scan)
self.ui.System_Process_Manage_Button.clicked.connect(lambda:self.change_tools(self.ui.Process_widget))
self.ui.Process_Tools_Back.clicked.connect(lambda:self.back_to_tools(self.ui.Process_widget))
self.ui.Repair_System_Files_Button.clicked.connect(self.repair_system)
self.ui.Clean_System_Files_Button.clicked.connect(self.clean_system)
self.ui.Window_Block_Button.clicked.connect(self.get_software_window)
self.ui.Window_Block_Button.clicked.connect(self.add_software_window)
self.ui.Window_Block_Button_2.clicked.connect(self.remove_software_window)
self.ui.Repair_System_Network_Button.clicked.connect(self.repair_network)
self.ui.Reset_Options_Button.clicked.connect(self.reset_options)
self.ui.Process_list.setContextMenuPolicy(Qt.CustomContextMenu)
self.ui.Process_list.customContextMenuRequested.connect(self.process_list_menu)
self.ui.About_Back.clicked.connect(self.ui.About_widget.hide)
self.ui.Setting_Back.clicked.connect(self.setting_back)
self.ui.Protection_switch_Button.clicked.connect(self.protect_proc_init)
self.ui.Protection_switch_Button_2.clicked.connect(self.protect_file_init)
self.ui.Protection_switch_Button_3.clicked.connect(self.protect_sys_init)
self.ui.Protection_switch_Button_4.clicked.connect(self.protect_drv_init)
self.ui.Protection_switch_Button_5.clicked.connect(self.protect_net_init)
self.ui.Protection_switch_Button_8.clicked.connect(self.protect_cus_init)
self.ui.high_sensitivity_switch_Button.clicked.connect(self.change_sensitive)
self.ui.extension_kit_switch_Button.clicked.connect(self.extension_kit)
self.ui.cloud_services_switch_Button.clicked.connect(self.cloud_services)
self.ui.Add_White_list_Button.clicked.connect(self.add_white_list)
self.ui.Add_White_list_Button_3.clicked.connect(self.remove_white_list)
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)
@@ -298,20 +332,14 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.State_title.setText(self.trans("此裝置已受到防護"))
self.ui.Window_title.setText(self.trans(f"PYAS Security"))
self.ui.PYAS_CopyRight.setText(self.trans(f"Copyright© 2020-{max(int(time.strftime('%Y')), 2020)} PYAS Security"))
self.ui.State_Button.setText(self.trans(" 狀態"))
self.ui.Virus_Scan_Button.setText(self.trans(" 掃描"))
self.ui.Tools_Button.setText(self.trans(" 工具"))
self.ui.Protection_Button.setText(self.trans(" 防護"))
self.ui.Virus_Scan_title.setText(self.trans("病毒掃描"))
self.ui.Virus_Scan_text.setText(self.trans("請選擇掃描方式"))
self.ui.Virus_Scan_choose_Button.setText(self.trans("病毒掃描"))
self.ui.Virus_Scan_choose_Button.setStyleSheet(self.theme["button_on"])
self.ui.File_Scan_Button.setText(self.trans("檔案掃描"))
self.ui.Path_Scan_Button.setText(self.trans("路徑掃描"))
self.ui.Disk_Scan_Button.setText(self.trans("全盤掃描"))
self.ui.Virus_Scan_Solve_Button.setText(self.trans("立即刪除"))
self.ui.Virus_Scan_Break_Button.setText(self.trans("停止掃描"))
self.ui.Process_Tools_Back.setText(self.trans("返回"))
self.ui.Process_Total_title.setText(self.trans("進程總數:"))
self.ui.Protection_title.setText(self.trans("進程防護"))
self.ui.Protection_illustrate.setText(self.trans("啟用此選項可以攔截進程病毒"))
@@ -328,19 +356,29 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Protection_title_5.setText(self.trans("網路防護"))
self.ui.Protection_illustrate_5.setText(self.trans("啟用此選項可以監控網路通訊"))
self.ui.Protection_switch_Button_5.setText(self.trans(self.ui.Protection_switch_Button_5.text()))
self.ui.Protection_title_8.setText(self.trans("自訂防護"))
self.ui.Protection_illustrate_8.setText(self.trans("啟用此選項可以選擇自訂防護"))
self.ui.Protection_switch_Button_8.setText(self.trans(self.ui.Protection_switch_Button_8.text()))
self.ui.State_log.setText(self.trans("日誌:"))
self.ui.More_Tools_Back_Button.setText(self.trans("工具>"))
self.ui.System_Process_Manage_Button.setText(self.trans("系統進程管理"))
self.ui.System_Process_Manage_Button.setStyleSheet(self.theme["button_off"])
self.ui.Repair_System_Files_Button.setText(self.trans("系統檔案修復"))
self.ui.Repair_System_Files_Button.setStyleSheet(self.theme["button_off"])
self.ui.Clean_System_Files_Button.setText(self.trans("系統垃圾清理"))
self.ui.Clean_System_Files_Button.setStyleSheet(self.theme["button_off"])
self.ui.Window_Block_Button.setText(self.trans("軟體彈窗攔截"))
self.ui.Window_Block_Button.setStyleSheet(self.theme["button_off"])
self.ui.Repair_System_Network_Button.setText(self.trans("系統網路修復"))
self.ui.Repair_System_Network_Button.setStyleSheet(self.theme["button_off"])
self.ui.About_Back.setText(self.trans("返回"))
self.ui.System_Process_Manage_title.setText(self.trans("進程管理"))
self.ui.System_Process_Manage_illustrate.setText(self.trans("此選項可以實時查看系統進程"))
self.ui.System_Process_Manage_Button.setText(self.trans("選擇"))
self.ui.Clean_System_Files_title.setText(self.trans("垃圾清理"))
self.ui.Clean_System_Files_illustrate.setText(self.trans("此選項可以清理暫存檔案"))
self.ui.Clean_System_Files_Button.setText(self.trans("選擇"))
self.ui.Repair_System_Files_title.setText(self.trans("系統修復"))
self.ui.Repair_System_Files_illustrate.setText(self.trans("此選項可以修復系統註冊表"))
self.ui.Repair_System_Files_Button.setText(self.trans("選擇"))
self.ui.Repair_System_Network_title.setText(self.trans("網路修復"))
self.ui.Repair_System_Network_illustrate.setText(self.trans("此選項可以重置系統網路連接"))
self.ui.Repair_System_Network_Button.setText(self.trans("選擇"))
self.ui.Reset_Options_title.setText(self.trans("重置選項"))
self.ui.Reset_Options_illustrate.setText(self.trans("此選項可以重置所有設定選項"))
self.ui.Reset_Options_Button.setText(self.trans("選擇"))
self.ui.Window_Block_title.setText(self.trans("彈窗攔截"))
self.ui.Window_Block_illustrate.setText(self.trans("此選項可以選擇指定窗口並攔截"))
self.ui.Window_Block_Button.setText(self.trans("增加"))
self.ui.Window_Block_Button_2.setText(self.trans("移除"))
self.ui.PYAS_Version.setText(self.trans(f"PYAS Security V{self.pyas_version} ({self.pyae_version})"))
self.ui.GUI_Made_title.setText(self.trans("介面製作:"))
self.ui.GUI_Made_Name.setText(self.trans("mtkiao"))
@@ -356,23 +394,24 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.extension_kit_title.setText(self.trans("擴展掃描引擎"))
self.ui.extension_kit_illustrate.setText(self.trans("啟用此選項可以使用第三方擴展套件"))
self.ui.extension_kit_switch_Button.setText(self.trans(self.ui.extension_kit_switch_Button.text()))
self.ui.cloud_services_title.setText(self.trans("雲端掃描服務"))
self.ui.cloud_services_illustrate.setText(self.trans("啟用此選項可以連接雲端掃描服務"))
self.ui.cloud_services_switch_Button.setText(self.trans(self.ui.cloud_services_switch_Button.text()))
self.ui.Add_White_list_title.setText(self.trans("增加到白名單"))
self.ui.Add_White_list_illustrate.setText(self.trans("此選項可以選擇檔案並增加到白名單"))
self.ui.Add_White_list_Button.setText(self.trans(self.ui.Add_White_list_Button.text()))
self.ui.Add_White_list_Button.setText(self.trans("選擇"))
self.ui.Add_White_list_Button.setText(self.trans("增加"))
self.ui.Add_White_list_Button_3.setText(self.trans("移除"))
self.ui.Theme_title.setText(self.trans("顯色主題"))
self.ui.Theme_illustrate.setText(self.trans("請選擇主題"))
self.ui.Theme_Customize.setText(self.trans("自定主題"))
self.ui.Theme_Customize.setText(self.trans("自訂主題"))
self.ui.Theme_White.setText(self.trans("白色主題"))
self.ui.Theme_Yellow.setText(self.trans("黃色主題"))
self.ui.Theme_Red.setText(self.trans("紅色主題"))
self.ui.Theme_Green.setText(self.trans("綠色主題"))
self.ui.Theme_Blue.setText(self.trans("藍色主題"))
self.ui.Setting_Back.setText(self.trans("返回"))
self.ui.Language_title.setText(self.trans("顯示語言"))
self.ui.Language_illustrate.setText(self.trans("請選擇語言"))
self.ui.License_terms_title.setText(self.trans("許可條款:"))
self.ui.Virus_Scan_choose_widget.setStyleSheet(self.theme["button_off"])
def init_config_color(self):
self.config_theme = {
@@ -473,7 +512,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.State_icon.setPixmap(QPixmap(self.theme["icon"]))
else:
if not os.path.exists(os.path.join(self.config_json["theme_color"], "Color.json")):
path = str(QFileDialog.getExistingDirectory(self, self.trans("自定主題"), ""))
path = str(QFileDialog.getExistingDirectory(self, self.trans("自訂主題"), ""))
if path and os.path.exists(os.path.join(path, "Color.json")):
self.config_json["theme_color"] = path
with open(os.path.join(self.config_json["theme_color"], "Color.json"), "r") as f:
@@ -492,10 +531,13 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.widget_2.setStyleSheet(self.theme["widget_style"])
self.ui.Virus_Scan_choose_Button.setStyleSheet(self.theme["button_on"])
self.ui.Add_White_list_Button.setStyleSheet(self.theme["button_off"])
self.ui.Add_White_list_Button_3.setStyleSheet(self.theme["button_off"])
self.ui.System_Process_Manage_Button.setStyleSheet(self.theme["button_off"])
self.ui.Repair_System_Files_Button.setStyleSheet(self.theme["button_off"])
self.ui.Clean_System_Files_Button.setStyleSheet(self.theme["button_off"])
self.ui.Reset_Options_Button.setStyleSheet(self.theme["button_off"])
self.ui.Window_Block_Button.setStyleSheet(self.theme["button_off"])
self.ui.Window_Block_Button_2.setStyleSheet(self.theme["button_off"])
self.ui.Repair_System_Network_Button.setStyleSheet(self.theme["button_off"])
if self.ui.Protection_switch_Button.text() == self.trans("已開啟"):
self.ui.Protection_switch_Button.setStyleSheet(self.theme["button_on"])
@@ -517,6 +559,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Protection_switch_Button_5.setStyleSheet(self.theme["button_on"])
else:
self.ui.Protection_switch_Button_5.setStyleSheet(self.theme["button_off"])
if self.ui.Protection_switch_Button_8.text() == self.trans("已開啟"):
self.ui.Protection_switch_Button_8.setStyleSheet(self.theme["button_on"])
else:
self.ui.Protection_switch_Button_8.setStyleSheet(self.theme["button_off"])
if self.ui.high_sensitivity_switch_Button.text() == self.trans("已開啟"):
self.ui.high_sensitivity_switch_Button.setStyleSheet(self.theme["button_on"])
else:
@@ -525,6 +571,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.extension_kit_switch_Button.setStyleSheet(self.theme["button_on"])
else:
self.ui.extension_kit_switch_Button.setStyleSheet(self.theme["button_off"])
if self.ui.cloud_services_switch_Button.text() == self.trans("已開啟"):
self.ui.cloud_services_switch_Button.setStyleSheet(self.theme["button_on"])
else:
self.ui.cloud_services_switch_Button.setStyleSheet(self.theme["button_off"])
except Exception as e:
print(e)
self.config_json["theme_color"] = "White"
@@ -552,6 +602,8 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.protect_sys_init()
if self.config_json["net_protect"] == 1:
self.protect_net_init()
#if self.config_json["cus_protect"] == 1:
#self.protect_cus_init()
if self.config_json["sensitivity"] == 1:
self.change_sensitive()
if self.config_json["extend_mode"] == 1:
@@ -573,6 +625,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
Thread(target=self.protect_proc_thread, daemon=True).start()
self.ui.Protection_switch_Button.setText(self.trans("已開啟"))
self.ui.Protection_switch_Button.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
except Exception as e:
print(e)
@@ -587,6 +640,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
Thread(target=self.protect_file_thread, daemon=True).start()
self.ui.Protection_switch_Button_2.setText(self.trans("已開啟"))
self.ui.Protection_switch_Button_2.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
except Exception as e:
print(e)
@@ -602,6 +656,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
Thread(target=self.protect_reg_thread, daemon=True).start()
self.ui.Protection_switch_Button_3.setText(self.trans("已開啟"))
self.ui.Protection_switch_Button_3.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
except Exception as e:
print(e)
@@ -646,9 +701,22 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
Thread(target=self.protect_net_thread, daemon=True).start()
self.ui.Protection_switch_Button_5.setText(self.trans("已開啟"))
self.ui.Protection_switch_Button_5.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
except Exception as e:
print(e)
def protect_cus_init(self): # 初始化自訂防護
self.info_event("此功能不支持使用")
#if self.ui.Protection_switch_Button_8.text() == self.trans("已開啟"):
#self.ui.Protection_switch_Button_8.setText(self.trans("已關閉"))
#self.ui.Protection_switch_Button_8.setStyleSheet(self.theme["button_off"])
#self.config_json["cus_protect"] = 0
#else:
#self.config_json["cus_protect"] = 1
#self.ui.Protection_switch_Button_8.setText(self.trans("已開啟"))
#self.ui.Protection_switch_Button_8.setStyleSheet(self.theme["button_on"])
#self.init_config_write(self.config_json)
def change_sensitive(self): # 初始化靈敏度
if self.ui.high_sensitivity_switch_Button.text() == self.trans("已開啟"):
self.ui.high_sensitivity_switch_Button.setText(self.trans("已關閉"))
@@ -658,6 +726,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.config_json["sensitivity"] = 1
self.ui.high_sensitivity_switch_Button.setText(self.trans("已開啟"))
self.ui.high_sensitivity_switch_Button.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
def extension_kit(self): # 初始化擴展引擎
if self.ui.extension_kit_switch_Button.text() == self.trans("已開啟"):
@@ -668,6 +737,19 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.config_json["extend_mode"] = 1
self.ui.extension_kit_switch_Button.setText(self.trans("已開啟"))
self.ui.extension_kit_switch_Button.setStyleSheet(self.theme["button_on"])
self.init_config_write(self.config_json)
def cloud_services(self): # 初始化雲端掃描
self.info_event("此功能不支持使用")
#if self.ui.cloud_services_switch_Button.text() == self.trans("已開啟"):
#self.ui.cloud_services_switch_Button.setText(self.trans("已關閉"))
#self.ui.cloud_services_switch_Button.setStyleSheet(self.theme["button_off"])
#self.config_json["service_url"] = 0
#else:
#self.config_json["service_url"] = 1
#self.ui.cloud_services_switch_Button.setText(self.trans("已開啟"))
#self.ui.cloud_services_switch_Button.setStyleSheet(self.theme["button_on"])
#self.init_config_write(self.config_json)
def gc_collect_init(self): # 初始化程式回收
try:
@@ -694,53 +776,96 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
def add_white_list(self): # 添加白名單
try:
file = str(QFileDialog.getExistingDirectory(self,self.trans("增加到白名單"),"")).replace("\\", "/")
if file and file not in self.config_json["white_lists"]:
if self.question_event("您確定要增加到白名單嗎?"):
if file and self.question_event("您確定要增加到白名單嗎?"):
if file not in self.config_json["white_lists"]:
self.config_json["white_lists"].append(file)
self.info_event(f"成功增加到白名單: "+file)
elif file and self.question_event("您確定要取消增加到白名單嗎?"):
self.config_json["white_lists"].remove(file)
self.info_event(f"成功取消增加到白名單: "+file)
self.init_config_write(self.config_json)
self.info_event(f"成功增加到白名單: "+file)
self.init_config_write(self.config_json)
except Exception as e:
print(e)
def get_software_window(self): # 添加彈窗攔截
def remove_white_list(self):
try:
file = str(QFileDialog.getExistingDirectory(self,self.trans("移除白名單"),"")).replace("\\", "/")
if file and self.question_event("您確定要移除白名單嗎?"):
if file in self.config_json["white_lists"]:
self.config_json["white_lists"].remove(file)
self.info_event(f"成功移除白名單: "+file)
self.init_config_write(self.config_json)
except Exception as e:
print(e)
def add_software_window(self): # 添加彈窗攔截
try:
self.block_window = 0
if self.question_event("請選擇要攔截的軟體彈窗"):
while not self.block_window:
while True:
QApplication.processEvents()
window_name = self.get_foreground_window_title()
if window_name not in ["","PYAS",self.trans("警告")]:
if window_name not in self.config_json["block_lists"]:
if self.question_event(f"您確定要攔截 {window_name} 嗎?"):
self.config_json["block_lists"].append(window_name)
self.info_event(f"成功增加到彈窗攔截: "+window_name)
elif self.question_event(f"您確定要取消攔截 {window_name} 嗎?"):
self.config_json["block_lists"].remove(window_name)
self.info_event(f"成功取消彈窗攔截: "+window_name)
self.block_window = 1
hWnd = self.user32.GetForegroundWindow()
window_info = self.get_window_info(hWnd)
if window_info not in self.pass_windows:
if self.question_event(f"您確定要攔截 {window_info} 嗎?"):
if window_info not in self.config_json["block_lists"]:
self.config_json["block_lists"].append(window_info)
self.info_event(f"成功增加到彈窗攔截: {window_info}")
break
self.init_config_write(self.config_json)
self.block_window_init()
except Exception as e:
print(e)
def get_foreground_window_title(self): # 取得窗口標題
hWnd = self.user32.GetForegroundWindow()
def remove_software_window(self):
try:
self.block_window = 0
if self.question_event("請選擇要取消攔截的軟體彈窗"):
while True:
QApplication.processEvents()
hWnd = self.user32.GetForegroundWindow()
window_info = self.get_window_info(hWnd)
if window_info not in self.pass_windows:
if self.question_event(f"您確定要取消攔截 {window_info} 嗎?"):
if window_info in self.config_json["block_lists"]:
self.config_json["block_lists"].remove(window_info)
self.info_event(f"成功取消彈窗攔截: {window_info}")
break
self.init_config_write(self.config_json)
self.block_window_init()
except Exception as e:
print(e)
def get_window_info(self, hWnd): # 取得窗口資訊
length = self.user32.GetWindowTextLengthW(hWnd)
title = ctypes.create_unicode_buffer(length + 1)
self.user32.GetWindowTextW(hWnd, title, length + 1)
return str(title.value)
window_title = str(title.value)
class_name = ctypes.create_unicode_buffer(256)
self.user32.GetClassNameW(hWnd, class_name, 256)
class_name = str(class_name.value)
return {window_title: class_name}
def block_software_window(self): # 彈窗攔截線程
def enum_windows_callback(self, hWnd, lParam):
self.hwnd_list.append(hWnd)
return True
def get_all_windows(self):
self.hwnd_list = []
WNDENUMPROC = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.c_int, ctypes.c_int)
self.user32.EnumWindows(WNDENUMPROC(self.enum_windows_callback), 0)
return self.hwnd_list
def block_software_window(self): # 彈窗攔截線程
while self.block_window:
try:
time.sleep(0.2)
for window_name in self.config_json["block_lists"]:
hWnd = self.user32.FindWindowW(None, ctypes.create_unicode_buffer(window_name))
if hWnd != 0:
self.user32.PostMessageW(hWnd, 274, 61536, 0)
if not self.config_json["block_lists"]:
continue
for hWnd in self.get_all_windows():
window_info = self.get_window_info(hWnd)
if window_info in self.config_json["block_lists"]:
self.user32.SendMessageW(hWnd, 0x0010, 0xF060, 0) # WM_CLOSE, SC_CLOSE
self.user32.SendMessageW(hWnd, 0x0002, 0xF060, 0) # WM_DESTROY, SC_CLOSE
self.user32.SendMessageW(hWnd, 0x0012, 0xF060, 0) # WM_QUIT, SC_CLOSE
self.user32.SendMessageW(hWnd, 0x0112, 0xF060, 0) # WM_SYSCOMMAND, SC_CLOSE
except Exception as e:
print(e)
@@ -774,45 +899,41 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.init_config_hide()
#self.send_notify(self.trans("PYAS 已最小化到系統托盤圖標"))
def nativeEvent(self, eventType, message):
msg = ctypes.wintypes.MSG.from_address(int(message))
if msg.message in [0x0010, 0x0002, 0x0012, 0x0112, 0x0212]:
return True, 0
return super(MainWindow_Controller, self).nativeEvent(eventType, message)
def closeEvent(self, event): # 退出程序
if self.question_event("您確定要退出 PYAS 和所有防護嗎?"):
self.init_config_write(self.config_json)
self.first_startup = 1
self.config_json["proc_protect"] = 0
self.config_json["file_protect"] = 0
self.config_json["sys_protect"] = 0
self.config_json["net_protect"] = 0
self.virus_scan_break()
self.protect_drv_init()
self.gc_collect = 0
self.clean_function()
event.accept()
else:
event.ignore()
def show_menu(self): # 功能選單
self.WindowMenu = QMenu()
Main_Settings = QAction(self.trans("設定"),self)
#self.WindowMenu = QMenu()
#Main_Settings = QAction(self.trans("設定"),self)
#Main_Update = QAction(self.trans("更新"),self)
Main_About = QAction(self.trans("關於"),self)
self.WindowMenu.addAction(Main_Settings)
#Main_About = QAction(self.trans("關於"),self)
#self.WindowMenu.addAction(Main_Settings)
#self.WindowMenu.addAction(Main_Update)
self.WindowMenu.addAction(Main_About)
Qusetion = self.WindowMenu.exec_(self.ui.Menu_Button.mapToGlobal(QPoint(0, 30)))
if Qusetion == Main_About and self.ui.About_widget.isHidden():
#self.WindowMenu.addAction(Main_About)
#Qusetion = self.WindowMenu.exec_(self.ui.Menu_Button.mapToGlobal(QPoint(0, 30)))
#if Qusetion == Main_About and self.ui.About_widget.isHidden():
if self.ui.About_widget.isHidden():
self.ui.State_widget.hide()
self.ui.Virus_Scan_widget.hide()
self.ui.Tools_widget.hide()
self.ui.Protection_widget.hide()
self.ui.Process_widget.hide()
self.ui.About_widget.show()
self.ui.About_widget.raise_()
self.ui.Navigation_Bar.raise_()
self.ui.Window_widget.raise_()
self.ui.Setting_widget.hide()
self.Process_Timer.stop()
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)
self.change_animation_5(self.ui.About_widget,80,50,761,481)
#if Qusetion == Main_Update:
#self.update_database()
@@ -825,34 +946,15 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
print(e)
def change_animation(self,widget): # 畫面動畫
x, y = 170, widget.pos().y()
x, y = 80, widget.pos().y()
self.anim = QPropertyAnimation(widget, b"geometry")
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))
self.anim.setKeyValueAt(1, QRect(x,y,671,481))
widget.setGeometry(QRect(x - 60,y, 761, 481))
self.anim.setKeyValueAt(0.2, QRect(x - 30,y,761,481))
self.anim.setKeyValueAt(0.3, QRect(x - 10,y,761,481))
self.anim.setKeyValueAt(0.4, QRect(x - 5,y,761,481))
self.anim.setKeyValueAt(1, QRect(x,y,761,481))
self.anim.start()
def change_animation_2(self,nx,ny):
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))
self.anim2.setKeyValueAt(0.5, QRect(nx,ny + 12, 5, 34))
self.anim2.setKeyValueAt(0.7, QRect(nx,ny + 6, 5, 33))
self.anim2.setKeyValueAt(0.8, QRect(nx,ny + 4, 5, 32))
self.anim2.setKeyValueAt(0.9, QRect(nx,ny + 2, 5, 31))
self.anim2.setKeyValueAt(1, QRect(nx,ny, 5, 30))
else:
self.anim2.setKeyValueAt(0.4, QRect(nx,ny - 25, 5, 35))
self.anim2.setKeyValueAt(0.5, QRect(nx,ny - 12, 5, 34))
self.anim2.setKeyValueAt(0.7, QRect(nx,ny - 6, 5, 33))
self.anim2.setKeyValueAt(0.8, QRect(nx,ny - 4, 5, 32))
self.anim2.setKeyValueAt(0.9, QRect(nx,ny - 2, 5, 31))
self.anim2.setKeyValueAt(1, QRect(nx,ny, 5, 30))
self.anim2.start()
def change_animation_3(self,widget,time):
self.opacity = QGraphicsOpacityEffect()
self.opacity.setOpacity(0)
@@ -874,22 +976,34 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
x, y = widget.pos().x(), widget.pos().y()
self.anim4 = QPropertyAnimation(widget, b"geometry")
self.anim4.setDuration(time)
self.anim4.setStartValue(QRect(x, y, 131, ny))
self.anim4.setEndValue(QRect(x, y, 131, ny2))
self.anim4.setStartValue(QRect(x, y, 111, ny))
self.anim4.setEndValue(QRect(x, y, 111, ny2))
self.anim4.start()
def change_animation_5(self,widget,x,y,nx,ny): # 設置動畫
self.anim = QPropertyAnimation(widget, b"geometry")
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(0.3, QRect(x,y - 10,nx,ny))
self.anim.setKeyValueAt(0.4, QRect(x,y - 5,nx,ny))
self.anim.setKeyValueAt(1, QRect(x,y,nx,ny))
self.anim.start()
def change_setting_widget(self): # 狀態動畫
if self.ui.Setting_widget.isHidden():
self.change_animation_3(self.ui.Setting_widget,0.5)
self.change_animation(self.ui.Setting_widget)
self.ui.State_widget.hide()
self.ui.Virus_Scan_widget.hide()
self.ui.Tools_widget.hide()
self.ui.Protection_widget.hide()
self.ui.Process_widget.hide()
self.ui.About_widget.hide()
self.ui.Setting_widget.show()
self.Process_Timer.stop()
def change_state_widget(self): # 狀態動畫
if self.ui.State_widget.isHidden():
self.change_animation_2(20,50)
self.change_animation_3(self.ui.State_widget,0.5)
self.change_animation(self.ui.State_widget)
self.ui.State_widget.show()
@@ -899,10 +1013,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Process_widget.hide()
self.ui.About_widget.hide()
self.ui.Setting_widget.hide()
self.Process_Timer.stop()
def change_scan_widget(self): # 掃描動畫
if self.ui.Virus_Scan_widget.isHidden():
self.change_animation_2(20,168)
self.change_animation_3(self.ui.Virus_Scan_widget,0.5)
self.change_animation(self.ui.Virus_Scan_widget)
self.ui.State_widget.hide()
@@ -912,10 +1026,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Process_widget.hide()
self.ui.About_widget.hide()
self.ui.Setting_widget.hide()
self.Process_Timer.stop()
def change_tools_widget(self): # 工具動畫
if self.ui.Tools_widget.isHidden():
self.change_animation_2(20,285)
self.change_animation_3(self.ui.Tools_widget,0.5)
self.change_animation(self.ui.Tools_widget)
self.ui.State_widget.hide()
@@ -925,10 +1039,10 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Process_widget.hide()
self.ui.About_widget.hide()
self.ui.Setting_widget.hide()
self.Process_Timer.stop()
def change_protect_widget(self): # 防護動畫
if self.ui.Protection_widget.isHidden():
self.change_animation_2(20,405)
self.change_animation_3(self.ui.Protection_widget,0.5)
self.change_animation(self.ui.Protection_widget)
self.ui.State_widget.hide()
@@ -938,31 +1052,19 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Process_widget.hide()
self.ui.About_widget.hide()
self.ui.Setting_widget.hide()
self.Process_Timer.stop()
def change_tools(self,widget): # 切換工具
self.Process_Timer.stop()
self.ui.Tools_widget.hide()
self.ui.Setting_widget.hide()
self.ui.About_widget.hide()
if widget == self.ui.Process_widget:
self.Process_Timer.start(0)
elif widget == self.ui.System_Info_widget:
self.System_Info_update()
self.change_animation_3(widget,0.5)
self.change_animation(widget)
widget.show()
def back_to_tools(self,widget): # 返回工具首頁
widget.hide()
if widget == self.ui.Process_widget:
self.Process_Timer.stop()
self.change_animation_3(self.ui.Tools_widget,0.5)
self.change_animation(self.ui.Tools_widget)
self.ui.Tools_widget.show()
def setting_back(self): # 返回主頁
self.ui.Navigation_Bar.show()
self.ui.Setting_widget.hide()
def mousePressEvent(self, event): # 滑鼠按下動畫
def update_opacity():
if self.pyas_opacity > 80 and self.m_flag == True:
@@ -1047,9 +1149,9 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
for pid in self.get_process_list():
QApplication.processEvents()
h_process = self.kernel32.OpenProcess(0x1F0FFF, False, pid)
exe_name = self.get_process_file(h_process).replace('\\', '/')
if exe_name:
Process_list_app.append((pid, f"[{pid}] > {exe_name}"))
file = self.get_process_file(h_process).replace("\\", "/")
if os.path.exists(file):
Process_list_app.append((pid, f"[{pid}] > {file}"))
Process_list_app.sort(key=lambda x: x[0])
self.Process_list_all_pid = [pid for pid, _ in Process_list_app]
if len(self.Process_list_all_pid) != self.Process_quantity:
@@ -1087,13 +1189,14 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.ui.Virus_Scan_text.setText(self.trans("正在初始化中"))
QApplication.processEvents()
try:
for file in self.virus_list:
for file in self.virus_lock:
self.lock_file(file, False)
except:
pass
self.scan_file = True
self.total_scan = 0
self.scan_time = time.time()
self.virus_lock = {}
self.virus_list = []
self.virus_list_ui = []
self.ui.Virus_Scan_Solve_Button.hide()
self.ui.Virus_Scan_choose_widget.hide()
@@ -1107,7 +1210,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
def copyPathFunc():
item_row = False
for i in self.ui.Virus_Scan_output.selectedIndexes():
item_row = self.virus_list[i.row()]
item_row = self.virus_list_ui[i.row()]
if item_row:
pyperclip.copy(item_row.replace("/", "\\"))
menu = QMenu()
@@ -1129,7 +1232,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
def virus_solve(self): # 清理病毒
try:
self.ui.Virus_Scan_Solve_Button.hide()
for file in self.virus_list:
for file in self.virus_lock:
try:
if self.ui.Virus_Scan_output.findItems(file, Qt.MatchContains)[0].checkState() == Qt.Checked:
QMetaObject.invokeMethod(self.ui.Virus_Scan_title, "setText",
@@ -1148,7 +1251,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
QMetaObject.invokeMethod(self.ui.Virus_Scan_title, "setText",
Qt.QueuedConnection, Q_ARG(str, self.trans("病毒掃描")))
QMetaObject.invokeMethod(self.ui.Virus_Scan_text, "setText",
Qt.QueuedConnection, Q_ARG(str, self.trans("掃描完成")))
Qt.QueuedConnection, Q_ARG(str, self.trans("請選擇掃描方式")))
except Exception as e:
print(e)
@@ -1156,7 +1259,6 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
try:
if state and file:
self.lock_file(file, True)
self.virus_list.append(file)
self.virus_list_ui.append(f"[{state}] {file}")
item = QListWidgetItem()
item.setText(f"[{state}] {file}")
@@ -1166,21 +1268,23 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
except:
pass
def answer_scan(self): # 統計結果
def answer_scan(self): # 統計結果
try:
QMetaObject.invokeMethod(self.ui.Virus_Scan_title, "setText",
Qt.QueuedConnection, Q_ARG(str, self.trans("病毒掃描")))
if self.virus_list:
if self.virus_list_ui:
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)} 個病毒")
text = self.trans(f"當前發現 {len(self.virus_list_ui)} 個病毒")
else:
self.virus_scan_break()
text = self.trans("當前未發現病毒")
takes_time = int(time.time() - self.scan_time) + 1
text_end = self.trans(f",耗時 {takes_time} 秒,共掃描 {self.total_scan} 個檔案")
QMetaObject.invokeMethod(self.ui.Virus_Scan_text, "setText",
Qt.QueuedConnection, Q_ARG(str, text))
self.send_notify(text)
Qt.QueuedConnection, Q_ARG(str, text+text_end))
self.send_notify(text+text_end)
except Exception as e:
print(e)
@@ -1188,10 +1292,6 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.scan_file = False
self.ui.Virus_Scan_Break_Button.hide()
self.ui.Virus_Scan_choose_Button.show()
QMetaObject.invokeMethod(self.ui.Virus_Scan_title, "setText",
Qt.QueuedConnection, Q_ARG(str, self.trans("病毒掃描")))
QMetaObject.invokeMethod(self.ui.Virus_Scan_text, "setText",
Qt.QueuedConnection, Q_ARG(str, self.trans("請選擇掃描方式")))
def virus_scan_menu(self):
if self.ui.Virus_Scan_choose_widget.isHidden():
@@ -1208,10 +1308,11 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.scan_thread = Thread(target=self.write_scan,
args=(self.start_scan(file),file,), daemon=True)
self.scan_thread.start()
self.total_scan += 1
while self.scan_thread.is_alive():
QApplication.processEvents()
self.scan_thread.join()
self.answer_scan()
self.answer_scan()
except Exception as e:
print(e)
self.virus_scan_break()
@@ -1226,7 +1327,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
while self.scan_thread.is_alive():
QApplication.processEvents()
self.scan_thread.join()
self.answer_scan()
self.answer_scan()
except Exception as e:
print(e)
self.virus_scan_break()
@@ -1259,27 +1360,28 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
Qt.QueuedConnection, Q_ARG(str, self.trans("正在掃描")))
QMetaObject.invokeMethod(self.ui.Virus_Scan_text, "setText",
Qt.QueuedConnection, Q_ARG(str, file))
self.write_scan(self.start_scan(file),file)
self.write_scan(self.start_scan(file), file)
self.total_scan += 1
except:
pass
def start_scan(self, file): # 調用掃描引擎
try:
match_data = self.model.get_type(file)
for section, data in match_data.items():
label, level = self.model.dl_scan(data)
if label and label in self.model.detect:
if self.config_json["sensitivity"]:
return f"{label}.{level}"
elif level >= self.model.values:
return f"{label}.{level}"
label, level = self.model.dl_scan(file)
if label and self.config_json["sensitivity"]:
return f"{label}.{level}"
elif label and level >= self.model.values:
return f"{label}.{level}"
except Exception as e:
print(e)
try:
if self.config_json["extend_mode"]:
label, level = self.rules.yr_scan(file)
if label and isinstance(level, str):
return f"{label}.{level}"
return False
except:
return False
except Exception as e:
print(e)
return False
def repair_system(self): # 修復系統
try:
@@ -1305,7 +1407,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
def delete_registry_value(self, hkey, subkey, value_name): # 刪除註冊表值
key_handle = self.open_registry_key(hkey, subkey)
if key_handle and self.advapi32.RegDeleteValueW(key_handle, value_name) == 0 and self.track_proc:
if self.advapi32.RegDeleteValueW(key_handle, value_name) == 0 and self.track_proc:
self.kill_process("註冊表攔截", *self.track_proc)
self.advapi32.RegCloseKey(key_handle)
@@ -1459,7 +1561,7 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.lock_process(h_process, True)
if self.start_scan(file):
self.kill_process("病毒攔截", h_process, file)
elif ":/Windows" not in file and ":/Program" not in file:
elif ":/Windows" not in file:
self.track_proc = (h_process, file)
self.lock_process(h_process, False)
except Exception as e:
@@ -1576,27 +1678,37 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.send_notify(self.trans(f"竄改警告: self.sys_protect (reg)"), False)
self.kill_process("竄改攔截", *self.track_proc)
def get_tcp_connections(self): # 獲取連接
size = ctypes.wintypes.DWORD()
self.iphlpapi.GetExtendedTcpTable(None, ctypes.byref(size), False, 2, 0, 0)
tcp_table = MIB_TCPTABLE_OWNER_PID()
tcp_table_size = size.value
tcp_table_pointer = ctypes.cast(ctypes.create_string_buffer(tcp_table_size), ctypes.POINTER(MIB_TCPTABLE_OWNER_PID))
tcp_table_pointer.contents.dwNumEntries = 0
if self.iphlpapi.GetExtendedTcpTable(tcp_table_pointer, ctypes.byref(size), False, 2, 0, 0) == 0:
tcp_entries = tcp_table_pointer.contents.table[:tcp_table_pointer.contents.dwNumEntries]
return tcp_entries
return []
def get_connections_list(self): # 獲取連接列表
try:
connections = set()
size = ctypes.wintypes.DWORD()
ret = self.iphlpapi.GetExtendedTcpTable(None, ctypes.byref(size), True, 2, 5, 0)
if ret != 122:
raise ctypes.WinError(ret)
buf = ctypes.create_string_buffer(size.value)
ret = self.iphlpapi.GetExtendedTcpTable(buf, ctypes.byref(size), True, 2, 5, 0)
if ret != 0:
raise ctypes.WinError(ret)
num_entries = ctypes.cast(buf, ctypes.POINTER(ctypes.wintypes.DWORD)).contents.value
row_size = ctypes.sizeof(MIB_TCPROW_OWNER_PID)
offset = ctypes.sizeof(ctypes.wintypes.DWORD)
for i in range(num_entries):
entry_address = ctypes.addressof(buf) + offset + i * row_size
conn = ctypes.cast(entry_address, ctypes.POINTER(MIB_TCPROW_OWNER_PID)).contents
connections.add((conn.dwOwningPid, conn.dwLocalAddr, conn.dwRemoteAddr, conn.dwState))
return connections
except Exception as e:
print(e)
return None
def protect_net_thread(self): # 網路防護
def protect_net_thread(self):
while self.config_json["net_protect"]:
try:
time.sleep(0.2)
for conn in self.get_tcp_connections():
local_ip = f"{conn.dwLocalAddr & 0xFF}.{(conn.dwLocalAddr >> 8) & 0xFF}.{(conn.dwLocalAddr >> 16) & 0xFF}.{(conn.dwLocalAddr >> 24) & 0xFF}"
remote_ip = f"{conn.dwRemoteAddr & 0xFF}.{(conn.dwRemoteAddr >> 8) & 0xFF}.{(conn.dwRemoteAddr >> 16) & 0xFF}.{(conn.dwRemoteAddr >> 24) & 0xFF}"
if remote_ip in self.rules.network:
self.kill_process("網路攔截", *self.track_proc)
new_connections = self.get_connections_list()
for key in new_connections - self.exist_connections:
self.handle_new_connections(key)
self.exist_connections = new_connections
except Exception as e:
print(e)
if self.ui.Protection_switch_Button_5.text() == self.trans("已開啟"):
@@ -1604,6 +1716,20 @@ class MainWindow_Controller(QMainWindow): # 初始化主程式
self.send_notify(self.trans(f"竄改警告: self.net_protect"), False)
self.kill_process("竄改攔截", *self.track_proc)
def handle_new_connections(self, key): # 過濾並掃描
try:
h_process = self.kernel32.OpenProcess(0x1F0FFF, False, key[0])
file = self.get_process_file(h_process).replace("\\", "/")
remote_ip = f"{key[2] & 0xFF}.{(key[2] >> 8) & 0xFF}.{(key[2] >> 16) & 0xFF}.{(key[2] >> 24) & 0xFF}"
if os.path.exists(file) and not self.check_whitelist(file):
self.lock_process(h_process, True)
if remote_ip in self.rules.network:
self.kill_process("網路攔截", h_process, file)
self.lock_process(h_process, False)
except Exception as e:
print(e)
self.lock_process(h_process, False)
if __name__ == '__main__': # 檢查主程序
QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
QGuiApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
+82 -37
View File
@@ -1,5 +1,5 @@
import os, sys, time, json, yara
import numpy, pefile, onnxruntime
import os, sys, time, json, yara, numpy
import chardet, pefile, onnxruntime
from PIL import Image
class YRScan:
@@ -38,15 +38,27 @@ class YRScan:
class DLScan:
def __init__(self):
self.models = {}
self.shells = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '!o',
'cry', 'test', 'ace', 'yg', 'obr', 'tvm', 'dec', 'enc', 'b1_', 'base',
'bss', 'clr_uef', 'cursors', 'trs_age', 'engine', 'enigma', 'protect',
'nep', 'no_bbt', 'wpp_sf', 'retpol', 'rt', 'rwexec', 'rygs', 'poolmi',
's:@', 'pgae', 'proxy', 'wisevec', 'segm', 'transit', 'vmp', 'extjmp',
'upx', 'tracesup', 'res', 'lzma', 'malloc_h', 'miniex', 'ndr64', 'be',
'mssmixer', 'wow', 'press', 'fio', 'pad', 'hexpthk', 'h~;', 'icapsec',
'sanontcp', 'secur', 'asmstub', 'nsys_wr', 'orpc', 'pack', 'wow64svc',
'uedbg', 'viahw', 'data', 'zk', 'fothk', 'qihoo']#"""
self.valid_interpolations = {
"box": Image.Resampling.BOX,
"none": Image.Resampling.NEAREST,
"bilinear": Image.Resampling.BILINEAR,
"hamming": Image.Resampling.HAMMING,
"bicubic": Image.Resampling.BICUBIC,
"lanczos": Image.Resampling.LANCZOS,
"nearest": Image.Resampling.NEAREST}
shell_section = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"cry", "tvm", "dec", "enc", "vmp", "upx", "aes", "lzma", "press",
"pack", "enigma", "protect", "secur"]
unknown_section = ["asmstub", "base", "bss", "clr_uef", "cursors",
"engine", "fio", "fothk", "h~;", "icapsec", "malloc_h", "miniex",
"mssmixer", "ndr64", "nsys_wr", "obr", "wow", "wow64svc", "wpp_sf",
"pad", "pgae", "poolmi", "proxy", "qihoo", "res", "retpol", "uedbg",
"rwexec", "rygs", "s:@", "sanontcp", "segm", "test", "tracesup",
"transit", "trs_age", "wisevec"]
unimportant_section = ["viahwaes", "orpc", "nep", "ace", "extjmp",
"no_bbt", "data", "page", "hexpthk"]
self.shells = shell_section + unimportant_section + unknown_section
def load_model(self, file_path):
try:
@@ -58,37 +70,69 @@ class DLScan:
self.models[file_path] = onnxruntime.InferenceSession(file_path)
self.labels = self.class_names['Labels']
self.detect = self.class_names['Detect']
self.pixels = self.class_names['Pixels']
self.values = self.class_names['Values']
self.resize = self.class_names['Resize']
self.suffix = self.class_names['Suffix']
except Exception as e:
pass
def dl_scan(self, file_data):
def dl_scan(self, file_path):
try:
label_similarities = {label: [] for label in self.labels}
image_data = self.preprocess_image(file_data, tuple(self.pixels))
image_array = numpy.asarray(image_data).astype('float32') / 255.0
image_expand = numpy.expand_dims(image_array, axis=(0, -1))
batch_images = []
for section, file_data in self.get_type(file_path).items():
image_data = self.preprocess_image(file_data, tuple(self.resize))
image_array = numpy.asarray(image_data).astype('float32') / 255.0
if len(image_array.shape) == 2:
image_array = numpy.expand_dims(image_array, axis=-1)
batch_images.append(image_array)
batch_results = [{label: [] for label in self.labels} for _ in range(len(batch_images))]
batch_images = numpy.stack(batch_images, axis=0)
for model_name, model in self.models.items():
input_name = model.get_inputs()[0].name
pre_answers = model.run(None, {input_name: image_expand})[0][0]
for k, score in enumerate(pre_answers):
label_similarities[self.labels[k].strip()].append(score)
label_percentage = {label: (sum(similarities) / len(self.models)) * 100
for label, similarities in label_similarities.items()}
label, level = max(label_percentage.items(), key=lambda x: x[1])
return label, int(level)
predictions = model.run(None, {input_name: batch_images})[0]
for i, pre_answers in enumerate(predictions):
for k, score in enumerate(pre_answers):
batch_results[i][self.labels[k].strip()].append(score)
final_results = []
for result in batch_results:
label_percentage = {label: (sum(scores) / len(scores)) * 100
for label, scores in result.items()}
best_label, best_confidence = max(label_percentage.items(), key=lambda x: x[1])
final_results.append((best_label, int(best_confidence)))
if best_label in self.detect:
return best_label, int(best_confidence)
return False, False
except Exception as e:
return False, False
def preprocess_image(self, file_data, target_size):
wah = int(numpy.ceil(numpy.sqrt(len(file_data))))
file_data = numpy.frombuffer(file_data, dtype=numpy.uint8)
image_array = numpy.zeros((wah * wah,), dtype=numpy.uint8)
image_array[:len(file_data)] = file_data
image = Image.fromarray(image_array.reshape((wah, wah)), 'L')
return image.resize(target_size, Image.Resampling.NEAREST)
width, height, channels, interpolation = target_size
wah = int(numpy.ceil(numpy.sqrt(len(file_data) / channels)))
array_data = numpy.frombuffer(file_data, dtype=numpy.uint8)
expected_size = wah * wah * channels
image_array = numpy.zeros((expected_size,), dtype=numpy.uint8)
image_array[:len(file_data)] = array_data
if channels == 1:
reshape = image_array.reshape((wah, wah))
image = Image.fromarray(reshape, 'L')
elif channels == 3:
reshape = image_array.reshape((wah, wah, 3))
image = Image.fromarray(reshape, 'RGB')
if width == 0 and height == 0:
return image
i = self.valid_interpolations.get(interpolation.lower(), Image.BILINEAR)
return image.resize((width, height), i)
def is_text_file(self, content, sample_size):
try:
raw_data = content[:sample_size]
encoding = chardet.detect(raw_data)["encoding"]
if encoding in ["ascii", "utf-8", "utf-8-sig"]:
if raw_data.decode(encoding):
return True
return False
except:
return False
def get_type(self, file_path):
match_data = {}
@@ -97,13 +141,14 @@ class DLScan:
try:
with pefile.PE(file_path, fast_load=True) as pe:
for section in pe.sections:
section_name = section.Name.rstrip(b'\x00').decode('latin1')
name = section.Name.rstrip(b'\x00').decode('latin1')
if (section.Characteristics & 0x00000020 and not
any(shell in section_name.lower() for shell in self.shells)):
match_data[section_name] = section.get_data()
any(s in name.lower() for s in self.shells)):
print(name)
match_data[name] = section.get_data()
except:
if ftype in [".bat", ".cmd", ".ps1", ".vbs", ".wsf", ".html", ".js",
".txt", ".htm", ".hta", ".php", ".css", ".xml", ".json", ".wasm"]:
with open(file_path, 'rb') as file:
match_data[ftype] = file.read()
with open(file_path, 'rb') as f:
file_content = f.read()
if self.is_text_file(file_content, 1024):
match_data[ftype] = file_content
return match_data
+706 -446
View File
File diff suppressed because it is too large. Load diff
+14 -8
View File
@@ -1,10 +1,10 @@
translate_dict = {
"zh_TW": {"已开启":"已開啟","已关闭":"已關閉","On":"已開啟","Off":"已關閉"},
"zh_CN": {"已開啟":"已开启","已關閉":"已关闭","On":"已开启","Off":"已关闭",
"錯誤":"错误","發現":"发现","關閉":"关闭","裝置":"设备","記憶體":"内存",
"軟體":"软件","檔案":"文件","確定":"确认","設定":"设置","關於":"关于",
"錯誤":"错误","實時":"实时","發現":"发现","關閉":"关闭","裝置":"设备",
"總數":"总数","註冊":"注册","圖標":"图标","路徑":"路径","網路":"网络",
"位元":"字节","彈窗":"弹窗","靈敏":"敏感","複製":"复制","開啟":"开启",
"位元":"字节","靈敏":"敏感","複製":"复制","開啟":"开启","資源回收桶":"资源回收桶",
"訊":"讯","項":"项","掃":"扫","試":"试","黃":"黄","嗎":"吗","防":"保",
"鑰":"钥","當":"当","後":"后","護":"护","導":"导","區":"区","復":"复",
"攔":"拦","請":"请","統":"统","刪":"删","進":"进","個":"个","選":"选",
@@ -16,7 +16,8 @@ translate_dict = {
"綠":"绿","態":"态","務":"务","連":"连","檢":"检","測":"测","關":"关",
"強":"强","驅":"驱","為":"为","腳":"脚","單":"单","開":"开","擴":"扩",
"惡":"恶","據":"据","庫":"库","經":"经","敗":"败","謝":"谢","別":"别",
"載":"载","誤":"误","報":"报","鏈":"链","竄":"窜","蹤":"踪","與":"与","記憶體":"内存",},
"載":"载","誤":"误","報":"报","鏈":"链","竄":"窜","蹤":"踪","與":"与",
"異":"异","實":"实","時":"时","彈":"弹","窗":"窗","暫":"暂","訂":"订",},
"en_US": {"已開啟":"On","已關閉":"Off","已开启":"On","已关闭":"Off",",":", ",
"立即刪除":"Delete Now","安全模式":"Safe Mode","官方網站":"Website ",
"腳本":"Script ","鏈式":"Chain ","記憶體":"Memory ","加載":"Load ",
@@ -27,7 +28,7 @@ translate_dict = {
"最小化到":"Minimize To ","靈敏度":"Sensitivity ","正在檢查":"Checking ",
"確定要":"Sure Want To ","引擎靈敏度":"Sensitivity ","更新":"Update ",
"白色主題":"White","黃色主題":"Yellow","紅色主題":"Red","語言":"Language ",
"藍色主題":"Blue","綠色主題":"Green","自定主題":"Custom","最新":"Latest ",
"藍色主題":"Blue","綠色主題":"Green","自訂主題":"Custom","最新":"Latest ",
"特別感謝":"Contributors ","版本資訊":"Information","通訊":"Connect ",
"註冊表":"Registry ","退出":"Quit ","檔案":"File ","當前":"Currently ",
"狀態":"State ","掃描":"Scan ","工具":"Tools ","防護":"Protect ",
@@ -41,13 +42,13 @@ translate_dict = {
"網路":"Network ","變更":"Change ","總數":"Total","結束":"End ",
"選項":"Options ","監控":"Monitor ","連接":"Connect ","可以":"To ",
"進程":"Process ","攔截":"Block ","引導":"Boot ","刪除":"Delete ",
"分區":"Partition ","設定":"Settings","關於":"About","模式":"Mode ",
"分區":"Partition ","設定":"Setting ","關於":"About","模式":"Mode ",
"提高":"Improve ","安全":"Security ","顯色":"Color ","主題":"Themes ",
"風險":"Risk ","介面":"GUI ","核心":"Core ","服務":"Services ",
"管理":"Manage","所有":"All ","您":"You ","取消":"Cancel ","未":"Not ",
"垃圾":"Junk ","位元":"byte ","本機":"Computer ","停止":"Stop ",
"增加到":"Add To ","白名單":"White List ","軟體":"Software ","正在":"",
"增加":"Add ","移除":"Delete","項目":"Items ","生成":"Create ","稱":"",
"到":"To ","白名單":"White List ","軟體":"Software ","正在":"",
"增加":"Add ","移除":"Delete ","項目":"Items ","生成":"Create ","稱":"",
"複製":"Copy ","開啟":"Open ","此":"This ","並":"And ","全盤":"Full ",
"已經在":"Already ","數據庫":"Database ","誤報":"False Positive ",
"高":"High ","新":"New ","和":"And ","可能會":"Possible ","會":"Can ",
@@ -57,4 +58,9 @@ translate_dict = {
"擴展":"Extension ","套件":"Kit ","自動":"Auto ","上報":"Report ",
"分析":"Analysis ","自身":"Self ","其他":"Other ","配置":"Config ",
"丟失":"Lost ","網站":"Website ","不兼容":"Not Compatible ",
"竄改":"Tamper ","第三方":"Other ","與":"With "," ":" "}}
"竄改":"Tamper ","第三方":"Other ","實時":"Real Time ","查看":"View ",
"指定":"Specify ","清空":"Empty ","資源回收桶":"Recycle Bin ",
"與":"With ","當":"When ","功能":"Function ","異常":"Abnormal ",
"重置":"Reset ","窗口":"Window ","暫存":"Temp ","自訂":"Custom ",
"不支持":"Not Support ","共":"Total ","秒":"Seconds ","耗時":"Takes ",
"時":""," ":" "}}
+4931 -4800
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -2,7 +2,7 @@ import pyinstaller_versionfile
pyinstaller_versionfile.create_versionfile(
output_file="versionfile.txt",
version='3.2.7',
version='3.3.0',
company_name="PYAS Security",
file_description="Python Antivirus Software",
internal_name="PYAS",
+8 -6
View File
@@ -1,6 +1,6 @@
# PYAS (Python Antivirus Software)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## Readme Language
@@ -11,13 +11,15 @@
## Requirements
```
pip install pefile==2023.2.7
pip install pyperclip==1.8.2
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install onnxruntime==1.18.1
pip install pefile==2023.2.7
pip install pillow==10.4.0
pip install pyperclip==1.8.2
pip install PyQt5==5.15.11
pip install requests==2.32.3
pip install yara-python==4.5.1
```
## File Information
+8 -6
View File
@@ -1,17 +1,19 @@
# PYAS (Python 杀毒软件)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## 安装要求
```
pip install pefile==2023.2.7
pip install pyperclip==1.8.2
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install onnxruntime==1.18.1
pip install pefile==2023.2.7
pip install pillow==10.4.0
pip install pyperclip==1.8.2
pip install PyQt5==5.15.11
pip install requests==2.32.3
pip install yara-python==4.5.1
```
## 文件信息
+8 -6
View File
@@ -1,17 +1,19 @@
# PYAS (Python 防毒軟體)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## 安裝要求
```
pip install pefile==2023.2.7
pip install pyperclip==1.8.2
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install onnxruntime==1.18.1
pip install pefile==2023.2.7
pip install pillow==10.4.0
pip install pyperclip==1.8.2
pip install PyQt5==5.15.11
pip install requests==2.32.3
pip install yara-python==4.5.1
```
## 檔案資訊