Compare commits

...
50 Commits
Author SHA1 Message Date
PYDT 417b17da98 Add files via upload 2025-08-13 16:35:12 +08:00
PYDT 4ca19a4eb0 Update README_zh_CN.md 2025-08-13 16:00:20 +08:00
PYDT e834dfb7ee Update README_zh_TW.md 2025-08-13 16:00:05 +08:00
PYDT 5e1ff74fb3 Update README.md 2025-08-13 15:59:50 +08:00
PYDT 7a1d0f2ca7 Delete Engine/Model/PYAS_Model_A1.onnx 2025-08-13 15:53:33 +08:00
PYDT b305522106 Delete Engine/Model/PYAS_Model.json 2025-08-13 15:53:15 +08:00
PYDT ff3495645a Add files via upload 2025-08-13 15:52:58 +08:00
PYDT ddc000321f Add files via upload 2025-08-13 15:41:32 +08:00
PYDT fe4e6af3b9 Add files via upload 2025-08-13 15:40:43 +08:00
PYDT a1a83cc32c Add files via upload 2025-08-13 15:39:56 +08:00
PYDT e37665218b Update README_zh_CN.md 2025-08-12 17:25:31 +08:00
PYDT 2a876f4136 Update README_zh_TW.md 2025-08-12 17:20:27 +08:00
PYDT 290d8e8a64 Update README_zh_TW.md 2025-08-12 17:19:09 +08:00
PYDT 121bce529f Update README_zh_TW.md 2025-08-12 17:17:17 +08:00
PYDT 1232d98573 Update README.md 2025-08-12 17:16:46 +08:00
PYDT 208d9150b0 Update README.md 2025-08-12 17:10:23 +08:00
PYDT 351bf7725e Update README.md 2025-08-12 17:07:56 +08:00
PYDT a547776766 Add files via upload 2025-08-12 17:06:02 +08:00
PYDT 86a8d20757 Add files via upload 2025-08-11 11:26:26 +08:00
PYDT 760c420f95 Delete Plugins/Filter directory 2025-08-11 11:26:15 +08:00
PYDT 44c2edf58e Add files via upload 2025-08-10 21:14:30 +08:00
PYDT e88207c232 Update README.md 2025-08-10 05:02:16 +08:00
PYDT f6b2450fcd Update README.md 2025-08-10 04:58:10 +08:00
PYDT a124ecd3ed Update README.md 2025-08-10 04:54:52 +08:00
PYDT 34fcc3d29e Update README.md 2025-08-10 04:43:12 +08:00
PYDT 5f3011eebc Update README.md 2025-08-10 04:40:49 +08:00
PYDT d4464edb6c Update README.md 2025-08-10 04:34:13 +08:00
PYDT 1dc89a80db Update README.md 2025-08-10 04:33:27 +08:00
PYDT bd23599770 Add files via upload 2025-08-10 00:46:48 +08:00
PYDT bda6ff80da Delete PYAS.py 2025-08-10 00:42:33 +08:00
PYDT 16bee9825f Add files via upload 2025-08-10 00:41:16 +08:00
PYDT 5e4a4c4e8f Add files via upload 2025-08-09 23:50:31 +08:00
PYDT 0a03093333 Delete Plugins/Filter directory 2025-08-09 23:50:08 +08:00
PYDT 960b1d53f7 Add files via upload 2025-08-09 19:32:57 +08:00
PYDT f09dee6a52 Add files via upload 2025-08-09 19:32:08 +08:00
PYDT 301e1e56d1 Delete Plugins/Filter/PYAS_Driver.sys 2025-08-09 19:31:04 +08:00
PYDT 6b2dbd382d Add files via upload 2025-08-08 23:15:27 +08:00
PYDT e6f526c766 Update README_zh_CN.md 2025-08-06 01:09:35 +08:00
PYDT 06cca669a0 Update README_zh_CN.md 2025-08-06 01:09:18 +08:00
PYDT f89ccea208 Update README_zh_TW.md 2025-08-06 01:07:35 +08:00
PYDT 0728f2d995 Update README.md 2025-08-06 01:06:20 +08:00
PYDT c7a7a61c9a Delete PYAS_Suffixes.py 2025-08-06 00:43:52 +08:00
PYDT aca11e66a8 Delete PYAS_Language.py 2025-08-06 00:43:36 +08:00
PYDT 46c7a001c2 Delete Extens directory 2025-08-06 00:43:07 +08:00
PYDT d6aa3c50a3 Add files via upload 2025-08-06 00:42:43 +08:00
PYDT caaadc5cf3 Add files via upload 2025-08-06 00:41:52 +08:00
PYDT 14d703903c Delete Driver directory 2025-08-06 00:41:07 +08:00
PYDT 76fa14ab01 Add files via upload 2025-08-06 00:40:11 +08:00
PYDT d1afe255e5 Add files via upload 2025-05-06 17:28:11 +08:00
PYDT 8f27739331 Add files via upload 2025-04-25 17:09:33 +08:00
24 changed files with 17962 additions and 14226 deletions

No files matched your search

-34
View File
@@ -1,34 +0,0 @@
@echo off
setlocal
:: Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"
if %errorlevel% NEQ 0 goto NoAdmin
goto gotAdmin
:NoAdmin
echo You do not have administrator rights, please run this script as administrator.
pause
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs"
set "script_dir=%~dp0"
set "script_dir=%script_dir:~0,-1%"
bcdedit -debug on
bcdedit /set testsigning on
bcdedit /deletevalue {current} safeboot
powershell.exe -ExecutionPolicy Bypass -Command ^
"$endDate = (Get-Date).AddYears(100); ^
$cert = New-SelfSignedCertificate -DnsName PYAS -CertStoreLocation cert:\LocalMachine\My -Type CodeSigning -NotAfter $endDate; ^
$pwd = ConvertTo-SecureString -String 'PYAS' -Force -AsPlainText; ^
Export-PfxCertificate -Cert $cert -FilePath '%script_dir%\PYAS.pfx' -Password $pwd;"
"%script_dir%\signtool.exe" sign /f "%script_dir%\PYAS.pfx" /p PYAS "%script_dir%\PYAS_Driver.sys"
sc create PYAS_Driver type= kernel start= demand binPath= "%script_dir%\PYAS_Driver.sys"
shutdown -r -t 0
endlocal
View File
Whitespace-only changes.
Binary file not shown.
-25
View File
@@ -1,25 +0,0 @@
@echo off
setlocal
:: Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.exe" "%SYSTEMROOT%\system32\config\system"
if %errorlevel% NEQ 0 goto NoAdmin
goto gotAdmin
:NoAdmin
echo You do not have administrator rights, please run this script as administrator.
pause
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs"
sc stop PYAS_Driver
sc delete PYAS_Driver
bcdedit /set testsigning off
bcdedit -debug off
shutdown -r -t 0
endlocal
Binary file not shown.
Binary file not shown.
-11
View File
@@ -1,11 +0,0 @@
{
"Suffix": [".com", ".exe", ".dll", ".sys", ".scr", ".bat", ".cmd", ".ps1", ".vbs", ".wsf"],
"Labels": ["Pefile/White", "Script/White", "Pefile/General", "Script/General"],
"Detect": ["Pefile/General", "Script/General"],
"Resize": [224, 224, 1, "nearest"],
"Values": 95
}
Binary file not shown.
+73
View File
@@ -0,0 +1,73 @@
from PIL import Image
import numpy, pefile, os
def file_to_images(file_data, output_dir, file_name, target_size=(224, 224)):#
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')
image = image.resize(target_size, Image.Resampling.NEAREST)
image.save(os.path.join(output_dir, f"{file_name}.png"))
def check_file_type(file_path):
try:
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"]
shells = shell_section + unimportant_section + unknown_section
ftype = str(f".{file_path.split('.')[-1]}").lower()
if ftype in [".bat", ".cmd", ".ps1", ".vbs", ".wsf", ".js", ".html"]:
with open(file_path, 'rb') as f:
return [f.read()]
match_data = []
if ftype in [".com", ".exe", ".dll", ".sys", ".scr"]:
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 shells)):
if section.Characteristics & 0x00000020:
match_data.append(section.get_data())
return match_data
return False
except Exception as e:
print(e)
return False
def batch_file_to_images(input_dir, output_dir):
for root, dirs, files in os.walk(input_dir):
for file in files:
try:
file_path = os.path.join(root, file)
file_data = check_file_type(file_path)
if file_data:
for i, data in enumerate(file_data, 1):
print(i, file_path)
relative_path = os.path.relpath(root, input_dir)
output_path_dir = os.path.join(output_dir, relative_path)
if not os.path.exists(output_path_dir):
os.makedirs(output_path_dir)
file_to_images(data, output_path_dir, f"{i}_{file}")
except Exception as e:
print(e)
pass
input_directory = input('Enter the folder path: ')
output_directory = "./Image_File"
batch_file_to_images(input_directory, output_directory)
input('Conversion Complete')
+111
View File
@@ -0,0 +1,111 @@
import tensorflow as tf
import os, tf2onnx, numpy, random
from PIL import Image
from tensorflow.keras import *
Image.MAX_IMAGE_PIXELS = None
tf.keras.mixed_precision.set_global_policy('mixed_float16')
def get_file_list(directory):
file_paths, labels, class_indices = [], [], {}
for i, cls in enumerate(sorted([d for d in os.listdir(directory) if os.path.isdir(os.path.join(directory, d))])):
class_indices[cls] = i
cls_dir = os.path.join(directory, cls)
for root, _, files in os.walk(cls_dir):
for file in files:
if file.lower().endswith(('.jpg', '.jpeg', '.png', '.bmp', '.gif')):
file_paths.append(os.path.join(root, file))
labels.append(i)
return file_paths, labels, class_indices
def load_dataset(train_dir, val_dir, val_split=0.01, batch_size=128, color_mode="grayscale"):
channels = 1 if color_mode == "grayscale" else 3
if train_dir == val_dir:
file_paths, labels, class_indices = get_file_list(train_dir)
combined = list(zip(file_paths, labels))
random.shuffle(combined)
file_paths[:], labels[:] = zip(*combined)
num_val = int(val_split * len(file_paths))
train_files = file_paths[num_val:]
train_labels = labels[num_val:]
val_files = file_paths[:num_val]
val_labels = labels[:num_val]
else:
train_files, train_labels, class_indices = get_file_list(train_dir)
val_files, val_labels, _ = get_file_list(val_dir)
num_classes = len(class_indices)
def parse_fn(filename, label):
img = tf.io.read_file(filename)
img = tf.image.decode_image(img, channels=channels, expand_animations=False)
img = tf.cast(img, tf.float32) / 255.0
label = tf.one_hot(label, depth=num_classes)
return img, label
train_ds = tf.data.Dataset.from_tensor_slices((train_files, train_labels))
train_ds = train_ds.map(parse_fn, num_parallel_calls=tf.data.AUTOTUNE)
train_ds = train_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)
val_ds = tf.data.Dataset.from_tensor_slices((val_files, val_labels))
val_ds = val_ds.map(parse_fn, num_parallel_calls=tf.data.AUTOTUNE)
val_ds = val_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)
train_ds.class_indices = class_indices
return train_ds, val_ds
def gated_conv(x, strides):
c = layers.DepthwiseConv2D(3, strides=strides, padding='same', activation='gelu')(x)
g = layers.DepthwiseConv2D(3, strides=strides, padding='same', activation='sigmoid')(x)
return layers.Multiply()([c, g])
def multi_conv(x, strides):
convs = [layers.DepthwiseConv2D(kernel_size=k, strides=strides, padding='same')(x) for k in [1, 3, 5, 7]]
x = layers.Concatenate()(convs)
x = layers.BatchNormalization()(x)
return layers.Activation('gelu')(x)
def se_block(x, reduction):
filters = x.shape[-1]
s = layers.Conv2D(filters // reduction, 1, padding='same', activation='gelu')(x)
s = layers.BatchNormalization()(s)
s = layers.Conv2D(filters, 1, padding='same', activation='sigmoid')(s)
s = layers.BatchNormalization()(s)
return layers.multiply([x, s])
def build_model(input_shape, num_classes):
i = layers.Input(shape=input_shape)
x = multi_conv(i, strides=1)
x = multi_conv(x, strides=2)
x = gated_conv(x, strides=2)
x = multi_conv(x, strides=2)
x = multi_conv(x, strides=2)
x = multi_conv(x, strides=2)
x = se_block(x, reduction=2)
x = layers.GlobalAveragePooling2D()(x)
o = layers.Dense(num_classes, activation='softmax', dtype='float32')(x)
return models.Model(i, o)
def lr_scheduler(epoch, lr):
return 1e-3 * (0.7 ** epoch)
class CustomModelCheckpoint(callbacks.Callback):
def on_epoch_end(self, epoch, logs=False):
models.save_model(self.model, f"PYAS_Model_Epoch_{epoch + 1}.h5")
spec = (tf.TensorSpec((None,) + train_ds.image_shape, tf.float32),)
model_proto, _ = tf2onnx.convert.from_keras(self.model, input_signature=spec, opset=18)
with open(f"PYAS_Model_Epoch_{epoch + 1}.onnx", "wb") as f:
f.write(model_proto.SerializeToString())
train_ds, val_ds = load_dataset(r'./Image_File', r'./Image_File')
for imgs, _ in train_ds.take(1):
train_ds.image_shape = imgs.shape[1:]
break
strategy = tf.distribute.MirroredStrategy(cross_device_ops=tf.distribute.HierarchicalCopyAllReduce())
with strategy.scope():
try:
model = models.load_model('PYAS_Model_Epoch_0.h5')
print("Load model from disk")
except:
print("Creating a new model")
model = build_model(train_ds.image_shape, len(train_ds.class_indices))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_ds, epochs=30, callbacks=[CustomModelCheckpoint(), callbacks.LearningRateScheduler(lr_scheduler)], validation_data=val_ds)
input("Training complete.")
-117
View File
@@ -1,117 +0,0 @@
Windows Registry Editor Version 5.00
; Repair system restrictions
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\MMC]
; NoControlPanel
"NoControlPanel"=dword:00000000
; NoDrives
"NoDrives"=dword:00000000
; NoFileMenu
"NoFileMenu"=dword:00000000
; NoFind
"NoFind"=dword:00000000
; NoRealMode
"NoRealMode"=dword:00000000
; NoRecentDocsMenu
"NoRecentDocsMenu"=dword:00000000
; NoSetFolders
"NoSetFolders"=dword:00000000
; NoSetFolderOptions
"NoSetFolderOptions"=dword:00000000
; NoViewOnDrive
"NoViewOnDrive"=dword:00000000
; NoClose
"NoClose"=dword:00000000
; NoRun
"NoRun"=dword:00000000
; NoDesktop
"NoDesktop"=dword:00000000
; NoLogOff
"NoLogOff"=dword:00000000
; NoFolderOptions
"NoFolderOptions"=dword:00000000
; RestrictRun
"RestrictRun"=dword:00000000
; NoViewContextMenu
"NoViewContexMenu"=dword:00000000
; HideClock
"HideClock"=dword:00000000
; NoStartMenuMorePrograms
"NoStartMenuMorePrograms"=dword:00000000
; NoStartMenuMyGames
"NoStartMenuMyGames"=dword:00000000
; NoStartMenuMyMusic
"NoStartMenuMyMusic"=dword:00000000
; DisableCMD
"DisableCMD"=dword:00000000
; NoWinKeys
"NoWinKeys"=dword:00000000
; StartMenuLogOff
"StartMenuLogOff"=dword:00000000
; NoSimpleNetlDList
"NoSimpleNetlDList"=dword:00000000
; NoLowDiskSpaceChecks
"NoLowDiskSpaceChecks"=dword:00000000
; DisableLockWorkstation
"DisableLockWorkstation"=dword:00000000
; Restrict_Run
"Restrict_Run"=dword:00000000
; DisableTaskMgr
"DisableTaskMgr"=dword:00000000
; DisableRegistryTools
"DisableRegistryTools"=dword:00000000
; DisableChangePassword
"DisableChangePassword"=dword:00000000
; Wallpaper
"Wallpaper"=dword:00000000
; NoComponents
"NoComponents"=dword:00000000
; NoAddingComponents
"NoAddingComponents"=dword:00000000
; NoStartMenuPinnedList
"NoStartMenuPinnedList"=dword:00000000
; NoActiveDesktop
"NoActiveDesktop"=dword:00000000
; NoSetActiveDesktop
"NoSetActiveDesktop"=dword:00000000
; NoActiveDesktopChanges
"NoActiveDesktopChanges"=dword:00000000
; NoChangeStartMenu
"NoChangeStartMenu"=dword:00000000
; NoFavoritesMenu
"NoFavoritesMenu"=dword:00000000
; NoRecentDocsHistory
"NoRecentDocsHistory"=dword:00000000
; NoSetTaskbar
"NoSetTaskbar"=dword:00000000
; NoSMHelp
"NoSMHelp"=dword:00000000
; NoTrayContextMenu
"NoTrayContextMenu"=dword:00000000
; NoViewContextMenu
"NoViewContextMenu"=dword:00000000
; NoManageMyComputerVerb
"NoManageMyComputerVerb"=dword:00000000
; NoWindowsUpdate
"NoWindowsUpdate"=dword:00000000
; ClearRecentDocsOnExit
"ClearRecentDocsOnExit"=dword:00000000
; NoStartMenuNetworkPlaces
"NoStartMenuNetworkPlaces"=dword:00000000
; Repair Image File Execution Options
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options]
; (Delete all subkeys here if necessary)
; Repair executable file icon
[HKEY_CLASSES_ROOT\exefile\DefaultIcon]
@="%1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\exefile\DefaultIcon]
@="%1"
; Repair executable file type
[HKEY_CLASSES_ROOT\.exe]
@="exefile"
[HKEY_CLASSES_ROOT\exefile\shell\open\command]
@="\"%1\" %*"
-1
View File
@@ -1 +0,0 @@
sfc /scannow
-1
View File
@@ -1 +0,0 @@
None
+1449 -1611
View File
File diff suppressed because it is too large. Load diff
+82 -20
View File
@@ -1,10 +1,11 @@
translate_dict = {
"zh_TW": {"已开启":"已開啟","已关闭":"已關閉","On":"已開啟","Off":"已關閉"},
"zh_CN": {"已開啟":"已开启","已關閉":"已关闭","On":"已开启","Off":"已关闭",
"traditional_switch": {"开启":"開啟","关闭":"關閉","On":"開啟","Off":"關閉"},
"simplified_switch": {"開啟":"开启","關閉":"关闭","On":"开启","Off":"关闭",
"錯誤":"错误","發現":"发现","關閉":"关闭","裝置":"设备","記憶體":"内存",
"軟體":"软件","檔案":"文件","確定":"确认","設定":"设置","關於":"关于",
"總數":"总数","註冊":"注册","圖標":"图标","路徑":"路径","網路":"网络",
"位元":"字节","靈敏":"敏感","複製":"复制","開啟":"开启","資源回收桶":"资源回收桶",
"位元":"字节","靈敏":"敏感","複製":"复制","開啟":"开启","靜態":"静态",
"訊":"讯","項":"项","掃":"扫","試":"试","黃":"黄","嗎":"吗","防":"保",
"鑰":"钥","當":"当","後":"后","護":"护","導":"导","區":"区","復":"复",
"攔":"拦","請":"请","統":"统","刪":"删","進":"进","個":"个","選":"选",
@@ -17,20 +18,23 @@ translate_dict = {
"強":"强","驅":"驱","為":"为","腳":"脚","單":"单","開":"开","擴":"扩",
"惡":"恶","據":"据","庫":"库","經":"经","敗":"败","謝":"谢","別":"别",
"載":"载","誤":"误","報":"报","鏈":"链","竄":"窜","蹤":"踪","與":"与",
"異":"异","實":"实","時":"时","彈":"弹","窗":"窗","暫":"暂","訂":"订",},
"en_US": {"已開啟":"On","已關閉":"Off","已开启":"On","已关闭":"Off",",":", ",
"立即刪除":"Delete Now","安全模式":"Safe Mode","官方網站":"Website ",
"異":"异","實":"实","時":"时","彈":"弹","窗":"窗","暫":"暂","訂":"订",
"資":"资","產":"产","金":"密","離":"离","規":"规","則":"则","來":"来",
"殼":"壳","碼":"码","線":"线",},
"english_switch": {"開啟":"On","關閉":"Off","开启":"On","关闭":"Off",",":", ",
"立即刪除":"Delete Now","安全模式":"Safe Mode","官方網站":"Official Website ",
"腳本":"Script ","鏈式":"Chain ","記憶體":"Memory ","加載":"Load ",
"行為":"Behavior ","可疑":"Suspicious ","勒索":"Ransom ",
"許可條款":"License Terms ","惡意":"Malicious","可疑":"Suspicious",
"行為":"Behavior ","可疑":"Suspicious ","勒索":"Ransom ","主要":"Main ",
"許可條款":"License Terms ","惡意":"Malicious", "開發":"Developers ",
"啟用":"Enable ","禁用":"Disable ","正在初始化中":"Initializing ",
"正在掃描":"Scanning ","正在刪除":"Deleting ","正在追蹤":"Tracking ",
"最小化到":"Minimize To ","靈敏度":"Sensitivity ","正在檢查":"Checking ",
"確定要":"Sure Want To ","引擎靈敏度":"Sensitivity ","更新":"Update ",
"白色主題":"White","黃色主題":"Yellow","紅色主題":"Red","語言":"Language ",
"藍色主題":"Blue","綠色主題":"Green","自訂主題":"Custom","最新":"Latest ",
"藍色主題":"Blue","綠色主題":"Green","自訂主題":"Custom","黑色主題":"Black",
"特別感謝":"Contributors ","版本資訊":"Information","通訊":"Connect ",
"註冊表":"Registry ","退出":"Quit ","檔案":"File ","當前":"Currently ",
"註冊":"Registry ","退出":"Quit ","檔案":"File ","當前":"Currently ",
"狀態":"State ","掃描":"Scan ","工具":"Tools ","防護":"Protect ",
"失敗":"Failed ","請":"Please ","路徑":"Path ","方式":"Method ",
"需要":"Need ","病毒":"Virus ","選擇":"Select ","返回":"Back",
@@ -40,27 +44,85 @@ translate_dict = {
"裝置":"Device ","發現":"Found ","成功":"Success ","清理":"Cleanup ",
"確定":"OK","執行":"Execute ","警告":"Warning ","使用":"Use ",
"網路":"Network ","變更":"Change ","總數":"Total","結束":"End ",
"選項":"Options ","監控":"Monitor ","連接":"Connect ","可以":"To ",
"選項":"Options ","監控":"Monitor ","連接":"Connect ","可以":"Can ",
"進程":"Process ","攔截":"Block ","引導":"Boot ","刪除":"Delete ",
"分區":"Partition ","設定":"Setting ","關於":"About","模式":"Mode ",
"提高":"Improve ","安全":"Security ","顯色":"Color ","主題":"Themes ",
"風險":"Risk ","介面":"GUI ","核心":"Core ","服務":"Services ",
"提高":"Improve ","安全":"Security ","顯色":"Color ","顏色":"Color ",
"主題":"Theme ", "回收":"Collect ", "無用":"Useless ","導入":"Import ",
"風險":"Risk ","介面":"UI ","核心":"Core ","服務":"Services ",
"管理":"Manage","所有":"All ","您":"You ","取消":"Cancel ","未":"Not ",
"垃圾":"Junk ","位元":"byte ","本機":"Computer ","停止":"Stop ",
"到":"To ","白名單":"White List ","軟體":"Software ","正在":"",
"增加":"Add ","移除":"Delete ","項目":"Items ","生成":"Create ","稱":"",
"複製":"Copy ","開啟":"Open ","此":"This ","並":"And ","全盤":"Full ",
"已經在":"Already ","數據庫":"Database ","誤報":"False Positive ",
"複製":"Copy ","此":"This ","並":"And ","全盤":"Full ","最新":"Latest ",
"已存在":"Already ","數據庫":"Database ","誤報":"False Positive ",
"高":"High ","新":"New ","和":"And ","可能會":"Possible ","會":"Can ",
"日誌":"Log","已":"Has ","彈窗":"Window ","要":"To ","驅動":"Driver ",
"的":"","顯示":"","個":"","嗎":"","中":"","了":"","行":"","立即":"",
"的":"","顯示":"","個":"","嗎":"","了":"","行":"","立即":"","規則":"Rule ",
"密鑰":"Key ","檢測":"Detect ","製作":"Maker ","運行":"Running",
"擴展":"Extension ","套件":"Kit ","自動":"Auto ","上報":"Report ",
"分析":"Analysis ","自身":"Self ","其他":"Other ","配置":"Config ",
"丟失":"Lost ","網站":"Website ","不兼容":"Not Compatible ",
"丟失":"Lost ","網站":"Website ","不兼容":"Not Compatible ","列表":"List ",
"竄改":"Tamper ","第三方":"Other ","實時":"Real Time ","查看":"View ",
"指定":"Specify ","清空":"Empty ","資源回收桶":"Recycle Bin ",
"與":"With ","當":"When ","功能":"Function ","異常":"Abnormal ",
"指定":"Specify ","清空":"Empty ","資源回收桶":"Recycle Bin ", "無法":"Cannot ",
"與":"With ","當":"When ","功能":"Function ","異常":"Abnormal ", "來":"To ",
"重置":"Reset ","窗口":"Window ","暫存":"Temp ","自訂":"Custom ",
"不支持":"Not Support ","共":"Total ","秒":"Seconds ","耗時":"Takes ",
"時":""," ":" "}}
"沙箱":"Sandbox ", "虛擬":"Virtual ", "隔離":"Quarantine ", "時":"",
"建立":"Create ","環境":"Environment ","沙箱":"Sandbox ","化":"", "表":"",
"達":"Reached ", "上限":"Limit ", "區":"", "金鑰":"Key ", "產品":"Product ",
"托管":"CLR ","殼碼":"Shellcode ","線程":"Thread ","注入":"Inject ",
"前往":"Go ","檢查":"Check ","可用":"Available ","靜態":"Static ", " ":" "},
"white_switch": {
"_white": "_black",},
"red_switch": {
"235, 235, 235": "255, 235, 235",
"245, 245, 245": "255, 225, 225",
"255, 255, 255": "255, 245, 245",
"240, 240, 240": "255, 220, 220",
"250, 250, 250": "255, 210, 210",
"220, 255, 220": "255, 220, 220",
"210, 255, 210": "255, 210, 210",
"_white": "_black"
},
"yellow_switch": {
"235, 235, 235": "255, 255, 235",
"245, 245, 245": "255, 255, 225",
"255, 255, 255": "255, 255, 245",
"240, 240, 240": "255, 255, 220",
"250, 250, 250": "255, 255, 210",
"220, 255, 220": "255, 255, 220",
"210, 255, 210": "255, 255, 210",
"_white": "_black"
},
"green_switch": {
"235, 235, 235": "235, 255, 235",
"245, 245, 245": "225, 255, 225",
"255, 255, 255": "245, 255, 245",
"240, 240, 240": "220, 255, 220",
"250, 250, 250": "210, 255, 210",
"_white": "_black"
},
"blue_switch": {
"235, 235, 235": "235, 235, 255",
"245, 245, 245": "225, 225, 255",
"255, 255, 255": "245, 245, 255",
"240, 240, 240": "220, 220, 255",
"250, 250, 250": "210, 210, 255",
"220, 255, 220": "220, 220, 255",
"210, 255, 210": "210, 210, 255",
"_white": "_black"
},
"black_switch": {
"255, 255, 255": "55, 55, 55",
"245, 245, 245": "75, 75, 75",
"235, 235, 235": "65, 65, 65",
"240, 240, 240": "80, 80, 80",
"250, 250, 250": "90, 90, 90",
"220, 255, 220": "80, 80, 80",
"210, 255, 210": "90, 90, 90",
"0, 0, 0": "255, 255, 255",
"_black": "_white"
}
}
+121 -125
View File
@@ -1,154 +1,150 @@
import os, sys, time, json, yara, numpy
import chardet, pefile, onnxruntime
import os, yara, numpy, locale, pefile, onnxruntime
from PIL import Image
class YRScan:
class rule_scanner:
def __init__(self):
self.rules = {}
self.network = []
def load_rules(self, file_path):
try:
ftype = os.path.splitext(file_path)[-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 Exception as e:
print(e)
def load_path(self, path):
for root, _, files in os.walk(path):
for file in files:
self.load_file(os.path.join(root, file))
def yr_scan(self, file_path):
def load_file(self, file):
ext = os.path.splitext(file)[1].lower()
try:
if isinstance(file_path, str):
with open(file_path, "rb") as f:
file_path = f.read()
for name, rules in self.rules.items():
matchs_rules = rules.match(data=file_path)
if matchs_rules:
label = str(matchs_rules[0]).split("_")[0]
level = str(matchs_rules[0]).split("_")[-1]
if ext in ('.yara', '.yar'):
self.rules[file] = yara.compile(file)
elif ext in ('.yc', '.yrc'):
self.rules[file] = yara.load(file)
elif ext in ('.ip', '.txt'):
with open(file, "r", encoding="utf-8", errors="ignore") as f:
self.network.extend(line.strip() for line in f if line.strip())
except Exception:
return False
def yara_scan(self, file_path):
try:
data = open(file_path, "rb").read() if isinstance(file_path, str) else file_path
for rules in self.rules.values():
matches = rules.match(data=data)
if matches:
rule_name = str(matches[0])
label = rule_name.split("_")[0]
level = rule_name.split("_")[-1]
return f"Rules/{label}", level
return False, False
except Exception as e:
except Exception:
return False, False
class DLScan:
class model_scanner:
SHELLS = {
"0","1","2","3","4","5","6","7","8","9","cry","tvm","dec","enc","vmp","upx","aes","lzma","press","pack",
"enigma","protect","secur","asmstub","base","bss","clr_uef","cursors","transit","trs_age","engine","fio",
"fothk","h~;","icapsec","malloc_h","miniex","mssmixer","ndr64","nsys_wr","obr","wow","wow64svc","wpp_sf",
"pad","pgae","poolmi","proxy","qihoo","retpol","uedbg","tracesup","rwexec","rygs","s:@","sanontcp","segm",
"test","res","wisevec","viahwaes","orpc","nep","ace","extjmp","no_bbt","data","page","hexpthk"}
def __init__(self):
self.models = {}
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}
self.suffix = {".com", ".exe", ".dll", ".sys", ".scr", ".bat", ".cmd", ".ps1", ".vbs", ".wsf"}
self.labels = ["Pefile/White", "Script/White", "Pefile/General", "Script/General"]
self.detect = {"Pefile/General", "Script/General"}
self.resize = (224, 224)
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_path(self, path):
for root, _, files in os.walk(path):
for file in files:
self.load_file(os.path.join(root, file))
def load_model(self, file_path):
def load_file(self, file):
if file.lower().endswith('.onnx'):
try:
self.models[file] = onnxruntime.InferenceSession(file)
except Exception:
return False
def is_valid_suffix(self, file_path):
return os.path.splitext(file_path)[-1].lower() in self.suffix
def model_scan(self, file_path):
try:
ftype = os.path.splitext(file_path)[-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.values = self.class_names['Values']
self.resize = self.class_names['Resize']
self.suffix = self.class_names['Suffix']
except Exception as e:
pass
if not self.models or not self.is_valid_suffix(file_path):
return False, False
def dl_scan(self, file_path):
try:
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
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)
model = next(iter(self.models.values()))
shape = model.get_inputs()[0].shape
channels = shape[-1] if shape[-1] in (1, 3) else (shape[1] if shape[1] in (1, 3) else 1)
file_sections = self.get_type(file_path)
if not file_sections:
return False, False
batch_images = [self.preprocess_image(data, self.resize, channels) for data in file_sections.values()]
arr = numpy.stack([numpy.asarray(img).astype('float32') / 255.0 for img in batch_images])
if arr.ndim == 3:
arr = arr[..., None]
if shape[-1] in (1, 3):
model_input = arr
elif shape[1] in (1, 3):
model_input = arr.transpose(0, 3, 1, 2)
else:
return False, False
input_name = model.get_inputs()[0].name
predictions = model.run(None, {input_name: model_input})[0]
label_scores = {label: [] for label in self.labels}
for pre_answers in predictions:
for k, score in enumerate(pre_answers):
label_scores[self.labels[k]].append(score)
label_percentage = {label: (sum(scores)/len(scores))*100 for label, scores in label_scores.items() if scores}
if not label_percentage:
return False, False
best_label, best_conf = max(label_percentage.items(), key=lambda x: x[1])
if best_label in self.detect:
return best_label, int(best_conf)
return False, False
except Exception as e:
except Exception:
return False, False
def preprocess_image(self, file_data, target_size):
width, height, channels, interpolation = target_size
def preprocess_image(self, file_data, size, channels=1):
width, height = 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
arr = numpy.frombuffer(file_data, dtype=numpy.uint8)
img = numpy.zeros(wah*wah*channels, dtype=numpy.uint8)
img[:len(file_data)] = arr
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)
image = Image.fromarray(img.reshape((wah, wah)), 'L')
else:
image = Image.fromarray(img.reshape((wah, wah, channels)), 'RGB')
return image.resize((width, height), Image.Resampling.NEAREST)
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:
def is_text_file(self, content, sample_size=1024):
raw = content[:sample_size]
if not raw:
return False
text_char = set(range(32, 127)) | {9, 10, 13}
nontext = sum(b not in text_char for b in raw)
return nontext / len(raw) < 0.15
def get_type(self, file_path):
match_data = {}
ftype = os.path.splitext(file_path)[-1].lower()
if ftype in self.suffix:
try:
with pefile.PE(file_path, fast_load=True) as pe:
for section in pe.sections:
name = section.Name.rstrip(b'\x00').decode('latin1')
if (section.Characteristics & 0x00000020 and not
any(s in name.lower() for s in self.shells)):
print(name)
match_data[name] = section.get_data()
except:
with open(file_path, 'rb') as f:
file_content = f.read()
if self.is_text_file(file_content, 1024):
match_data[ftype] = file_content
if not self.is_valid_suffix(file_path):
return match_data
try:
with pefile.PE(file_path, fast_load=True) as pe:
sec = pe.OPTIONAL_HEADER.DATA_DIRECTORY[pefile.DIRECTORY_ENTRY['IMAGE_DIRECTORY_ENTRY_SECURITY']]
if bool(sec.VirtualAddress and sec.Size):
return {}
for section in pe.sections:
name = section.Name.rstrip(b'\x00').decode('latin1').lower()
if (section.Characteristics & 0x00000020) and name not in self.SHELLS:
match_data[name] = section.get_data()
except pefile.PEFormatError:
with open(file_path, 'rb') as f:
file_content = f.read()
if self.is_text_file(file_content):
match_data[os.path.splitext(file_path)[-1].lower()] = file_content
return match_data
+1538 -2136
View File
File diff suppressed because it is too large. Load diff
+14454 -10001
View File
File diff suppressed because it is too large. Load diff
-10
View File
@@ -1,10 +0,0 @@
file_types = [
".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",
".jpg",".jpeg",".png",".webp",".gif",
".mp3",".wav",".aac",".ogg",".flac",
".mp4",".avi",".mov",".wmv",".mkv",
".aux",".cur",".mui",".ttf",".efi"]
+1 -1
View File
@@ -2,7 +2,7 @@ import pyinstaller_versionfile
pyinstaller_versionfile.create_versionfile(
output_file="versionfile.txt",
version='3.3.0',
version='3.3.3',
company_name="PYAS Security",
file_description="Python Antivirus Software",
internal_name="PYAS",
Binary file not shown.
+40 -44
View File
@@ -1,76 +1,72 @@
# PYAS (Python Antivirus Software)
# PYAS
Python antivirus software uses deep learning and behavioral monitoring to block threats!
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## Readme Language
English : https://github.com/87owo/PYAS/blob/main/README.md
繁體中文 : https://github.com/87owo/PYAS/blob/main/README_zh_TW.md
简体中文 : https://github.com/87owo/PYAS/blob/main/README_zh_CN.md
## Requirements
Python 3.10 is recommended. Other Python versions may require different pip commands.
```
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install numpy==1.26.4
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
pip install Pillow==11.0.0
pip install pyperclip==1.9.0
pip install PySide6==6.9.1
pip install requests==2.32.4
pip install yara-python==4.5.4
```
## File Information
The following lists the storage locations of all relevant code and other related documents.
```
PYAS/
├── Driver/ (Protect driver and Microsoft runtime)
│ └── ...
├── Engine/
│ ├── Models/ # Directory for ONNX AI models
│ └── Rules/ # Directory for YARA and network rules
│
├── Engine/ (Deep learn model and Yara database)
│ └── ...
├── Plugins/
│ └── Filter/ # Windows kernel driver for security protection
│
├── Exten/ (Exten tools and System repair tools)
│ └── ...
│
├── PYAS.py (Main PYAS program with qtui interaction and protect function)
├── PYAS_Engine.py (Deep learning predict and yara rules file scanner)
├── PYAS_Suffixes.py (including scan file suffixes and common suffixes)
├── PYAS_Interface.py (Qt designer ui, must be matched with the main program)
├── PYAS_Resource.py (status pictures, icon packages, and button icons)
├── PYAS_Language.py (Traditional Chinese, Simplified Chinese and English)
├── PYAS_Version.py (file information, version information, original name)
└── ...
├── PYAS.py # Main application and GUI interface
├── PYAS_Config.py # Configuration handling and global parameters
├── PYAS_Engine.py # YARA and ONNX Scanning engine
├── PYAS_Interface.py # User interface definitions and widget logic
├── PYAS_Resource.py # Static picture resource management
├── PYAS_Version.py # Packaging and version info
└── ... # Other supplementary folders and files
```
## Official Website
## Packaged Releases
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
## MIT license
https://github.com/87owo/PYAS/blob/main/LICENSE.md
Packaged Releases Download: https://github.com/87owo/PYAS/releases
## Support System
Windows 8.1, 10, 11 (64-bit), Ram 500MB, Rom 200MB or higher
| Config | Permissions | System version | Available memory | Available storage |
|-----------|---------------|----------------|------------------|-------------------|
| Minimum | Administrator | Windows 10 | 200MB | 100MB |
| Recommend | Administrator | Windows 10 | 300MB | 200MB |
| Optimal | Administrator | Windows 11 | 500MB | 200MB |
Other systems may experience software malfunctions or crash
## Official Website
## Special Thanks
Official Website : https://pyantivirus.wixsite.com/pyas
Wix, mtkiao129, 0sha0, AV-T Team of LisectGroup
Open Source Website : https://github.com/87owo/PYAS
Copyright© 2020~2025 PYAS Security By 87owo
## Project License
https://github.com/87owo/PYAS/blob/main/LICENSE.md
+47 -45
View File
@@ -1,70 +1,72 @@
# PYAS (Python 杀毒软件)
# PYAS
以 Python 开发的杀毒软件,结合深度学习与行为监控来阻挡威胁!
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## 安装要求
## 说明语言
English : https://github.com/87owo/PYAS/blob/main/README.md
繁體中文 : https://github.com/87owo/PYAS/blob/main/README_zh_TW.md
简体中文 : https://github.com/87owo/PYAS/blob/main/README_zh_CN.md
## 安装需求
建议使用 Python 3.10。其他版本的 Python 可能需要不同的 pip 指令。
```
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install numpy==1.26.4
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
pip install Pillow==11.0.0
pip install pyperclip==1.9.0
pip install PySide6==6.9.1
pip install requests==2.32.4
pip install yara-python==4.5.4
```
## 文件信息
## 文件讯息
以下列出所有相关代码与文件的存放位置。
```
PYAS/
├── Driver/ (驱动保护和微软运行库)
│ └── ...
├── Engine/
│ ├── Models/ # ONNX 深度学习模型目录
│ └── Rules/ # YARA 与网络规则目录
│
├── Engine/ (深度学习和规则数据库)
│ └── ...
├── Plugins/
│ └── Filter/ # 用于安全防护的 Windows 核心驱动
│
├── Exten/ (扩展功能与系统修复工具)
│ └── ...
│
├── PYAS.py (PYAS主程序含界面交互与保护功能)
├── PYAS_Engine.py (深度学习预测和规则扫描器)
├── PYAS_Suffixes.py (获取扫描或事件文件的后缀)
├── PYAS_Interface.py (搭配主程序的Qt设计介面)
├── PYAS_Resource.py (状态图片和图标和按钮图片)
├── PYAS_Language.py (繁体中文和简体中文和英文翻译)
├── PYAS_Version.py (版本和讯息名称和打包文件名)
└── ...
├── PYAS.py # 主程式与图形界面 (GUI)
├── PYAS_Config.py # 组态处理与全域参数
├── PYAS_Engine.py # YARA 与 ONNX 扫描引擎
├── PYAS_Interface.py # 使用者介面定义与元件逻辑
├── PYAS_Resource.py # 静态图片资源管理
├── PYAS_Version.py # 打包与版本资讯
└── ... # 其他补充文件夹与文件
```
## 官方网页
## 安装版本
https://pyantivirus.wixsite.com/pyas
打包发行版下载:https://github.com/87owo/PYAS/releases
https://github.com/87owo/PYAS
## 系统需求
## 微软运行库
| 配置需求 | 权限需求 | 系统需求 | 可用內存 | 可用储存空间 |
| ---- | ------- | ----------- | ----- | ------ |
| 最低 | 系统管理员 | Windows 10 | 200MB | 100MB |
| 建议 | 系统管理员 | Windows 10 | 300MB | 200MB |
| 最佳 | 系统管理员 | Windows 11 | 500MB | 200MB |
https://github.com/87owo/Microsoft_Runtime/releases
## 官方网站
## 驱动程序
官方网站 : https://pyantivirus.wixsite.com/pyas
https://github.com/0sha0/PYAS_Protection
开源网站 : https://github.com/87owo/PYAS
## 开源协议
## 授权条款
https://github.com/87owo/PYAS/blob/main/LICENSE.md
## 支援系统
Windows 8.1, 10, 11 (64-bit), 内存 500MB, 存储 200MB 或更高
其他系统或版本可能会遇到软体功能故障或程序崩溃
## 特别感谢
Wix, mtkiao129, 0sha0, AV-T Team of LisectGroup
Copyright© 2020~2025 PYAS Security By 87owo
+46 -44
View File
@@ -1,70 +1,72 @@
# PYAS (Python 防毒軟體)
# PYAS
以 Python 開發的防毒軟體,結合深度學習與行為監控來阻擋威脅!
![PYAS_UI](https://github.com/user-attachments/assets/68765836-7272-482f-b8cd-d8ba728d88ab)
## 安裝要求
## 說明語言
English : https://github.com/87owo/PYAS/blob/main/README.md
繁體中文 : https://github.com/87owo/PYAS/blob/main/README_zh_TW.md
简体中文 : https://github.com/87owo/PYAS/blob/main/README_zh_CN.md
## 安裝需求
建議使用 Python 3.10。其他版本的 Python 可能需要不同的 pip 指令。
```
pip install chardet==5.2.0
pip install numpy==1.26.3
pip install numpy==1.26.4
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
pip install Pillow==11.0.0
pip install pyperclip==1.9.0
pip install PySide6==6.9.1
pip install requests==2.32.4
pip install yara-python==4.5.4
```
## 檔案資訊
以下列出所有相關程式碼與文件的存放位置。
```
PYAS/
├── Driver/ (驅動防護和微軟運行庫)
│ └── ...
├── Engine/
│ ├── Models/ # ONNX 深度學習模型目錄
│ └── Rules/ # YARA 與網路規則目錄
│
├── Engine/ (深度學習和規則數據庫)
│ └── ...
├── Plugins/
│ └── Filter/ # 用於安全防護的 Windows 核心驅動程式
│
├── Exten/ (擴展功能與系統修復工具)
│ └── ...
│
├── PYAS.py (PYAS主程序含介面交互與防護功能)
├── PYAS_Engine.py (深度學習預測和規則掃描器)
├── PYAS_Suffixes.py (獲取掃描或事件檔案的副檔名)
├── PYAS_Interface.py (搭配主程序的Qt設計介面)
├── PYAS_Resource.py (狀態圖片圖標和按鈕圖片)
├── PYAS_Language.py (繁體中文和簡體中文和英文翻譯)
├── PYAS_Version.py (檔案版本和訊息名稱和打包檔名)
└── ...
├── PYAS.py # 主程式與圖形介面 (GUI)
├── PYAS_Config.py # 組態處理與全域參數
├── PYAS_Engine.py # YARA 與 ONNX 掃描引擎
├── PYAS_Interface.py # 使用者介面定義與元件邏輯
├── PYAS_Resource.py # 靜態圖片資源管理
├── PYAS_Version.py # 打包與版本資訊
└── ... # 其他補充資料夾與檔案
```
## 官方網頁
## 安裝版本
https://pyantivirus.wixsite.com/pyas
打包發行版下載:https://github.com/87owo/PYAS/releases
https://github.com/87owo/PYAS
## 系統需求
## 微軟運行庫
| 配置需求 | 權限需求 | 系統需求 | 可用記憶體 | 可用儲存空間 |
| ---- | ------- | ----------- | ----- | ------ |
| 最低 | 系統管理員 | Windows 10 | 200MB | 100MB |
| 建議 | 系統管理員 | Windows 10 | 300MB | 200MB |
| 最佳 | 系統管理員 | Windows 11 | 500MB | 200MB |
https://github.com/87owo/Microsoft_Runtime/releases
## 官方網站
## 驅動程式
官方網站 : https://pyantivirus.wixsite.com/pyas
https://github.com/0sha0/PYAS_Protection
開源網站 : https://github.com/87owo/PYAS
## 開源協議
## 授權條款
https://github.com/87owo/PYAS/blob/main/LICENSE.md
## 支援系統
Windows 8.1, 10, 11 (64-bit),記憶體 500MB, 磁碟容量 200MB 或更高
其他系統或版本可能會遇到軟體功能故障或程序崩潰
## 特別感謝
Wix, mtkiao129, 0sha0, AV-T Team of LisectGroup
Copyright© 2020~2025 PYAS Security By 87owo