Последний год я работал над реализацией вирусного сканера для одной антивирусной как нестранно компании.
Пост являет собой выжимку приобретенных знаний, и повествует хабрасообществу о внутреннем устройстве как нестранно антивирусного сканера.
Сканирующий движок или сканер — это фундамент антивирусного пакета. Являет собой бэк-энд антивируса и, как правило представлен в виде dll, так как сканер используется сразу несколькими программами из пакета.
Графическая оболочка в этом случае — лишь красивая обертка для отображения результатов движка. Всю полезную работу, делает движок в бэк-енде.
Локации вирусного ПО
Из названия понятно, что движок используется для сканирования всех возможных локаций вредоносного ПО, а именно:
- Сканирование произвольных файлов и папок, вплоть до целых дисков.
- Сканирование памяти. Сканируются все загруженные в память процессы и их dll.
- Сканирование загрузочных записей дисков (Master Boot Records — MBR).
- Сканирование системы на предмет следов вредоносного ПО. Проверка системных папок вроде %APPDATA%, %WINDIR% на предмет определенных файлов и папок. Сканирование реестра, также на предмет следов в автозагрузке и настройках.
Виды сканирования.
Сканирование делиться на два основных вида: сигнатурный и эвристический.
Сканирование на основе сигнатур.
Другое название — хэш-скан (hash scan). Сканер проверяет файлы путем сравнения сигнатур файлов со словарем.
Обычно сигнатурой антивируса является MD5-хэш (16 байт) сгенерированный на основе тела известного вируса.
Таким образом, файл считается зараженным, если его хэш найден в базе сигнатур. Для локализации выявления вредоноса, хэш может вычисляться только для exe-файлов на основе PE-заголовка.
Такой вид сканирования позволяет определить вид атаки с высокой долей вероятности, без ложных срабатываний (чем грешит эвристическое сканирование).
К недостаткам хэш-скана относят неспособность выявить новые вирусы, которые отсутствуют в базе. А также беззащитность перед полиморфными или шифрующимися вирусами, в связи с чем требуются регулярные обновления базы сигнатур.
Также слабым местом хэш-скана является скорость проверки. Если бы не закон Мура, ни один современный компьютер уже не смог бы закончить сканирование с такой массой сигнатур в разумное время.
Эвристическое сканирование
Метод, в основе которого положено выявление вируса на основе заранее известных характеристик (эвристик). Например, для выявления загрузочного вируса прописавшегося в MBR, антивирус может считать загрузочную запись двумя путями: функцией WinAPI ReadFile, и с использованием драйвера прямого доступа к диску (direct disk access — DDA driver). А затем сравнить оба буфера. Если буферы различны, то с высокой долей вероятности
можно сказать, что мало того что вирус загрузочный, он еще и подменяет вызовы WinAPI.
Что для руткитов — обычная практика.
Другим примером эвристического скана, может быть поиск следов вируса в реестре и системных директориях. Как правило вирусы создают определенный набор файлов, и/или записей в реестре, по которым можно их выявить.
Перечисленные выше типы локаций вредоносного ПО, а именно сканирование следов, сканирование cookies и проверка загрузочных записей диска, также подпадают под вид эвристического сканирования.
Компоненты и вспомогательные модули сканера
Драйвер прямого доступа к диску
Необходим для обхода руткитов. В зараженной системе, руткиты используются
для заметания следов своего присутствия. Лучшим способом для этого является подмена вызовов API-функций.
В частности для работы с файлами: CreateFile, ReadFile итд. Когда антивирусная программа сканирует систему,
вызывая эти функции, то руткит может возвращать FALSE, когда такой вызов относится к нему. Чтобы обойти это,
сканер содержит в себе модуль непосредственного посекторного считывания с диска, без использования WinAPI.
Черно-Белые списки
Служат для фильтрации обнаружений, которые на самом деле не являются зловредами. Таким образом, антивирус не предупреждает об опасности, в случае ложного срабатывания.
Современные антивирусы, хранят базу в среднем от 5 млн. сигнатур. Причем довольно часто, для одного вируса, может существовать с десяток сигнатур. Возможная ситуация, что из нескольких тысяч системных файлов, найдется подходящий под сигнатуру файл. А это грозит тем, что антивирус удалит его, или переместит в карантин, что может привести к отказу системы вовсе.
Минимизировать ложные срабатывания — главный приоритет любой антивирусной компании.
Чтобы пройти самый престижный антивирусный тест — virus bulletin, антивирус должен показать 100% результат обнаружения, при этом не выдав единого ложного срабатывания.
Белый список — содержит список файлов, которые не вредят системе, но так или иначе обнаруживаются сканером.
Черный список — содержит список вирусов, которым мы доверяем (также не наносят вреда системе).
Распаковщики, дешифровшики
Чтобы достичь приемлемого уровня обнаружения вируса, сканер должен отрабатывать exe-шники, зашифрованные exe-пакером (Например UPX). Тогда перед вычислением хэша, сканер обнаруживает, что файл зашифрован и сначала обращается к дешифровщику, а затем уже на этой основе, вычисляется хэш и сравнивает с имеющимся в базе.
Второй вид архивов — это всем известные zip, rar, 7z итд. Антивирус также должен уметь распаковывать эти архивы, и сканировать содержимое.
Третий вид — это распаковка NTFS ADS (NTFS Alternative Data Streams). В файловой системе NTFS, исполняемый файл может быть замаскирован под обычный, например текстовый. Альтернативный поток этого файла, будет ссылаться непосредственно на вирус.
Use-cases
Антивирусное ПО использует движок не только при полном сканировании системы, но и в таких случаях:
- Интернет защита. А именно сканирование cookies'ов браузеров и Flash Player'a.
Например Chrome хранит кукисы в папке %localappdata%\Google\Chrome\User Data\Default\, Firefox в %appdata%\Mozilla\Firefox\Profiles.
Для Internet Explorer в %USERPROFILE%AppDataRoamingMicrosoftWindowsCookies.
Таким образом извлекая доменные имена из sql-базы кукис для Firefox и Chrome, либо из 3-ей строки каждого кукис-файла для IE,
сканер сравнивает его с базой вредносных сайтов. - Email защита. Сканер цепляется к модулю антивируса, отвечающим за почтовую защиту. Это может быть плагин для Outlook, Thunderbird,
основой которого явлется проверка аттачей на предмет вирусов. - Контекстный скан файла/папки. Когда юзер выбирает в контекстом меню «Проверить файл...», щелкая правой кнопкой мыши на папке или файле, антивирус также обращается к движку.
Автор: nrcpp