Сегодня вместо брутальных низкоуровневых опытов от наших краш-лаборантов тебя ждет легкая прогулка по спинам трех известных за рубежом антивирусных продуктов. Только простые трюки, только высокоуровневый кодинг. Но переживут ли они эти эксперименты?

 

Кто на новенького?

Тестировать мы будем три не очень популярных в России, но достойных антивируса, причем два из них — бесплатные. Итак, вот список:

  • Trend Micro — американо-японский продукт. На российском рынке занимал четвертое место по популярности в 2007 году.
  • AVG Internet Security 2011 (бесплатная версия) — чешская система защиты, включающая в себя антивирус.
  • Microsoft Security Essentials –бесплатный антивирус от малоизвестной американской софтверной компании.
 

Подготовка

В первую очередь необходимо настроить стенд для тестирования. Тестировать, а тем более «убивать» антивирусное ПО на рабочей машине — не самая хорошая идея. Тем не менее, второго (ненужного) компьютера у меня нет, поэтому я решил пойти самым очевидным способом — экспериментировать на виртуальной машине.

В качестве ПО для виртуализации я использую Oracle VirtualBox с установленным на нем Windows XP SP3. Кодить мы будем на локальной машине, а запускать и отлаживать приложение — на виртуальной.

Для начала настроим виртуальную машину. Чтобы она была доступна с хоста, нужно настроить второе сетевое соединение. Сетевой адаптер должен иметь тип «Виртуальный адаптер хоста» («VirtualBox Hostonly Ethernet adapter»). После загрузки ОС второй адаптер получит адрес из подсети 192.168.56.0/24.

В моем случае адрес был 192.168.56.102. Далее расшариваем папку на машине — я выбрал C:Share fuckAv.

В качестве IDE я использую Visual Studio 2010, в комплекте с которой имеется весьма неплохой удаленный отладчик. Открывай свойства проекта, выбирай пункт Debugging.

  • Debugger to launch — Remote Windows Debugger;
  • Remote Command — C:SharefuckAvfuckAv.exe;
  • Working directory — C:SharefuckAv;
  • Remote Server Name — 192.168.56.102;
  • Connection — Remote with no authentication (Native only);
  • Debugger Type — Native Only.

Также на виртуалку надо скопировать директорию x86 из директории удаленного отладчика, после чего запустить msvsmon.exe. После этого софт будет запускаться на виртуальной машине, несмотря на то, что IDE запущена на локальном компьютере.

 

Главное правило — никаких правил

Цель тестирования элементарна — «вынести» антивирус любым легальным (или не очень) способом. Я использую следующие методы:

  • Самое первое, что мы попытаемся сделать — убить графический интерфейс антивируса, чтобы он не мог взаимодействовать с пользователем.
  • Второй этап — убийство сервиса антивируса.
  • Третий этап — попытка удалить содержимое папки антивируса (или хотя бы часть содержимого).

Небольшая оговорка — все действия производятся из user-mode с правами администратора. За каждый тест испытуемый может получить от 2 до 5 баллов — прямо как в школе.

 

Без лица

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

bool killProcessByPID(int PID)
{
return TerminateProcess(OpenProcess( SYNCHRONIZE | PROCESS_TERMINATE, false, PID), 0);
}

В общем, получаем хэндл процесса с правами SYNCHRONIZE и PROCESS_TERMINATE, а потом просто завершаем его. Как же повели себя подопытные?
Первым будет детище мелкомягких — Microsoft Security Essentials. Оно, будучи уже вполне зрелым, даже не пискнуло при убийстве, за что и получает уверенную двойку. Кстати, сегодня мы не будем делать никаких выводов и суммировать оценки.

Говорят, в первом классе этим не занимаются :).

Следующий на очереди — Trend Micro. Он дает убить процесс с главным окном, но за значок в трее отвечает процесс, запущенный с привилегиями SYSTEM, соответственно, убить его из usermode нельзя даже с правами администратора. Более того, после закрытия главного окна можно щелкнуть на иконку в трее, и окно появится вновь. Я считаю, что Trend Micro заслуживает твердой «четверки» за этот тест.

Далее идет AVG. Он запускает два процесса от имени текущего пользователя: один отвечает за главное окно, второй — за иконку в трее. Главное окно убивается без проблем, а вот иконку убить не получается — Access Denied. Четверка.

 

Service Permanently Unavailable

Ладно, с графическим интерфейсом разобрались. Но то, что мы уничтожили графику, почти ничего не значит — служба антивируса по-прежнему бодрствует. Наша задача — остановить службу антивируса. Делается это нехитрой функцией.

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

if ( result )
result = DeleteService(scService);

Затаив дыхание, запускаем... И что же мы видим? MS SE, ругающийся на остановленный сервис. Ладно, нажимаем на большую красную кнопку посреди окна — и видим ошибку. Да, эта программка разрешила удалить свою службу. Печально. Снова два балла.

Проверяем Trend Micro — и ничего у нас не выходит. Он мониторит вызов подобных функций, при этом дает открыть свой сервис с максимальными правами, но.. при попытке остановить сервис мы получаем ошибку, причем ошибка — не просто ошибка доступа, а ERROR_INVALID_SERVICE_CONTROL. С удалением сервиса все еще интереснее: DeleteService возвращает true, при этом с самим сервисом ничего не происходит. Что ж, похвально — пятерка.

AVG держит запущенными сразу 2 службы — avgwd и AVGIDSAgent. Ни одну из них остановить не получается, с удалением ситуация аналогичная. Пятерка.

 

File not found

Последний тест я решил задействовать для очистки совести, полагая, что испытуемые не настолько тупы. Но, как оказалось, я ошибался. Функция такова:

bool removeFolder(const char *fi le)
{
return MoveFileEx(fi le, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
}

Напоминаю, вызов функции MoveFileEx с переданным в качестве второго параметра нулевым указателем означает не что иное, как удаление пути, указанного в первом параметре, а флаг MOVEFILE_DELAY_UNTIL_REBOOT указывает системе, что файл нужно удалить в процессе перезагрузки.

Это необходимо в связи с тем, что используемые в момент перемещения (удаления) файлы останутся на своих местах, а мы останемся с носом. Все, хватит болтовни — приступаем к делу. MS Security Essentials не дает удалить ни файл своего сервиса, ни GUI’я. Так же, как и в случае с Trend Micro, возвращается ошибка доступа. При этом ни один антивирус не завопил о подозрительном exe’шнике, поэтому оба получают оценку 4.

А вот тут непобедимый AVG и спасовал — после выполнения строчки removeFolder("C:\Program Files\AVG\AVG10\avgui. exe"); и перезагрузки GUI антивируса перестал запускаться, а файл отправился в глубины /dev/null. Пробуем удалить всю директорию антивируса и.. директория осталась на своем месте, а службы запустились. Подопытный получает тройку.

 

Вердикт

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

На n-ном шаге переписки все же предложили передать информацию через них — ага, конечно же, передадут :). Второе, и самое важное: почему антивирусы не вопили, как бешеные, видя, что их собираются прикончить? Они запрещали удалять свои директории, останавливать службы, но почему ни один из них даже не заикнулся о подозрительном файле?

 

Останавливаем сервис

bool stopService(const char *svcName)
{
SC_HANDLE scManager = NULL;
SC_HANDLE scService = NULL;
bool result = false;
SERVICE_STATUS ss;
scManager = OpenSCManager(NULL, NULL, GENERIC_ALL);
if ( ! scManager )
{
printf("[-] Failed to open SCManager: %dn",
GetLastError());
return false;
}
scService = OpenService(scManager, svcName, GENERIC_ALL);
if ( ! scService )
{
printf("[-] Failed to open the service: %dn",
GetLastError());
return false;
}
result = ControlService(scService,
SERVICE_CONTROL_STOP, &ss);
CloseServiceHandle(scService);
CloseServiceHandle(scManager);
return result;
}

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии