Antivirus protection
January 2012 14

О возможностях антивирусов. Часть 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
7.6k 61
Comments 30