File size: 3,904 Bytes
2f848a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import hashlib
import requests
import tkinter as tk
from tkinter import filedialog, messagebox, ttk

# Ссылка на файл с хешами MD5
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()  # Проверка на ошибки HTTP
        hashes = set()
        for line in response.text.splitlines():
            hashes.add(line.strip().split()[0].lower())  # Берем только MD5 хеш и приводим к нижнему регистру
        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()