- •Введение
- •1 Реализация программного обеспечения
- •1.1 Модуль проверки подключения к интернету
- •Модуль проверки установленного по
- •Модуль проверки работоспособности межсетевого экрана
- •1.4 Модуль проверки работоспособности антивируса
- •1.5 Модуль сохранения результатов в файл
- •Заключение
- •Список использованных источников
- •Приложение а
Приложение а
Листинг А – Код программы для проверки средств безопасности на языке программирования Python
import time
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import tkinter as tk
from tkinter import ttk, messagebox
import subprocess
import psutil
import os
import socket
import requests
import threading
from datetime import datetime
class SecurityCheckerApp:
def __init__(self, root):
self.root = root
self.root.title("Проверка средств безопасности ПК")
self.root.geometry("800x600")
# Переменные для хранения результатов
self.internet_status = "Не проверено"
self.firewall_status = "Не проверено"
self.antivirus_status = "Не проверено"
self.firewall_working = "Не проверено"
self.antivirus_working = "Не проверено"
self.create_widgets()
def start_progress(self):
self.progress.start()
def stop_progress(self):
self.progress.stop()
def update_status(self, message):
self.status_label.config(text=message)
def update_results_table(self):
pass
def create_widgets(self):
notebook = ttk.Notebook(self.root)
# Вкладка проверки
check_frame = ttk.Frame(notebook)
notebook.add(check_frame, text="Проверка безопасности")
# Вкладка результатов
results_frame = ttk.Frame(notebook)
notebook.add(results_frame, text="Результаты")
notebook.pack(expand=True, fill='both')
# Наполнение вкладки проверки
self.setup_check_tab(check_frame)
# Наполнение вкладки результатов
self.setup_results_tab(results_frame)
def setup_check_tab(self, parent):
# Заголовок
title_label = ttk.Label(parent, text="Проверка средств безопасности ПК",
font=('Arial', 16, 'bold'))
title_label.pack(pady=10)
# Кнопки проверки
button_frame = ttk.Frame(parent)
button_frame.pack(pady=20)
ttk.Button(button_frame, text="Проверить подключение к Интернету",
command=self.check_internet).pack(pady=5)
ttk.Button(button_frame, text="Проверить наличие МЭ и АВ",
command=self.check_installed_software).pack(pady=5)
ttk.Button(button_frame, text="Проверить работоспособность МЭ",
command=self.check_firewall_working).pack(pady=5)
ttk.Button(button_frame, text="Проверить работоспособность АВ",
command=self.check_antivirus_working).pack(pady=5)
ttk.Button(button_frame, text="Полная проверка",
command=self.full_check).pack(pady=10)
# Прогресс-бар
self.progress = ttk.Progressbar(parent, mode='indeterminate')
self.progress.pack(fill='x', padx=20, pady=10)
# Текущий статус
self.status_label = ttk.Label(parent, text="Готов к проверке",
font=('Arial', 10))
self.status_label.pack(pady=5)
def setup_results_tab(self, parent):
# Таблица результатов
columns = ('Параметр', 'Статус', 'Время проверки')
self.results_tree = ttk.Treeview(parent, columns=columns, show='headings')
# Заголовки колонок
for col in columns:
self.results_tree.heading(col, text=col)
self.results_tree.column(col, width=200)
self.results_tree.pack(expand=True, fill='both', padx=10, pady=10)
# Кнопка экспорта
ttk.Button(parent, text="Экспорт результатов",
command=self.export_results).pack(pady=10)
def update_status(self, message):
self.status_label.config(text=message)
self.root.update()
def start_progress(self):
self.progress.start(10)
def stop_progress(self):
self.progress.stop()
def check_internet(self):
def task():
self.start_progress()
self.update_status("Проверка подключения к Интернету...")
# Проверяем несколько надежных сайтов
test_sites = [
"http://www.google.com",
"http://www.microsoft.com",
"http://www.yandex.ru",
]
internet_available = False
for site in test_sites:
try:
response = requests.get(site, timeout=5)
if response.status_code == 200:
internet_available = True
break
except:
continue # Пробуем следующий сайт
if internet_available:
self.internet_status = "Подключение есть"
else:
self.internet_status = "Нет подключения"
self.stop_progress()
self.update_status("Проверка завершена")
self.update_results_table()
threading.Thread(target=task).start()
def check_installed_software(self):
def task():
self.start_progress()
self.update_status("Поиск установленного ПО...")
# Словарь для красивого отображения имен антивирусов
antivirus_names = {
'avp': 'Kaspersky Anti-Virus',
'avpui': 'Kaspersky Anti-Virus',
'msmpeng': 'Windows Defender',
'windefend': 'Windows Defender',
'securityhealthservice': 'Windows Security',
'avast': 'Avast Antivirus',
'avg': 'AVG Antivirus',
'bdagent': 'Bitdefender',
'norton': 'Norton Antivirus',
'mcafee': 'McAfee Antivirus',
'mcshield': 'McAfee Antivirus',
'egui': 'ESET NOD32',
'ekrn': 'ESET NOD32',
'bullguard': 'BullGuard'
}
antivirus_processes = [
'avp', 'avpui', 'msmpeng', 'windefend', 'securityhealthservice',
'avast', 'avg', 'bdagent', 'norton', 'mcafee', 'mcshield',
'egui', 'ekrn', 'bullguard', 'pccntmon', 'tmcc'
]
firewall_processes = [
'cfp', 'outpost', 'pfirewall', 'vsmon', 'zonealarm'
]
# ПРОВЕРКА АНТИВИРУСА
av_found = False
av_name = ""
# 1. Сначала проверяем процессы
for proc in psutil.process_iter(['name']):
try:
proc_name = proc.info['name'].lower()
# Исключаем VPN и другие не-антивирусы
if any(vpn in proc_name for vpn in ['vpn', 'openvpn', 'wireguard']):
continue
if any(av in proc_name for av in antivirus_processes):
av_found = True
# Получаем красивое имя из словаря
for process_key, nice_name in antivirus_names.items():
if process_key in proc_name:
av_name = nice_name
break
if not av_name: # Если не нашли в словаре, используем имя процесса
av_name = proc.info['name']
break
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
# 3. Проверяем службу Windows Defender
if not av_found:
try:
result_defender = subprocess.run([
'sc', 'query', 'windefend'
], capture_output=True, text=True, timeout=10)
if 'RUNNING' in result_defender.stdout:
av_found = True
av_name = "Windows Defender"
except:
pass
if av_found:
self.antivirus_status = f"Найден ({av_name})"
else:
self.antivirus_status = "Не найден"
# ПРОВЕРКА ФАЕРВОЛА
fw_found = False
fw_name = ""
firewall_names = {
'cfp': 'Comodo Firewall',
'outpost': 'Outpost Firewall',
'vsmon': 'ZoneAlarm Firewall'
}
# 1. Проверяем процессы сторонних фаерволов
for proc in psutil.process_iter(['name']):
try:
proc_name = proc.info['name'].lower()
if any(fw in proc_name for fw in firewall_processes):
fw_found = True
# Получаем красивое имя из словаря
for process_key, nice_name in firewall_names.items():
if process_key in proc_name:
fw_name = nice_name
break
if not fw_name:
fw_name = proc.info['name']
break
except (psutil.NoSuchProcess, psutil.AccessDenied):
continue
# 2. Если не нашли процессы, проверяем Windows Firewall
if not fw_found:
try:
result = subprocess.run(
['sc', 'query', 'mpssvc'],
capture_output=True, text=True, timeout=10
)
if 'RUNNING' in result.stdout:
fw_found = True
fw_name = "Windows Firewall"
except:
pass
# 3. Дополнительная проверка через netsh
if not fw_found:
try:
result = subprocess.run(
['netsh', 'advfirewall', 'show', 'allprofiles'],
capture_output=True, text=True, timeout=10
)
if 'ON' in result.stdout or 'Вкл' in result.stdout:
fw_found = True
fw_name = "Windows Firewall"
except:
pass
if fw_found:
self.firewall_status = f"Найден ({fw_name})"
else:
self.firewall_status = "Не найден"
self.stop_progress()
self.update_status("Поиск завершен")
self.update_results_table()
threading.Thread(target=task).start()
def check_firewall_working(self):
def task():
self.start_progress()
self.update_status("Проверка эффективности МЭ...")
# Самая важная тестовая URL-адрес
test_url = "http://malware.testing.google.test/testing/malware/"
blocked = False
try:
# 1. Устанавливаем статус проверки
self.update_status(f"Проверка тестового URL...")
# 2. Выполняем HTTP-запрос с таймаутом
response = requests.get(test_url, timeout=10, verify=False)
# 3. Анализируем ответ
if response.status_code == 200:
# URL доступен - файрволл не заблокировал
status = "Файрволл не заблокировал URL"
blocked = False
elif response.status_code in [403, 407]:
# Признаки блокировки файрволлом
status = "Доступ заблокирован файрволлом"
blocked = True
else:
# Другие статусы
status = f"Пропущено (статус: {response.status_code})"
blocked = False
except requests.exceptions.ConnectionError:
# Ошибка соединения - вероятно блокировка
status = "Доступ заблокирован (ошибка соединения)"
blocked = True
except requests.exceptions.Timeout:
# Таймаут - возможная блокировка
status = "Таймаут (возможная блокировка)"
blocked = True
except requests.exceptions.HTTPError as e:
# HTTP ошибки
if e.response.status_code in [403, 407]:
status = "Доступ заблокирован файрволлом"
blocked = True
else:
status = f"HTTP ошибка: {e.response.status_code}"
blocked = False
except Exception as e:
# Другие исключения
status = f"Ошибка проверки: {str(e)}"
blocked = False
# Логируем результат
print(f"URL: {test_url} - {status}")
if blocked:
self.firewall_working = "Работает (обнаружена блокировка)"
else:
self.firewall_working = "Не работает (нет блокировки)"
self.stop_progress()
self.update_status(f"Проверка завершена: {status}")
self.update_results_table()
threading.Thread(target=task).start()
def check_antivirus_working(self):
def task():
self.start_progress()
self.update_status("Проверка работоспособности АВ...")
try:
# Создание тестового EICAR файла
eicar_test_string = r"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*"
# Получаем путь к рабочему столу
desktop_path = os.path.join(os.path.expanduser('~'), 'Desktop')
test_file_path = os.path.join(desktop_path, 'eicar_test.txt')
# Записываем тестовый файл на рабочий стол
with open(test_file_path, 'w') as f:
f.write(eicar_test_string)
# Даем время антивирусу на реакцию
import time
time.sleep(3)
# Проверяем результат
if os.path.exists(test_file_path):
try:
with open(test_file_path, 'r') as f:
content = f.read()
if content == eicar_test_string:
self.antivirus_working = "Не реагирует на угрозы"
else:
self.antivirus_working = "Работает (файл изменен)"
except PermissionError:
self.antivirus_working = "Работает (файл заблокирован)"
except Exception as e:
self.antivirus_working = f"Ошибка чтения: {str(e)}"
# Пытаемся удалить файл с рабочего стола
try:
os.remove(test_file_path)
except:
pass
else:
self.antivirus_working = "Работает (файл удален)"
except Exception as e:
self.antivirus_working = f"Ошибка проверки: {str(e)}"
self.stop_progress()
self.update_status("Проверка АВ завершена")
self.update_results_table()
threading.Thread(target=task).start()
def full_check(self):
def task():
self.check_internet()
import time
time.sleep(1)
self.check_installed_software()
time.sleep(1)
self.check_firewall_working()
time.sleep(1)
self.check_antivirus_working()
self.update_status("Полная проверка завершена")
messagebox.showinfo("Проверка завершена", "Все проверки выполнены успешно!")
threading.Thread(target=task).start()
def update_results_table(self):
# Очищаем таблицу
for item in self.results_tree.get_children():
self.results_tree.delete(item)
current_time = datetime.now().strftime("%H:%M:%S")
results = [
("Подключение к Интернету", self.internet_status, current_time),
("Наличие установленного антивируса", self.antivirus_status, current_time),
("Наличие установленного межсетевого экрана", self.firewall_status, current_time),
("Работоспособность антивируса", self.antivirus_working, current_time),
("Работоспособность межсетевого экрана", self.firewall_working, current_time)
]
for result in results:
self.results_tree.insert('', 'end', values=result)
def export_results(self):
try:
# Получаем путь к рабочему столу
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = f"security_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
full_path = os.path.join(desktop_path, filename)
with open(full_path, 'w', encoding='utf-8') as f:
f.write("Отчет о проверке средств безопасности ПК\n")
f.write("=" * 50 + "\n")
f.write(f"Время проверки: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n")
f.write("РЕЗУЛЬТАТЫ:\n")
f.write(f"1. Подключение к Интернету: {self.internet_status}\n")
f.write(f"2. Наличие антивируса: {self.antivirus_status}\n")
f.write(f"3. Наличие межсетевого экрана: {self.firewall_status}\n")
f.write(f"4. Работоспособность антивируса: {self.antivirus_working}\n")
f.write(f"5. Работоспособность МЭ: {self.firewall_working}\n")
f.write("\n" + "=" * 50 + "\n")
messagebox.showinfo("Экспорт", f"Результаты сохранены на рабочий стол:\n{filename}")
# Показываем путь к файлу в сообщении
messagebox.showinfo("Путь к файлу", f"Файл сохранен по адресу:\n{full_path}")
except Exception as e:
messagebox.showerror("Ошибка", f"Не удалось экспортировать результаты: {str(e)}")
def main():
root = tk.Tk()
app = SecurityCheckerApp(root)
root.mainloop()
if __name__ == "__main__":
main()
