Сканер вирусов изнутри


    Последний год я работал над реализацией вирусного сканера для одной антивирусной как ни странно компании.
    Пост являет собой выжимку приобретенных знаний, и повествует хабрасообществу о внутреннем устройстве как ни странно антивирусного сканера.
    Сканирующий движок или сканер — это фундамент антивирусного пакета. Являет собой бэк-энд антивируса и, как правило представлен в виде 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%\AppData\Roaming\Microsoft\Windows\Cookies.
      Таким образом извлекая доменные имена из sql-базы кукис для Firefox и Chrome, либо из 3-ей строки каждого кукис-файла для IE,
      сканер сравнивает его с базой вредносных сайтов.
    • Email защита. Сканер цепляется к модулю антивируса, отвечающим за почтовую защиту. Это может быть плагин для Outlook, Thunderbird,
      основой которого явлется проверка аттачей на предмет вирусов.
    • Контекстный скан файла/папки. Когда юзер выбирает в контекстом меню «Проверить файл...», щелкая правой кнопкой мыши на папке или файле, антивирус также обращается к движку.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 43

      0
      Позновательно)
        +1
        да. лично я слабо представлял, как работает антивирус
        +2
        а что понимается под «список вирусов, которым мы доверяем (также не наносят вреда системе)»?
          0
          kms, trainer наверное
            0
            Есть Whitelist, а есть TrsutedBlackList. Это имелось ввиду. Первый белый список пользователя, а второй список доверительных инфекций, которые также false-positive, но задаются компанией разработчиком.
              0
              то есть всякие тесты вроде EICAR или сюда входит и всякое разное ПО вроде кейгенов, трейнеров, кряков и прочего?
                0
                Вы не правильно понимаете назначение EICAR. На файлы EICAR любой антивирус должен ругаться, но при этом файл не содержит зловредного функционала! Это просто пустышка.
                Пользователю часто надо понять как ругается на антивирус в целях настройки антивирусного решения.
                  +1
                  Говоря о листах nrcpp говорит о способе благодаря которому пользователь может сказать, что файл чистый! К примеру вы скачали кейген и хотите воспользоваться, но антивирус удаляет. Вопрос: как быть? Ответ: Перенести ответственность за действия файла на самого пользователя!
                    0
                    может быть я неправильно выразился, но мне лично был интересен вопрос как в этот список попадают те или иные программы. вопрос не к вам, а автору топика, но…
                    к примеру, есть некая программа которая ведёт себя вирусоподобно — ставится втихаря не всегда очевидно для пользователя, добавляет панельку в IE, прописывается в куче мест, висит в памяти несколькими процессами, которые мониторят друг друга на наличие, меняет обратно настройки изменённые пользователем и т.д. Антивирус видя такое непотребство выносит вердикт — казнить, но поскольку программа идёт именитого разработчика, и в общем то вирусом по сути не является, то её заранее вносят в белый список, давя тем самым справедливое возмущение антивируса по этому поводу на корю. проще говоря — есть ли у антивирусов «предоплаченые» места в белом листе?
                      0
                      > мне лично был интересен вопрос как в этот список попадают те или иные программы.
                      Касательно белого списка — он определяется пользователем. Так реализовано у нас. Например вы знаете, что кейгены и кряки — это точно не вирусы у вас. Выделяете их в окне обнаружений, и добавляете самостоятельно.
                      Если это доверительный черный список — в нем хранятся сигнатуры файлов, которые не являются вирусами, но случайны образом выявляемые как зловреды. Такой список поставляется из каробки, и задается производителем. Наиболее вероятно, что сигнатура в базе и в черном списке совпадает. Или если это обнаружение по шаблону, то частично совпадает. Это может быть системный файл, или любая другая программа, случайным образом попавшая в базу сигнатур…
                      По поводу «предоплаченных» мест в белом листе, то тут скорее антивирусная компания должна мониторить, какие из известных программ не наказывать. False positive к тому же mail.ru или yandex.bar, может стоит места в рейтинге vb100. Поэтому эти продукты, не рассматриваются как зловреды.
                        0
                        >>«предоплаченные»
                        Такого в антивирусной индустрии не приветствуется и смысла в этом нет никакого. Если файл ведет себя как вирус, то возможны ситуации по детектированию и следовательно удалению:
                        1) Спросить пользователя, если выбран «интерактивный» режим
                        2) Файл уже детектед и пришло письмо от производителя этого файла. к примеру этот файл в составе какого-либо продукта какой-нить компании. В этом письме компания четко обосновывает что и для чего делает этот файл и почему его не следует детектить. Если аверы принимают решение, что обоснование корректное, то файл заносят в white-list или же дают «щадящее» название.
                    –2
                    Ну, объяснил так объяснил! Список вирусов, которым мы доверяем — это список доверительных инфекций. Спасибо! Стало яснее :)
                  +20
                  Статья капитанская. Говоришь — сканер изнутри, на самом же деле написал обзор основных функций среднестатистической авирской поделки.
                    –2
                    А что бы вы хотели? Фрагменты кода?
                      +3
                      Код ни к чему, но желательно больше технических сведений. Особенно интересна работа эмулятора. Я так понимаю, эмулятор умеет лишь небольшое подмножество API, так что ничего не стоит написать код, с которым эмулятор не справится. Как оно поведёт себя в таком случае? Или вирь начнёт обнаруживаться только когда авиры подрпавят эмулятор?
                        0
                        Спасибо за дельные замечания. Учту. Статья вводная, опыта у меня всего год, как доберусь до внутренностей эмулятора — отпишу).
                          0
                          Отслеживай тему Запросы на исследование вирусов там иногда что-то новое и прикольное.
                            0
                            По ссылке тема удалена(
                              0
                              Вы точно пишете сами антивирус? По-моему всем известно что многие форумы не показывают свои темы не зарегистрированным на их ресурсе личностям. Другими словами вам надо зарегистрироваться и после этого войти на этот форум.
                        +2
                        Все что Вы изложили уже давно известно и давным давно описано. К примеру статика в статье от 2003 года, про эмуляторы статья от 2004 года и даже статья об уязвимостях в эмулях. Более того то что Вы пытались описать обзор, который уже был написан в статьи от 2004. Да там некоторых деталей не указано. Но Вам можно было упростить себе задачу сославшись на известное и дописать то чего нету в других источниках.

                        Ваши ошибки, на мой взгляд, может и ошибаюсь:
                        1) Говорить термином «exe-шник» не стоит. Это может натолкнуть новичка на мысль что анализируется только файл с расширением "*.exe", а это не так!
                        2) Вы забыли указать о доп. действиях с анализируемым файлом. К примеру современные антивирусы после распаковки и вынесения вердикта по файлу, также выдирают все возможные строки среди которых ищут url-ссылки, а по ссылкам скачать и снова проанализить, как вывод если файл чист а по ссылке зловред, значит это вирус и шлем файл экспертам почему мы его не детектим. Также в файле ищутся другие возможные исполнимые файлы, к примеру в ресурса или оверлее.
                        +3
                        С долей копипаста в виде внезапных переносов строк после знаков препинания
                          +1
                          Согласен, статья бесполезная, куча воды ни о чем. Весь текст о том, что трава зеленая.
                          +7
                          1) Сигнатуры бывают основаны не только на хешах. Часто за сигнатуру берутся определенные байты (или маски) с определёнными смещениями. Например: B8DCFB5E00???B8*B201
                          Кроме статических, есть поведенческие сигнатуры — обычно, наборы вызовов определенных API с определёнными параметрами.

                          2) Упакованные файлы распаковываются эмулятором. Без него антивирус практически бессилен.

                          Изложено очень поверхностно. Я ожидал увидеть хотя бы фрагменты исходного кода.
                            0
                            Фрагментов же много, например чего?
                              +1
                              Эмулятор. Защита юзермодных процессов из ядра. Поиск нетривиальных руткитов и механизмы, позволяющие нормально устанавливать ваш продукт на заражённую машину и т.д.
                              0
                              >>2) Упакованные файлы распаковываются эмулятором. Без него антивирус практически бессилен.
                              Не только. Статические распаковщики тоже весьма популярны. Эмулятор может слишком долго анпачить, выход из этого только один: бенчмарки и только потом решение как нужно распаковывать.
                              0
                              > зашифрованные exe-пакером
                              Помоему пакеры ниразу не шифруют, а кодируют информацию. Это разные вещи
                                +1
                                На хабре и md5 шифрует. И это печально.
                                +1
                                > Также слабым местом хэш-скана является скорость проверки.

                                В каком же простите месте? Самым слабым местом всегда является скорость считывания с диска, а посчитать мд5 хеш (хотя что-то слабо верится что именно по хешу сравнение, а не по шаблонам) и найти в списке сигнатур (пусть даже среди нескольких миллионов) хеш-поиском (да хоть бинарным) — вопрос нескольких долей миллисекунды.
                                  0
                                  В сравнении с эвристическим поиском. Это и подразумевалось, считывание + сравнение.
                                  0
                                  Прощу прощения за дотошность, но в ряде случаев: сканирующий движок != сканер.
                                  Например, в продуктах Dr.Web сканер (как GUI, так и консольная версия) используют при сканировании антивирусный движок, также как его используют другие компоненты Dr.Web — файловый монитор, веб-монитор и др.
                                    0
                                    > Для локализации выявления вредоноса, хэш может вычисляться только для exe-файлов на основе PE-заголовка.

                                    Это далеко не так.
                                    Интеграция зловредного когда возможна и без модификации заголовка.
                                      +1
                                      Таким образом, файл считается зараженным, если его хэш найден в базе сигнатур.

                                      Не понял. Считаем хэш файла и ищем егов базе? А смысл?

                                      Или для каждого файла делаем «окно» совпадающее по длине с сигнатурами и проходим этим окном по файлу? Грубо говоря окно 1 Кбайт, файл 1 Мегабайт — вычисляем ~1 млн. хэшей и ищем в базе среди вирусов с сигнатурой в 1 Кбайт, потом также для сигнатур всех остальных длин. То есть каждый (почти) байт мегабайтного файла хэшируется порядка миллиард раз если считать что разных по длине сигнатур порядка тысячи?
                                        +1
                                        Да, да, мне тоже очень интересно! Каким образом хеш поможет найти вирус? При условии что вирусы разной длины и могут находиться в различных секциях файла? Или от каждого файла все же считается 5 млн хешей для каждого вируса в отдельности для соответствующей этому уникальному вирусу области?
                                          +1
                                          На практике это реализовано так: определяем что файл exe-шник. Первые два байта — 'MZ'. Далее считываем его PE-секции, и из последней вычисляется MD5-хэш, который уникален. А в базе сигнатур уже хранятся хэши этих самих вирусов. Если файл не зашифрован, вирус не полиморфен итд., то хэши совпадают с высокой долей вероятности.
                                            0
                                            То есть вирусы просто дописывают свое тело к концу файла, если в подробности не вдаваться? Как-то недальновидно по-моему.
                                              0
                                              К концу PE-секции исполняемого файла. У разных авиров по разному вычисляется хэш. Другое дело, что сейчас более популярно заражение через хак плагинов браузера, таких как Flash, Java, QuickTime. Только если они не выполняются в песочнице, и та может тоже содержать уязвимости.
                                                0
                                                Ну суть в том, что именно дописываются, а не вырезают кусок и не вставляют себя на его место (возможно дописывая кусок в конец, чтоб раньше времени себя не демаскировать неработающей программой).
                                          0
                                          Да, послебний вопрос интересен (алгоритм выбора куска для хэша). Так, в принципе, о многом догадывался, а то чего не понимал так и не написано. По сути тема требует подробного раскрытия, можно и без кода но описание алгоритма требует большей детализации.
                                            +1
                                            >>Да, послебний вопрос интересен (алгоритм выбора куска для хэша).
                                            Поищите: «AVPBase_parser.rar», по оригинальнойссылке от автора, файл уже недоступен. Более того не прошло и года как выкладывали сорцы Каспера! ;)
                                              0
                                              Ответил выше. MD5-хэш вычисляется из PE-секции.
                                              0
                                              Такой вид сканирования позволяет определить вид атаки с высокой долей вероятности, без ложных срабатываний

                                              Достаточно погуглить fasm virus false positive чтобы обнаружить множество примеров «отсутствия» ложных срабатываний сигнатурного сканирования. У моего друга, так вообще все скомпилированные fasm'ом программы определяются как вирусы. А уж случаев когда сигнатуру просто ставят на распространенный пакер не перечесть.
                                                0
                                                «Обычно сигнатурой антивируса является MD5-хэш (16 байт) сгенерированный на основе тела известного вируса.» — позапрошлый век.

                                                Only users with full accounts can post comments. Log in, please.