Compare commits

...
40 Commits
Author SHA1 Message Date
PYDT 316882bcd0 Add files via upload 2024-10-03 02:27:09 +08:00
PYDT b204e52297 Update README_zh_CN.md 2024-10-02 21:58:55 +08:00
PYDT f82a63f4c8 Update README_zh_TW.md 2024-10-02 21:58:40 +08:00
PYDT cb0f2108a4 Update README.md 2024-10-02 21:58:12 +08:00
PYDT 300b7a7a68 Add files via upload 2024-10-02 12:30:44 +08:00
PYDT c3852ca60d Add files via upload 2024-10-02 12:00:37 +08:00
PYDT a5fb735c93 Add files via upload 2024-09-28 11:15:53 +08:00
PYDT d0b04ba84f Add files via upload 2024-09-28 11:14:54 +08:00
PYDT 9552742a39 Add files via upload 2024-09-21 22:51:13 +08:00
PYDT 8e9bdf6c0c Add files via upload 2024-09-21 22:50:02 +08:00
PYDT 818cc48502 Add files via upload 2024-09-20 00:36:42 +08:00
PYDT adc4e28eb8 Add files via upload 2024-09-20 00:31:25 +08:00
PYDT 2e3a4d3bf1 Add files via upload 2024-09-14 15:41:49 +08:00
PYDT d9bcac78e7 Add files via upload 2024-09-14 15:12:14 +08:00
PYDT 2342947849 Add files via upload 2024-09-14 15:11:36 +08:00
PYDT 19204dee8d Add files via upload 2024-09-12 16:17:50 +08:00
PYDT 863fa90b80 Add files via upload 2024-09-12 16:08:26 +08:00
PYDT 6fdef4a8f1 Add files via upload 2024-09-12 16:08:10 +08:00
PYDT 9469ceaa02 Add files via upload 2024-09-12 15:25:07 +08:00
PYDT 857f184409 Add files via upload 2024-09-11 01:05:58 +08:00
PYDT a2f4a725f5 Add files via upload 2024-09-10 14:34:02 +08:00
PYDT d12449bbb9 Add files via upload 2024-09-10 13:35:57 +08:00
PYDT a41f4711dd Add files via upload 2024-09-10 13:34:16 +08:00
PYDT 3c2b018d49 Add files via upload 2024-09-07 10:49:46 +08:00
PYDT e221a09709 Add files via upload 2024-09-07 10:48:43 +08:00
PYDT 26ff4bd843 Update README_zh_TW.md 2024-08-26 07:42:37 +08:00
PYDT d8e28f384a Update README_zh_CN.md 2024-08-26 07:42:17 +08:00
PYDT 65e68c3cc4 Update README.md 2024-08-26 07:41:44 +08:00
PYDT 7b76ab2a59 Update README.md 2024-08-26 07:41:18 +08:00
PYDT ae2a01b463 Update README_zh_TW.md 2024-08-26 07:29:15 +08:00
PYDT cda022a9f4 Update README_zh_CN.md 2024-08-26 07:28:10 +08:00
PYDT 672e48c5f8 Update README.md 2024-08-26 07:26:34 +08:00
PYDT 6fbdb1354f Update README.md 2024-08-26 07:22:09 +08:00
PYDT 79bc7fd443 Update README_zh_TW.md 2024-08-20 10:57:17 +08:00
PYDT 5578dd3339 Update README_zh_CN.md 2024-08-20 10:57:03 +08:00
PYDT 0232dbd196 Update README.md 2024-08-20 10:56:46 +08:00
PYDT d44e192eaa Update README_zh_CN.md 2024-08-20 10:53:34 +08:00
PYDT 4f12b19cf8 Update README_zh_TW.md 2024-08-20 10:52:57 +08:00
PYDT 392ac1b1c7 Update README_zh_TW.md 2024-08-20 10:52:37 +08:00
PYDT 8ad175aca3 Update README.md 2024-08-20 10:51:48 +08:00
9 changed files with 203 additions and 156 deletions

No files matched your search

+2 -10
View File
@@ -1,15 +1,7 @@
{
"Suffix": [".bat", ".cmd", ".dll", ".exe", ".js", ".ps1", ".sys", ".vbs", ".com"],
"Labels": ["White/Pefile", "White/Script", "Virus/Pefile", "Virus/Script"],
"Labels": ["White/BAT-File", "White/CMD-File", "White/DLL-File", "White/EXE-File",
"White/JS-File", "White/PS1-File", "White/SYS-File", "White/VBS-File",
"Virus/BAT-File", "Virus/CMD-File", "Virus/DLL-File", "Virus/EXE-File",
"Virus/JS-File", "Virus/PS1-File", "Virus/SYS-File", "Virus/VBS-File"],
"Detect": ["Virus/BAT-File", "Virus/CMD-File", "Virus/DLL-File", "Virus/EXE-File",
"Virus/JS-File", "Virus/PS1-File", "Virus/SYS-File", "Virus/VBS-File"],
"Models": ["PYAS_Model_A1.onnx", "PYAS_Model_A2.onnx", "PYAS_Model_A3.onnx"],
"Detect": ["Virus/Pefile", "Virus/Script"],
"Pixels": [224, 224],
Binary file not shown.
+73 -38
View File
@@ -1,6 +1,6 @@
import os, gc, sys, time, json, psutil
import msvcrt, ctypes, pyperclip, win32file
import win32gui, win32api, win32con
import ctypes, struct, msvcrt, pyperclip
import win32gui, win32api, win32con, win32file
from PYAS_Engine import YRScan, DLScan
from PYAS_Suffixes import slist, alist
from PYAS_Language import translate_dict
@@ -19,7 +19,7 @@ class MainWindow_Controller(QMainWindow):
self.pyas = sys.argv[0].replace("\\", "/")
self.dir = os.path.dirname(self.pyas)
self.pyae_version = "AI Engine"
self.pyas_version = "3.1.6"
self.pyas_version = "3.2.1"
self.first_startup = True
self.init_data_base()
self.init_tray_icon()
@@ -646,7 +646,8 @@ class MainWindow_Controller(QMainWindow):
# question event message
print(f"[Quest] > {text}")
if self.first_startup != True:
return QMessageBox.question(self, "Quest", self.trans(str(text)),QMessageBox.Yes|QMessageBox.No) == 16384
return QMessageBox.question(self, "Quest",
self.trans(str(text)),QMessageBox.Yes|QMessageBox.No) == 16384
except:
return False
@@ -655,7 +656,8 @@ class MainWindow_Controller(QMainWindow):
# send system notification
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(f"[Notify] > [{now_time}] {text}")
QMetaObject.invokeMethod(self.ui.State_output, "append", Qt.QueuedConnection, Q_ARG(str, f"[{now_time}] {text}"))
QMetaObject.invokeMethod(self.ui.State_output, "append",
Qt.QueuedConnection, Q_ARG(str, f"[{now_time}] {text}"))
if self.first_startup == False and notify_bar == True:
self.tray_icon.showMessage(now_time, text, 5000)
except:
@@ -819,7 +821,6 @@ class MainWindow_Controller(QMainWindow):
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(Qt.Checked)
self.ui.Virus_Scan_output.addItem(item)
self.send_notify(self.trans(f"發現病毒: ")+file, False)
except:
pass
@@ -864,7 +865,8 @@ class MainWindow_Controller(QMainWindow):
file = str(QFileDialog.getOpenFileName(self,self.trans("病毒掃描"),"C:/")[0])
if file and file not in self.whitelist and file != self.pyas:
self.init_scan()
self.scan_thread = Thread(target=self.write_scan, args=(self.start_scan(file),file,), daemon=True)
self.scan_thread = Thread(target=self.write_scan,
args=(self.start_scan(file),file,), daemon=True)
self.scan_thread.start()
while self.scan_thread.is_alive():
QApplication.processEvents()
@@ -921,17 +923,19 @@ class MainWindow_Controller(QMainWindow):
def start_scan(self, file):
try:
if os.path.exists(file):
self.send_notify(self.trans(f"正在掃描: ")+file, False)
label, level = self.model.dl_scan(file)
if label and label in self.model.detect:
if self.json["high_sensitive"]:
return "Virus/Deep-Learning"
elif level >= self.model.values:
return "Virus/Deep-Learning"
if isinstance(file, dict):
match_data = file
elif os.path.exists(file):
match_data = self.model.get_type(file)
for ftype, data in match_data.items():
label, level = self.model.dl_scan(data)
if label and label in self.model.detect:
if self.json["high_sensitive"]:
return label
elif level >= self.model.values:
return label
if self.json["extension_kits"]:
if self.rules.yr_scan(file):
return "Virus/Yara-Detected"
return self.rules.yr_scan(file)[0]
return False
except:
return False
@@ -1330,15 +1334,18 @@ class MainWindow_Controller(QMainWindow):
self.kill_process("病毒攔截", p, file, False)
elif self.load_scan(p):
self.kill_process("加載攔截", p, file, False)
elif self.memory_scan(p):
self.kill_process("記憶體攔截", p, file, False)
elif ":/Windows" not in file and ":/Program" not in file:
if os.path.exists(file):
ftype = str(f".{file.split('.')[-1]}").lower()
if os.path.exists(file) and ftype in slist:
self.track_proc = p, file, True
except:
pass
def load_scan(self, p):
try:
for entry in p.memory_maps():
for entry in p.memory_maps(grouped=True):
file = str(entry.path).replace("\\", "/")
if ":/Windows" not in file and file not in self.whitelist:
ftype = str(f".{file.split('.')[-1]}").lower()
@@ -1348,23 +1355,50 @@ class MainWindow_Controller(QMainWindow):
except:
return False
def get_module_base(self, p):
try:
for entry in p.memory_maps(grouped=False):
file = str(entry.path).replace("\\", "/")
ftype = str(f".{file.split('.')[-1]}").lower()
if ftype in [".exe"] and file not in self.whitelist:
return int(entry.addr, 16)
return False
except:
return False
def memory_scan(self, p):
try:
memory_bytes = {}
m = ctypes.windll.kernel32.OpenProcess(0x1F0FFF, False, p.pid)
for memory_range in p.memory_maps(grouped=False):
base_addr = int(memory_range.addr, 16)
buffer = ctypes.create_string_buffer(memory_range.rss)
if ctypes.windll.kernel32.ReadProcessMemory(m, ctypes.c_void_p(base_addr),
buffer, memory_range.rss, ctypes.byref(ctypes.c_size_t(0))):
file = str(memory_range.path).replace("\\", "/")
memory_bytes.setdefault(file, bytearray()).extend(buffer.raw)
for file, data in memory_bytes.items():
ftype = str(f".{file.split('.')[-1]}").lower()
if ":/Windows" not in file and file not in self.whitelist:
if self.start_scan(file) or self.start_scan(bytes(data)):
return True
ctypes.windll.kernel32.CloseHandle(m)
match_data = {}
kernel32 = ctypes.windll.kernel32
base_address = self.get_module_base(p)
process_handle = kernel32.OpenProcess(0x1F0FFF, False, p.pid)
dos_header = ctypes.create_string_buffer(64)
kernel32.ReadProcessMemory(process_handle, ctypes.c_void_p(base_address), dos_header, 64, None)
nt_headers_offset = struct.unpack("<I", dos_header[0x3C:0x3C + 4])[0]
nt_headers = ctypes.create_string_buffer(248)
kernel32.ReadProcessMemory(process_handle,
ctypes.c_void_p(base_address + nt_headers_offset), nt_headers, 248, None)
number_of_sections = struct.unpack("<H", nt_headers[6:8])[0]
optional_header_size = struct.unpack("<H", nt_headers[20:22])[0]
section_headers_offset = nt_headers_offset + 24 + optional_header_size
for i in range(number_of_sections):
section_header = ctypes.create_string_buffer(40)
section_address = base_address + section_headers_offset + i * 40
kernel32.ReadProcessMemory(process_handle,
ctypes.c_void_p(section_address), section_header, 40, None)
section_name = section_header[:8].rstrip(b'\x00').decode('latin1')
virtual_size = struct.unpack("<I", section_header[8:12])[0]
virtual_address = struct.unpack("<I", section_header[12:16])[0]
characteristics = struct.unpack("<I", section_header[36:40])[0]
text_address = base_address + virtual_address
buffer = ctypes.create_string_buffer(virtual_size)
if kernel32.ReadProcessMemory(process_handle, ctypes.c_void_p(text_address), buffer,
virtual_size, ctypes.byref(ctypes.c_size_t(0))) and characteristics & 0x00000020:
if not any(shell in section_name.lower() for shell in self.model.shells):
match_data[section_name] = buffer.raw
kernel32.CloseHandle(process_handle)
if self.start_scan(match_data):
return True
return False
except:
return False
@@ -1420,10 +1454,11 @@ class MainWindow_Controller(QMainWindow):
self.ransom_counts += 1
elif action == 4 and ftype in alist:
self.ransom_counts += 1
if action == 3 and ftype in slist and self.start_scan(fpath):
self.ransom_counts = 0
os.remove(fpath)
self.send_notify(self.trans("病毒刪除: ")+fpath, True)
if ":/Windows" not in fpath and ftype in slist:
if action == 3 and self.start_scan(fpath):
self.ransom_counts = 0
os.remove(fpath)
self.send_notify(self.trans("病毒刪除: ")+fpath, True)
except:
pass
if self.ui.Protection_switch_Button_2.text() == self.trans("已開啟"):
+68 -55
View File
@@ -1,6 +1,6 @@
import os, io, sys, time, json, yara
import numpy, onnxruntime
from PIL import Image#, ImageShow
import numpy, pefile, onnxruntime
from PIL import Image, ImageShow
class YRScan:
def __init__(self):
@@ -8,14 +8,17 @@ class YRScan:
self.network = []
def load_rules(self, file_path):
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".yara", ".yar"]:
self.rules[file_path] = yara.compile(file_path)
elif ftype in [".yc", ".yrc"]:
self.rules[file_path] = yara.load(file_path)
elif ftype in [".ip", ".ips"]:
with open(file_path, "r") as f:
self.network += [l.strip() for l in f.readlines()]
try:
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".yara", ".yar"]:
self.rules[file_path] = yara.compile(file_path)
elif ftype in [".yc", ".yrc"]:
self.rules[file_path] = yara.load(file_path)
elif ftype in [".ip", ".ips"]:
with open(file_path, "r") as f:
self.network += [l.strip() for l in f.readlines()]
except:
pass
def yr_scan(self, file_path):
try:
@@ -23,76 +26,86 @@ class YRScan:
with open(file_path, "rb") as f:
file_path = f.read()
for name, rules in self.rules.items():
if rules.match(data=file_path):
return True
return False
matchs_rules = rules.match(data=file_path)
if matchs_rules:
return "Virus/Rules", matchs_rules
return False, False
except:
return False
return False, False
class DLScan:
def __init__(self):
self.models = {}
self.detect = []
self.values = 100
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']
def load_model(self, file_path):
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".json", ".txt"]:
self.class_names = json.load(open(file_path, 'r'))
self.values = self.class_names['Values']
self.detect = self.class_names['Detect']
available_providers = onnxruntime.get_available_providers()
preferred_providers = [
'CUDAExecutionProvider', 'ROCmExecutionProvider',
'OpenVINOExecutionProvider', 'DirectMLExecutionProvider',
'AzureExecutionProvider', 'CPUExecutionProvider']
providers = [p for p in preferred_providers if p in available_providers]
for model in self.class_names['Models']:
try:
model_path = os.path.join(os.path.dirname(file_path), model)
try:
self.models[model] = onnxruntime.InferenceSession(model_path, providers=providers)
except Exception as e:
providers = ['CPUExecutionProvider']
self.models[model] = onnxruntime.InferenceSession(model_path, providers=providers)
except:
pass
def dl_scan(self, file_path):
try:
if isinstance(file_path, str):
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in self.class_names['Suffix']:
with open(file_path, 'rb') as f:
file_path = f.read()
else:
return False, False
target_size, sim = tuple(self.class_names['Pixels']), {}
image = self.preprocess_image(file_path, target_size)
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".json", ".txt"]:
with open(file_path, 'r') as f:
self.class_names = json.load(f)
elif ftype in [".onnx"]:
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']
except Exception as e:
pass
def dl_scan(self, file_data):
try:
target_size, sim = tuple(self.pixels), {}
image = self.preprocess_image(file_data, target_size)
image_array = numpy.array(image).astype('float32') / 255.0
image_expand = numpy.expand_dims(image_array, axis=0)
for model_name, model in self.models.items():
input_name = model.get_inputs()[0].name
pre_answer = model.run(None, {input_name: image_expand})[0][0]
number = numpy.argmax(pre_answer)
label = self.class_names['Labels'][number].replace("\n", "")
label = self.labels[number].replace("\n", "")
sim[label] = sim.setdefault(label, 0) + pre_answer[number]
for local_label, sim_sum in sim.items():
if sim[local_label] > len(self.models) / 2:
if sim_sum > len(self.models) / 2:
local_level = sim_sum / len(self.models)
if ftype in str(f".{local_label.split('/')[-1].split('-')[0]}").lower(): #
return local_label, local_level * 100
print(local_label, local_level * 100)
return local_label, local_level * 100
return False, False
except Exception as e:
print(f"Error during scan: {e}")
return False, False
def preprocess_image(self, file_data, target_size): # New
def get_type(self, file_path):
try:
match_data = {}
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".exe", ".dll", ".sys", ".scr", ".com"]:
with pefile.PE(file_path, fast_load=True) as pe:
for section in pe.sections:
section_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()
elif ftype in [".bat", ".vbs", ".ps1", ".cmd", ".js"]:
with open(file_path, 'rb') as file:
match_data[ftype] = file.read()
return match_data
except:
return {}
def preprocess_image(self, file_data, target_size):
file_data = numpy.frombuffer(file_data, dtype=numpy.uint8)
data_count = len(file_data)
wah = int(numpy.ceil(numpy.sqrt((data_count + 2) // 3)))
image_array = numpy.zeros((wah * wah * 3,), dtype=numpy.uint8)
image_array[:data_count] = file_data
image_array = image_array.reshape((wah, wah, 3))
image = Image.fromarray(image_array) #ImageShow.show(image)
image = Image.fromarray(image_array)
return image.resize(target_size, Image.Resampling.LANCZOS)
+4 -3
View File
@@ -1,7 +1,8 @@
slist = [".exe",".dll",".com",".msi",".scr",
".js",".bat",".cmd",".ps1",".vbs"]
slist = [".exe",".dll",".sys",".com",".scr",
".bat",".ps1",".vbs",".cmd",".js"]
alist = [".exe",".dll",".zip",".7z",".rar",
alist = [".exe",".dll",".sys",".com",".scr",
".zip",".7z",".rar",".tar",".gz",
".js",".bat",".cmd",".ps1",".vbs",
".ppt",".pptx",".wps",".txt",".rtf",
".pdf",".xls",".xlsx",".doc",".docx",
+1 -1
View File
@@ -2,7 +2,7 @@ import pyinstaller_versionfile
pyinstaller_versionfile.create_versionfile(
output_file="versionfile.txt",
version='3.1.6',
version='3.2.1',
company_name="PYAS Security",
file_description="Python Antivirus Software",
internal_name="PYAS",
+17 -15
View File
@@ -1,6 +1,6 @@
# PYAS (Python Antivirus Software)
![PYAS](https://github.com/87owo/PYAS/assets/85057800/8136aaca-d388-4321-bedb-abc4fcecfa8b)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
## Readme Language
@@ -11,12 +11,16 @@
## Requirements
```
psutil==5.9.5
pefile==2023.2.7
requests==2.31.0
pyperclip==1.8.2
pywin32==306
PyQt5==5.15.9
pip install psutil==5.9.5
pip install pefile==2023.2.7
pip install requests==2.31.0
pip install pyperclip==1.8.2
pip install pywin32==306
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install onnxruntime==1.18.1
pip install pillow==10.4.0
```
## File Information
@@ -24,12 +28,7 @@ PyQt5==5.15.9
```
PYAS/
├── Driver/
│ ├── PYAS_Driver.sys -------> Extension Kit (self protection driver for pyas by 0sha0)
│ └── ...
│
├── Exten/
│ ├── bitdefender/ ----------> Extension Kit (bitdefender windows console scan engine)
│ ├── pe_sieve/ -------------> Extension Kit (pe sieve windows console memory engine)
│ ├── PYAS_Driver.sys -------> Driver Protect (self protection driver for pyas by 0sha0)
│ └── ...
│
├── Model/
@@ -41,10 +40,9 @@ PYAS/
│ ├── Yara_Rules.yrc ---------> Compile Rules (yara rules in compiled format)
│ └── ...
│
├── PYAS.* ---------------------> Main PYAS Program (including animation, scan, protect functions, ...)
├── PYAS.py ---------------------> Main PYAS Program (including animation, scan, protect functions, ...)
├── PYAS_Engine.py -------------> Conversion Database (used to transform profiles and forecast data)
├── PYAS_Suffixes.py -----------> File Suffixes (including scanned file suffixes and common suffixes)
├── PYAS_Extension.py ----------> Extension Kit (extension scanners developed by other developers)
├── PYAS_Interface.py ----------> PyQt5 Interface (use QT designer, must be matched with the main program)
├── PYAS_Resource.py -----------> PyQt5 Resource (status pictures, icon packages, button icons, ...)
├── PYAS_Language.py -----------> Translate Dict (Traditional Chinese, Simplified Chinese, English)
@@ -58,6 +56,10 @@ https://pyantivirus.wixsite.com/pyas
https://github.com/87owo/PYAS
## Microsoft Runtime
https://github.com/87owo/Microsoft_Runtime/releases
## PYAS Driver
https://github.com/0sha0/PYAS_Protection
+19 -17
View File
@@ -1,16 +1,20 @@
# PYAS (Python 杀毒软件)
![PYAS](https://github.com/87owo/PYAS/assets/85057800/8136aaca-d388-4321-bedb-abc4fcecfa8b)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
## 安装要求
```
psutil==5.9.5
pefile==2023.2.7
requests==2.31.0
pyperclip==1.8.2
pywin32==306
PyQt5==5.15.9
pip install psutil==5.9.5
pip install pefile==2023.2.7
pip install requests==2.31.0
pip install pyperclip==1.8.2
pip install pywin32==306
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install onnxruntime==1.18.1
pip install pillow==10.4.0
```
## 文件信息
@@ -21,11 +25,6 @@ PYAS/
│ ├── PYAS_Driver.sys -------> 驱动程序 (0sha0 为 pyas 提供的自我保护驱动程序)
│ └── ...
│
├── Exten/
│ ├── bitdefender/ ----------> 扩展套件 (bitdefender windows 控制台扫描引擎)
│ ├── pe_sieve/ -------------> 扩展套件 (pe sieve windows 控制台内存引擎)
│ └── ...
│
├── Model/
│ ├── PYAS_Model.json -------> 病毒数据库 (数据库必须位于指定目录中)
│ └── ...
@@ -35,14 +34,13 @@ PYAS/
│ ├── Yara_Rules.yrc ---------> 编译规则 (编译格式的 yara 规则)
│ └── ...
│
├── PYAS.* ---------------------> PYAS主程序(包含动画、扫描、保护等功能...)
├── PYAS.py ---------------------> PYAS主程序(包含动画、扫描、保护等功能...)
├── PYAS_Engine.py -------------> 转换数据库(用于转换剖面图和预报数据)
├── PYAS_Suffixes.py -----------> 文件后缀(包含扫描文件后缀和常用后缀)
├── PYAS_Extension.py ----------> 扩展工具包(其他开发者开发的扩展扫描器)
├── PYAS_Interface.py ----------> PyQt5界面(使用QT设计器,需与主程序搭配使用)
├── PYAS_Resource.py -----------> PyQt5资源(状态图片、图标包、按钮图标...)
├── PYAS_Language.py -----------> 翻译词典(繁体中文、简体中文、英文)
├── PYAS_Version.py ------------> 安裝信息(文件信息、版本信息、原名,...)
├── PYAS_Version.py ------------> 安裝信息(文件信息、版本信息、原名...)
└── ...
```
@@ -52,14 +50,18 @@ https://pyantivirus.wixsite.com/pyas
https://github.com/87owo/PYAS
## 开源协议
## 微软运行库
https://github.com/87owo/PYAS/blob/main/LICENSE.md
https://github.com/87owo/Microsoft_Runtime/releases
## 驱动程序
https://github.com/0sha0/PYAS_Protection
## 开源协议
https://github.com/87owo/PYAS/blob/main/LICENSE.md
## 支援系统
Windows 8.1, 10, 11 (64-bit), 内存 500MB, 存储 200MB 或更高
+19 -17
View File
@@ -1,16 +1,20 @@
# PYAS (Python 防毒軟體)
![PYAS](https://github.com/87owo/PYAS/assets/85057800/8136aaca-d388-4321-bedb-abc4fcecfa8b)
![PYAS](https://github.com/user-attachments/assets/39c273b9-c467-480a-a8b3-31714a6df3ef)
## 安裝要求
```
psutil==5.9.5
pefile==2023.2.7
requests==2.31.0
pyperclip==1.8.2
pywin32==306
PyQt5==5.15.9
pip install psutil==5.9.5
pip install pefile==2023.2.7
pip install requests==2.31.0
pip install pyperclip==1.8.2
pip install pywin32==306
pip install PyQt5==5.15.9
pip install yara-python==4.5.1
pip install numpy==2.1.1
pip install onnxruntime==1.18.1
pip install pillow==10.4.0
```
## 檔案資訊
@@ -21,11 +25,6 @@ PYAS/
│ ├── PYAS_Driver.sys -------> 驅動程式 (0sha0 為 pyas 提供的自我保護驅動程式)
│ └── ...
│
├── Exten/
│ ├── bitdefender/ ----------> 擴充套件 (bitdefender windows 控制台掃描引擎)
│ ├── pe_sieve/ -------------> 擴充套件 (pe sieve windows 控制台記憶體引擎)
│ └── ...
│
├── Model/
│ ├── PYAS_Model.json -------> 病毒資料庫 (資料庫必須位於指定目錄)
│ └── ...
@@ -35,14 +34,13 @@ PYAS/
│ ├── Yara_Rules.yrc ---------> 編譯規則 (編譯格式的 yara 規則)
│ └── ...
│
├── PYAS.* ---------------------> PYAS主程式(包含動畫、掃描、保護等功能...)
├── PYAS.py ---------------------> PYAS主程式(包含動畫、掃描、保護等功能...)
├── PYAS_Engine.py -------------> 轉換資料庫(用於轉換剖面圖和預報資料)
├── PYAS_Suffixes.py -----------> 文件後綴(包含掃描文件後綴和常用後綴)
├── PYAS_Extension.py ----------> 擴充工具包(其他開發者開發的擴充掃描器)
├── PYAS_Interface.py ----------> PyQt5介面(使用QT設計器,需與主程式搭配使用)
├── PYAS_Resource.py -----------> PyQt5資源(狀態圖片、圖示包、按鈕圖示...)
├── PYAS_Language.py -----------> 翻譯字典(繁體中文、簡體中文、英文)
├── PYAS_Version.py ------------> 安裝資訊(檔案資訊、版本資訊、原名,...)
├── PYAS_Version.py ------------> 安裝資訊(檔案資訊、版本資訊、原名...)
└── ...
```
@@ -52,14 +50,18 @@ https://pyantivirus.wixsite.com/pyas
https://github.com/87owo/PYAS
## 開源協議
## 微軟運行庫
https://github.com/87owo/PYAS/blob/main/LICENSE.md
https://github.com/87owo/Microsoft_Runtime/releases
## 驅動程式
https://github.com/0sha0/PYAS_Protection
## 開源協議
https://github.com/87owo/PYAS/blob/main/LICENSE.md
## 支援系統
Windows 8.1, 10, 11 (64-bit),記憶體 500MB, 磁碟容量 200MB 或更高