|
import hashlib |
|
import requests |
|
import tkinter as tk |
|
from tkinter import filedialog, messagebox, ttk |
|
|
|
|
|
MD5_HASHES_URL = "https://virusshare.com/hashfiles/VirusShare_00000.md5" |
|
|
|
def calculate_file_hash(filepath, algorithm="md5"): |
|
"""Вычисляет хеш файла (по умолчанию MD5).""" |
|
hasher = hashlib.new(algorithm) |
|
with open(filepath, 'rb') as file: |
|
while True: |
|
chunk = file.read(4096) |
|
if not chunk: |
|
break |
|
hasher.update(chunk) |
|
return hasher.hexdigest() |
|
|
|
def load_virus_hashes_from_url(url): |
|
"""Загружает хеши вирусов из файла по URL.""" |
|
try: |
|
response = requests.get(url) |
|
response.raise_for_status() |
|
hashes = set() |
|
for line in response.text.splitlines(): |
|
hashes.add(line.strip().split()[0].lower()) |
|
return hashes |
|
except requests.exceptions.RequestException as e: |
|
messagebox.showerror("Ошибка", f"Ошибка при загрузке хешей: {e}") |
|
return set() |
|
|
|
def scan_file(filepath, virus_hashes): |
|
"""Сканирует файл, сравнивая его хеш с хешами в базе данных.""" |
|
file_hash = calculate_file_hash(filepath).lower() |
|
if file_hash in virus_hashes: |
|
return f"Угроза обнаружена! Файл: {filepath}\nMD5 хеш совпадает с известным вирусом." |
|
else: |
|
return f"Файл чист: {filepath}" |
|
|
|
def browse_file(): |
|
"""Открывает диалоговое окно выбора файла.""" |
|
filepath = filedialog.askopenfilename() |
|
if filepath: |
|
file_entry.delete(0, tk.END) |
|
file_entry.insert(0, filepath) |
|
|
|
def start_scan(): |
|
"""Запускает сканирование файла.""" |
|
filepath = file_entry.get() |
|
if filepath: |
|
result = scan_file(filepath, virus_hashes) |
|
result_text.config(state=tk.NORMAL) |
|
result_text.delete(1.0, tk.END) |
|
result_text.insert(tk.END, result) |
|
result_text.config(state=tk.DISABLED) |
|
|
|
if "Угроза обнаружена" in result: |
|
messagebox.showwarning("Внимание!", result) |
|
else: |
|
messagebox.showinfo("Результат сканирования", result) |
|
else: |
|
messagebox.showerror("Ошибка", "Выберите файл для сканирования.") |
|
|
|
|
|
virus_hashes = load_virus_hashes_from_url(MD5_HASHES_URL) |
|
if not virus_hashes: |
|
messagebox.showerror("Ошибка", "Не удалось загрузить хеши вирусов. Программа будет закрыта.") |
|
root.quit() |
|
exit() |
|
|
|
|
|
root = tk.Tk() |
|
root.title("Мини-антивирус") |
|
|
|
|
|
file_label = tk.Label(root, text="Выберите файл для сканирования:") |
|
file_label.grid(row=0, column=0, padx=5, pady=5, sticky="w") |
|
|
|
file_entry = tk.Entry(root, width=50) |
|
file_entry.grid(row=0, column=1, padx=5, pady=5) |
|
|
|
browse_button = tk.Button(root, text="Обзор", command=browse_file) |
|
browse_button.grid(row=0, column=2, padx=5, pady=5) |
|
|
|
scan_button = tk.Button(root, text="Сканировать", command=start_scan) |
|
scan_button.grid(row=1, column=0, columnspan=3, pady=10) |
|
|
|
result_text = tk.Text(root, wrap=tk.WORD, width=60, height=10) |
|
result_text.grid(row=2, column=0, columnspan=3, padx=5, pady=5) |
|
result_text.config(state=tk.DISABLED) |
|
|
|
|
|
root.mainloop() |