MiniAV. Или создай антивирус сам!
Всем привет! В этой книге мы разберём создание антивируса с нуля (и до pro-уровня). Начнём с определений. Антивирус — это программа, предназначенная для защиты компьютера или другого устройства от вредоносного программного обеспечения (вирусов, троянов, шпионских программ и т. п.)
Теперь разберём специфику работы этих программ. Антивирусы разделяют на несколько категорий: сигнатурные, динамические, на основе ИИ, и смешанные.
Я планирую разобрать в этой книге создание смешанного антивируса, но без использования ИИ.
Для начала определимся из структурой проекта:

Глава 1. Мониторинг системы
Антивирус должен прослушивать систему и проверять процессы на поведение малвари.
Для начала создадим папку core/ а в ней - файл
Для работы антивируса нам необходимы такие библиотеки как: os (для работы с системой), psutil, pefile (pe-анализ), datetime и time. Устанавливаем и импортируем.
Создадим функцию monitor_processes, именно она будет мониторить нашу систему. Определимся с работой функции: функция бесконечно опрашивает список процессов (psutil) и реагирует, если появляется новый PID, которого не было в предыдущем цикле.
PID (идентификатор процесса) — это числовой код, который операционная система назначает каждому активному процессу. Он необходим для эффективного управления процессами и мониторинга их состояния.
Так что поехали! (я делал скрины от начала строки, так что пишите так как есть, чтобы не вылетало ошибок, весь проект вы сможете посмотреть на github по этой ссылке: )



Мы научились извлекать процесс и получать путь от приложения которое его запускает, теперь мы должны проверить это приложение на запуск из нестандартных директорий. Для этого создадим ещё одну функцию:

Тут идёт проверка на присутствие пути (мы позже в неё передадим exe_path), далее (если есть путь) приводим его к нормальному формату и в нижний регистр.
А в конце проверим наш путь на запуск с нестандартных дерикторий.
Теперь давайте создадим сам список нестандартных дерикторий:
А также импортируем os, чтобы убрать подчёркивание. А, забыл, мы же должны создать функцию для определения имени пользователя:

Возвращаемся к pid:

Проверяем:
Ну-у приступим к созданию базы данных. Назовём её hash_db.txt (в корневой папке) в который внесём пару хешей (по желанию можно добавить)
Здесь каждому хешу соответствует определённое значение: либо SAFE (не малварь), либо MALWARE (собствено малварь)
А теперь сама функция, которую мы вызываем для проверки файла на хеши малвари - check_hash_in_db:

Функции кидайте на верх, чтобы красивей было😉 get_sha256 тоже нужно создать:

Конечно эти функции (get_sha256 и check_hash_in_db) можно засунуть в отдельный файл... Что мы и сделаем.
В utils создадим новый файл а в него закидываем функции про которые мы говорили. А в process_monitor просто их импортируем из этого файла - from utils.hash_tools import get_sha256, check_hash_in_db. А, ну и ещё hashlib импортируйте.
Теперь создадим ещё один файл для вывода логов:

А теперь выведем логи:

Здесь мы выводим имя файла и его путь, а потом подписан он или нет, хеш выводим и метку потенциальной опасности.
А теперь проверка подписи, про которую мы говорили здесь:

Функцию для проверки мы создадим в файле signature_checker, который положим в utils/

Здесь нам пригодится библиотека subprocess, с помощью которой мы реализуем запуск стороней программы (она как раз и будет проводить анализ файла на подпись). Скачайте её здесь: и закиньте в корень проекта.
Перейдём к разбору функции:

Здесь:
Запускаем внешнюю программу

Ну-у а тут читаем стандартный вывод и убираем лишние пробелы/переводы строк. (output)
Далее, если в выводе присутствует слово Signed — считаем, что файл подписан.
И, на конец, обработка ошибок: если не найден, файл не существует, или произошла ошибка — функция просто вернёт False, считая, что файл не подписан.
А теперь исключения:

И на самый конец передадим в seen сам current, и дадим программе немного отдохнуть - (2)

А теперь запустим нашу программу, для этого мы создадим ещё один файл - main в корневой папке проекта и впишем туда вот это (конечно можно всё сделать и в одном файле... ну, так пожалуй будет корректней с точки зрения питона, да и запускать мы будем ещё один процесс, так что main нам ещё пригодится...)

Импортируем из core нашу функцию мониторинга и запускаем её при запуске main. Вывод должен быть примерно таким:

Незнаю почему, но мой yandex он почему-то всегда принимает за вирус... И смотрите, он не подписан... Интересно, что они там внутри накодили?!
Фух... мы уже далеко зашли:) Давайте подведём этоги первой главы: Мы научились мониторить и находить подозрителыные процессы, проверять подпись.