О возможностях антивирусов. Часть 1

    Сегодня рынок антивирусных продуктов настолько разнообразен, как никогда. Какие только новые технологии не предлагают нам антивирусные компании; возможности проактивной защиты, эмуляции кода, эвристического анализа, «облачных» технологий и т.д. и т.д. присутствуют в описании практически каждого уважающего себя антивируса. Но насколько эти рекламируемые технологии эффективны — это большой вопрос. Попробуем во всём разобраться.

    Одной из главных функций антивируса является защита компьютера пользователя от неизвестных ранее угроз, 0-day вирусов, так сказать. Эту функциональность антивирусов мы и будем сегодня оценивать на практике. Для этого будем проверять наши тестовые программы антивирусными сканерами, а использоваться будет, как обычно, Virus Total. При этом сразу необходимо отметить, что при таком тестировании никак не будут оцениваться различные HIPS технологии и им подобные, которые позволяют определить вредоносный функционал файла на лету, путём анализа его поведения. То есть наш тест будет идентичен простой проверки файла антивирусным продуктом. Начнем, пожалуй.

    Тестировать мы будем классическое вредоносное ПО – банального Trojan-Downloader-а. Предполагается, что любой программный продукт, называющий себя антивирусом, должен без проблем распознать угрозу. Наша первая тестовая программа выглядит следующим образом:

    image


    Загружаем чудо-программу на Virus Total и перед нами открывается следующая картина:

    image


    Наш первый тест распознан всего лишь 18 антивирусами из 43. Довольно неожиданно. Сразу сдались такие небезызвестные антивирусы как Avast, Comodo, Nod32, Panda и Symantec. Как же они умудрились обойти стороной такой примитивнейший вирус? Не пора ли нам требовать моральную компенсацию с таких «антивирусов»?

    Идём дальше, проверим, смогут ли антивирусы справиться с таким популярным приёмом как использование структурных исключений. Второй тест будет выглядеть примерно так:

    image


    Здесь мы создаём собственный обработчик исключений, затем совершаем недопустимую операцию, в результате чего управление должно передаться нашему обработчику. Смогут ли с этим справиться наши подопытные антивирусы:

    image


    Образец распознан 19 антивирусами из 43. Неизвестно почему, но SUPERAntiSpyware проснулся и выдал неизвестную тревогу. В остальном результаты не изменились. Может быть, антивирусы вовсе не способны правильно обрабатывать структурные исключения, а просто ругаются на подозрительные строки, используемые программой? Проверим это и зашифруем секцию данных:

    image


    А теперь посмотрим, что изменилось:

    image


    Снова те же 18 тревог из 43, однако теперь из строя выбыл McAfee, а SUPERAntiSpyware снова выдаёт неизвестно какую тревогу. Что ж пришло время придумать что-нибудь посложнее. Будем использовать что-нибудь такое, о чём антивирус вряд ли догадывается. Мой выбор пал на команду CPUID, с помощью которой можно получить имя процессора. Делается это несложно:

    mov edi, offset szName
    mov eax, 080000002h
    BYTE 0fh, 0a2h; CPUID
    mov [edi], eax
    add edi, 4
    mov [edi], ebx
    add edi, 4
    mov [edi], ecx
    add edi, 4
    mov [edi], edx
    add edi, 4
    mov eax, 080000003h
    BYTE 0fh, 0a2h; CPUID
    mov [edi], eax
    add edi, 4
    mov [edi], ebx
    add edi, 4
    mov [edi], ecx
    add edi, 4
    mov [edi], edx
    add edi, 4
    mov eax, 080000004h
    BYTE 0fh, 0a2h; CPUID
    mov [edi], eax
    add edi, 4
    mov [edi], ebx
    add edi, 4
    mov [edi], ecx
    add edi, 4
    mov [edi], edx

    После выполнения этого кода в переменной szName окажется имя процессора. Как же мы можем его использовать? А что если на основе полученного результата дополнительно зашифровать секцию данных? Единственное, чего нам надо добиться в таком случае, это сохранить возможность запуска программы на различных процессорах. Нетрудно заметить, что обычно в названии процессора на первом месте стоит имя компании, его производящей. Заметит ли это антивирус – вот в чём вопрос))) Напишем простенькую функцию:

    unsigned int ParseName(char *str)
    {
    char *p=str;
    while(*p==' ') p++;
    unsigned int hash=p[0]*34+p[1]*344+p[2]*1152+p[3]*44233+p[4]*234321;
    if(hash==29948155)
    {
    return p[0]+p[1]*0x100+p[2]*0x10000+p[3]*0x1000000;
    }
    return 0x75273451;
    }

    Здесь всё просто: сначала мы пропускаем пробелы, затем вычисляем что-то вроде хеша от первого слова и в случае совпадения хеша с эталоном значением вычисляем ключ для расшифровки на основе этого первого слова. Осталось только скомпилировать функцию любым компилятором и вставить её ассемблерный код в программу. Поскольку у меня на компьютере стоит процессор Intel, то и хеш я вычислил от слова Intel. Так что наш четвёртый тест будет работать не на всех процессорах. А как это исправить и не оставить в обиде AMD, я думаю вы и сами догадаетесь. В результате получим примерно следующее:

    image


    Загружаем файл и видим результат:

    image


    Всего 5 антивирусами из 43 справились с заданием. Причем SUPERAntiSpyware нашёл здесь вирус явно по ошибке))) Что ж, а что будет, если мы ещё и код программы зашифруем? Например, создадим окно, узнаем, какой текст оно содержит, а затем расшифруем код программы на основании полученной информации. Выглядеть это может следующим образом:

    image


    Отправляем файл:

    image


    Теперь отреагировали 6 антивирусов из 43. Однако 4 из них не смогли определить вид вредоносного ПО. Этот факт свидетельствует о том, что антивирусы просто не справились с заданием — не смогли расшифровать тело вируса и выдали тревогу только из-за того, что файл упакован. Вообще, это морально неправильно: в упаковке исполняемых файлов нет ничего плохого. Мы не виноваты, что антивирусная программа не может корректно работать с упакованными файлами. Вывод номер один – всегда проверяйте своё ПО после упаковки, дабы избежать неприятных инцидентов. Вывод номер два – с нашим последним испытанием по-настоящему справились всего лишь два антивируса: Kaspersky и Microsoft. С чем это связано – неизвестно. Может быть с тем, что они успели занести какую-то сигнатуру в базу? Или их сигнатуры могут пробиваться через XOR шифрование? Я думаю, что на этом месте можно поставить жирную точку, тем более что Kaspersky – мой любимый антивирус, а к продукции Microsoft я никаких претензий не имею (…ну …пока не вышел Windows 8).

    Глобальный вывод: на сегодняшний день проактивные технологии пока ещё далеки от совершенства и их не очень-то и сложно обмануть.

    P.S. В статье осталась нерассмотренной технология HIPS, которая способна определить вредоносный функционал файла на лету, путём анализа его поведения. Поэтому не всё так плохо как кажется – если Вы, проверив файл антивирусом и ничего не обнаружив, запустите его на выполнение, то антивирус с большой долей вероятности выдаст Вам предупреждение. Но эта тема уже совсем другой истории.
    Поделиться публикацией

    Похожие публикации

    Комментарии 30

      +3
      Занимательно, кстати недавно читал подобное исследование только в нём masm использовался
      kaimi.ru/2011/11/antivirus-trolling/
        0
        Я тоже masm-ом компилил, только на скринах это не очень выглядит…
        0
        В хакере несколько статей было с подобным исследованием антивирусов. Только не вирустотал, а конкретные антивири тестили на компе. Там же и HIPS работал.
        Весьма занятные результаты…
          +25
          Вы, извините, хрень какую-то пишите.

          Вы исходите из каких-то диких предпосылок, что нормальное приложение не должно загружать из сети обновления и запускать их, не должно пользоваться SEH, шифровать секции данных, демонстрировать процессорозависимое поведение и т.д. А любое из этих действий рассматриваете как признак вредоносности. По-моему, это совершенный абсурд. Это первое.

          Второе. Если в приложении эти действия закодированы, то это может лишь вызвать легкое подозрение у антивируса, а проверка этих подозрений как раз возлагается на эти самые HIPS технологии. Сканер сам по себе не должен классифицировать их как малварь (если только это не сканер конкренной малвари), защита должна быть комплексной. К этому индустрия пришла уже достаточно давно, странно что вы еще не.

          Третье. Реакция на ваш единичный семпл никак не может служить критерием для оценки, насколько хорош тот или иной антивирусный продукт. Для любой системы фильтров (в данном случае антивирусов) и из настроек можно подобрать такую выборку исходных данных, что фильтры пройдут лишь нужные образцы. У любого фильтра есть пороговая область, где срабатывание нестабильно. Это не значит, что в данном случае вы подгоняли входные данные под результат, но сама возможность такой подгонки дискредитирует ваш подход.

          Ну и в дополнение, вы в курсе, с какими настройками гоняет каждый сканер VirusTotal? Может, в некоторых продуктах задействован и поведенческий анализ, например через виртуализацию. Это тоже портит эексперимент.

          P.S. В качестве юмора.
          > Сразу сдались такие небезызвестные антивирусы как Avast, Comodo, Nod32, Panda и Symantec. Как же они умудрились обойти стороной такой примитивнейший вирус?

          Они все правильно детектировали, это же не настоящий вирус. Это демонстрационный пример, реального вреда не приносит :) Это у Касперыча ложное срабатывание. trollface.jpg
            +1
            А) Нормальное приложение не должно скачивать неизвестно что из-интернета и запускать это на исполнение и больше ничего не делать. Это классический Trojan-Downloader, которого должен детектировать любой антивирус. Использование SEH и шифрования — действия, нацеленные на обход антивирусной защиты — про то, что приложения не должны их использовать в статье ничего не сказано.
            Б) Почему тогда пример 1 вызвал негативную реакцию 18 антивирусов, причём лучшей части этих антивирусов? А после некоторых манипуляций они сдали свои позиции? Не означает ли это, что они просто не смогли противостоять такой примитивной защите?
            В) Если мы смогли тем или иным способом обойти защиту, значил любое ПО может сделать тоже самое таким же образом => результаты довольно справедливые. Главный результат — все антивирусы показали себя не с лучшей стороны.
            Г) Если это так, то ситуация куда хуже. Поэтому я уверен, что это не так.
            Д) И всё-таки это вредоносное ПО.
              +4
              А) Отдельный модуль апдейта приложения, который только скачивает новый инсталляционный файл и запускает его, почему бы и нет?
                +1
                Еще проще, веб-инсталлятор.
                +1
                > Нормальное приложение не должно скачивать неизвестно что из-интернета и запускать это на исполнение и больше ничего не делать.

                Вот эти моменты из всех пожалуй стоят того, чтобы их раскрыть. «Неизвестно что» это по-вашему значит плохо. А «известно что» вообще бывает, на этапе сканирования? Вот «больше ничего не делать» это поинтереснее. Попробуйте добавить в свой пример «делание много чего еще», в двух вариантах — вредоносного и безобидного. Посмотрите, что изменится.

                > Не означает ли это, что они просто не смогли противостоять такой примитивной защите?

                Это означает, что если код зашифрован (не упакован), то нефиг тратить время на попытки расшифровки, анализ откладывается до стадии исполнения. И это правильно.
                  +2
                  Еще есть куча ПО, которое обфусцировано и пошифровано ради того, чтобы его не взломали. Как предлагаете с этим фактом антивирусам бороться? Орать во всю глотку, что вредоносное ПО на борту?
                    0
                    И да, пожалуйста, тот код, который Вы текстом написали, оберните в теги для кода, а то нечитабельно… Спасибо заранее.
                  –1
                  Согласен с вами, сильно похоже на подгон самого теста под результат.
                  +3
                  Fake positive лучше пропущенного виря. Так чо пусть они и не разобрались с кодом, но паранойя не вредит.

                  PS Авира и Майкрософт отработали, это радует. Два хороших бесплатных антивиря.
                    0
                    Лучше для пользователя, но хуже для разработчика. Не со всеми антивирусами удается связаться и наладить контакт.
                    +1
                    Хрень какая-то, а не статья. Сразу вспоминается ситуация, с которой я сталкиваюсь касательно PVS-Studio. Взято несколько абстрактных примеров и на основании этого сделана попытка что-то оценить (один из примеров). На мой взгляд наоборот молодцы, что не ругаются почём зря.
                    –4
                    Бывают ситуации, когда ты невнимателен, или просто лень читать статью — листаешь и цепляешь за интересные места. Тут я просто ничего подчеркнуть обзорно не смог, мне кажется, это минус статьи! НА изображениях ничего не подчеркнуто, в тексте не выделено!
                      +1
                      Проактивки здесь ни причем, здесь исключительно эвристика должна была работать и эмуляторы. Но результат меня ничем не удивил — ожидаемая картина. Правда порадовал сигнатурный детект dr.web после криптования строк — значит уже были реальные downloader'ы с таким кодом.
                      Однако стоит накрыть каким-нибудь самописным пакером и скорей всего АВ уже пообломаются, и начнутся детекты вроде cryptik
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          А какой смысл сканировать только сигнатурными базами?
                          1) Они у всех вендоров примерно одинаковы (да-да, а еще они ими обмениваются)
                          2) Сигнатурное покрытие, как вы сами сказали, возможно только для очень ограниченного числа семплов (кончено, есть generic-сигнатуры, но и они детектят не много малвары + любой неизвестный пакер/протектор и сигнатурный детект обламывается).
                          И вот тогда на помощь приходит эмуляция. За эмуляцией следит система принятия решений, имеющая определенные эвристические правила (запакован? еще и лезет в интернет? что-то качает? ставит на файл атрибут «скрытый»? и в автозагрузку его? Да это же неизвестный Downloader!). Чем лучше эмулятор (эмуляция всех x86 и не только команд, эмуляция Win32 API и т.д.) и чем лучше правила детектирования, тем меньше вероятность пропустить новую малвару.
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Плох тот антивирус, который не может проанализировать даже самый примитивный файл перед запуском.
                              • НЛО прилетело и опубликовало эту надпись здесь
                          +1
                          Расстроило что AVG не прошёл. Однажды я заметил что AVG может расчистить загаженную машину будучи установленным на неё уже после заражения, чем был изрядно приятно удивлён (раньше приходилось либо винч отвинчивать либо с CD грузиться).
                            0
                            Online scan вирустотала не на всех антивирусах включает проактивку.
                            Проверьте семпл на том же авасте на тестовой машине, результат может отличаться.

                              0
                              А он разве не дефолтные настройки всех антивирусов использует?
                                0
                                по результатам тестов расхождения с default setup бывают
                              +1
                              Я тоже не вижу смысла статьи, ибо поведение аверов рассматривается комплексно, и как уже сказали, нет ничего удивительного в таких результатах.
                              anubis.iseclab.org, потестите там — у них, вроде, они отрабатывают нормально, со всем функционалом.
                                +2
                                Чем-то статья хороша, а чем-то плоха.
                                Все же мне кажется, гораздо более достоверные результаты были бы если бы это был не вирустотал, а, скажем, виртуалки с разными антивирусами, которые сканируют файл из виртуальной сетевой папки (делается через VirtualBox довольно просто). Тогда можно было бы точно знать где работает проактивка, где какие настройки и т.д.
                                  +1
                                  Статья действительно не корректна. В самом начале автор делает неправильное допущение, что все антивирусы должны задектить его код. Но это неправильно, т.к. уже многие тут сказали, что код этот не может считаться вредоносным. Гораздо правильней было бы отследить динамику.

                                  Т.е. проводится скан первого сэмпла и те антивирусы что задетектили код входят с состав тестируемых. Т.к. они посчитали этот код вредоносным, то следует тестить дальше только их, насколько они устойчивы к шифрованию строк, кода и прочего.

                                  А так статья чистый популизм, который произведет впечатление на людей не разбирающихся в вирусных и антивирусных технологиях и не понимающих как они работают.

                                  Да и в борьбе против неизвестных вирусов, аверы всегда проигрывают. То вредоносное ПО, которое пишется профессионалами всегда обходит эвристики, анализаторы и сигнатуры. Эти вирусы их хлеб и они стараются во всю. Единственное что могут противопоставить этому антивирусы это HIPS/SandBox (которые кстати здесь не тестировались) и скорость сбора сигнатур.

                                  HIPS и тому подобное очень спорная технология, т.к. ответственность за принятие решения перекладывается на пользователя, который в большинстве случаев вообще понятия не имеет что происходит. Ну а скорость добавления в базы тоже не достаточно высока. Разработчики вирусов мониторят детекты круглосуточно и очень быстро выпускают апдейты. Антивирусы всегда в роли догоняющих.
                                    0
                                    Конкретно был разочарован McAfee, никому не рекомендую. Постоянно сбивались настройки, требовал ключи, хотя все было оплачено и введено, техподдержки нет нормальной, непонятно, куда обращаться, когда заглючил интернет-антивирус.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое