Прежде чем говорить о каких-то багах и уязвимостях необходимо разобраться в
том, где мы их будем искать, что именно считать багой, как работает данный
продукт и какая у него философия принятия тех или иных решений. Часто бывает,
что некоторые "неудобности" АВ-компании не признают и прикрывают их как угодно —
начиная от удаления топика на форуме, заканчивая пафосными словами "такова
политика компании". Но не все так просто — чаще всего, находимые баги, таковыми
не являются, например, какой толк искать баги фаервола у Dr.Web’a, если у него
никогда и в помине не было сетевого экрана? Еще очень популярно находить такой
псевдо-баг: через Process Explorer баловаться с процессами антивируса, а то, что
эта утилита от Руссиновича добавлена в доверенные приложения даже у самого
ленивого антивируса, "дыроискателя" совершенно не волнует.

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

 

Начнем с философии работы продукта

Продукт нацелен на людей, у которых знание компьютера стремится к нулю, в
народе таких людей называют домохозяйками. Сегодня очень модно все продукты
затачивать именно под них и под геймеров — антивирус должен быть быстрым и
молчаливым, а все остальное отодвигается на второй план. Начиная с 2009 версии
эта тенденция наблюдается и у Антивируса Касперского, если KIS 7 своим
поведенческим анализатором ругался и спрашивал о всем, что только можно,
независимо от того, что за программа "шалит" в системе, то KIS 8 уже на
настройках по умолчанию был куда тише своего предшественника. Он даже перестал
поросенком визжать, дабы не расшатывать нервы домохозяйки, которые и так уже на
ладан дышат. Такая скромность со стороны антивируса стала возможна благодаря
Зайцеву Олегу (большинству известен как разработчик AVZ), который вывел эмулятор
на достаточно приличный уровень и "заведует" его правилами. Эмулятор является
одной из ключевых преград на пути вредоносного ПО — при первом запуске он
анализирует "в уме" приложение (его действия в системе) и выносит вердикт —
разрешать запуск или нет. Приложению присваивается какой-то индекс опасности — в
зависимости от него приложение попадает в какую-то из групп по ограничению
действий в системе — в зависимости от того, в какую группу попадает приложение,
ему разрешаются те или иные действия в системе.

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

 

Выбор цели

Наша "дрозофила" должна удовлетворять нескольким простым требованиям:

  1. Ее действия должны быть очень подозрительны для антивируса (для установки
    индекса опасности равным 100).
  2. Действий должно быть немного (антивирус не должен ни на что отвлечься — он
    должен увидеть только одно опасное действие).
  3. Вредоносное действие должно быть признанным таковым (например, завершение
    чужого процесса само по себе не является опасным действием).
  4. Действия подопытного кролика должны быть основой работы какого-нибудь
    вредоносного ПО.
  5. Дрозофила != троян класса hoax

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

Весь лишний код убран еще и в угоду компактности — ведь если публиковать
листинги целиком, то никакой статьи под это не хватит. Поэтому просьба не
обращать внимания на отсутствие проверок и неполные листинги (без объявления
переменных, включения файлов…). Что бы никого не обидеть листинги будут на
трех языках: asm, C, VB, хотя это непринципиально — все равно мы будем писать на
WinApi, а откуда делать вызовы — это лишь дело вкуса и привычек, лично я
колеблюсь между asm и С, т.к километровые объявления функций и констант в VB
меня не прельщают. Также перед разбором технологий, думаю, стоит сказать о том,
что наша дрозофила без применения нижеизложенных технологий получает индекс
опасности равный 100 (все три файла на разных языках). Для сравнения: обычный
hello_world на asm’e из двух строк (с invoke) получает индекс опасности 22.
Понимаю, что надоел своим хождением вокруг да около, как лиса вокруг кувшина, но
все вышеизложенное необходимо для понимания философии принятия решений
эмулятором и методов его обхода.

 

Пятая колонна

На самом деле, наш троян в системе далеко не одинок, есть те, кто готов ему
помогать, причем безвозмездно — это системные интерпретаторы. Как это ни
странно, но это очень живучая технология, которую можно с успехом применять для
самых разных целей. Для начала рассмотрим ComSpec (cmd.exe). С его помощью можно
достаточно удобно редактировать файлы, причем способов его вызова достаточно
много, начиная от самого очевидного…

 

Создание и запуск bat-файла

Примерное содержание batника:

set win333="%WINDIR%\system32\drivers\etc\hosts"
echo 127.0.0.1 www.google.com # test >> %win333%

А схема действий такая:

CreateFile -> WriteFile -> CloseHandle -> ShellExecute (*, *,szBatName, *, *,
SW_HIDE) -> DeleteFile

Т.е создаем готовый батник, а потом скрыто (ведь не обязательно юзеру видеть
то, что троян работает, глядя на консольное окно, поэтому и SW_HIDE) его
запускаем и удаляем после отработки.

Кроме создания файла и его запуска (все-таки немного неуклюжая система) можно
запускать cmd.exe с параметрами, в которых передать ему нужные нам команды.
Примерно так:

char szCmd[]="C:\\windows\\system32\\cmd.exe";
char szStr[]=" /c @echo 127.0.0.1 www.google.com >>
C:\\windows\\system32\\drivers\\etc\\hosts";
ShellExecute(NULL, NULL, szCmd, szStr, NULL, SW_HIDE);

После "/с" передаются необходимые команды и опять таки запуск скрыт от глаз
пользователя.

Но есть более "ленивый" способ использования cmd.exe, кто изучал С, тот
наверняка помнит об этом:

char szStr[]="@echo 127.0.0.1 www.google.com >>
C:\\windows\\system32\\drivers\\etc\\hosts";
system(szStr);

Но о скрытии консольного окна нужно будет позаботиться ДО такого вызова —
взять собственное окно и скрыть его.

Кроме cmd можно использовать и другие интерпретаторы — все они работают
достаточно неплохо (в плане снижения индекса опасности), но остановимся немного
еще на одном (cscript) и перейдем к следующей технологии. По аналогии с
созданием и запуском батника можно сделать запуск такого файла:

on error resume next
Set FSO = createobject("scripting.filesystemobject")
Set hMyFile = FSO.OpenTextFile("C:\WINDOWS\system32\drivers\etc\hosts", 8,
false)
hMyFile.WriteLine " # test"
hMyFile.WriteLine "127.0.0.1 www.google.ru # test"
hMyFile.WriteLine " # test "
hMyFile.Close

Возможно, что это можно сделать более правильно, но свои знания команд я
приобрел из просмотра когда-то популярных vbs-зловредов, а поэтому и использую
те способы работы в системе, которые в них встречались. В качестве домашнего
задания можете рассмотреть работу с реестром через запуск с параметрами
regedt32.exe ;), хотя работу с реестром можно реализовать и способами описанными
выше.

Такие файлы набираются индекс опасности примерно 12-25.

 

Дыра размером с окно

Если приложение отображает GUI и ждет от пользователя каких-то действий, то
ему сходит с рук практически все. Поэтому нужно сделать следующее: форму с
кнопкой посередине (при нажатии на которую происходит редактирование файла
hosts) и надпись с просьбой нажать на эту кнопку, после чего надеются на русский
"авось", а еще можно после этого ударится в вычисления вероятности того, что
юзер нажмет на кнопку…но так мы, конечно, делать не будем, а сделаем нечто
похожее. Чем отличается вышеописанный троян с кнопкой от того, который делает
все молча, ничего не показывая? Тем, что человек его не видит на экране и не
делает никаких специальных телодвижений для обеспечения его работы. К нашему
приложению должны предъявляться такие же требования, но в тоже время нельзя
забывать об антивирусе, для которого нужно следующее: должно быть окно, действия
в системе должны быть только в ответ на какое-то вмешательство пользователя.

Кажущаяся трудной на первый взгляд задача на самом деле намного проще: для
начала стоит разобраться с окном, а именно сделать так, что бы оно было, но его
не видел человек, основных путей два: сделать его очень маленьким или сделать
его прозрачным настолько, что бы его совсем не было видно. С действием от
пользователя аналогично: оно должно быть, но юзер не должен понимать, что он
специально что-то делает. А чем обычно занимаются за компьютером с точки зрения
движения частей тела в пространстве? Давят на клавиатуру, двигают мышкой,
нажимают на мышке на левую кнопку, ерзают на стуле. Но чаще всего двигают
мышкой, даже если ее не двигают специально, то, скорее всего, она все равно
немного двигается — хотя бы чуть-чуть (достаточно проезжающей за окном машины,
движения в комнате, лежащей на мышке руки). Поэтому действием от пользователя мы
выберем именно движение мышью, в VB это можно сделать примерно так:

У свежеиспеченной формы устанавливаем для WindowState значение Maximized, а
BorderStyle — None. Этим мы добиваемся разворачивания при запуске формы на весь
монитор.

А вот сам код установки прозрачности при загрузке формы:

Private Sub Form_Load()
SetWindowLong Me.hwnd, GWL_EXSTYLE, WS_EX_LAYERED
SetLayeredWindowAttributes Me.hwnd, 0, 20, &H2
End Sub

А вот код для Form_MouseMove:

Dim fFile As Integer
fFile = FreeFile
Open "C:\WINDOWS\system32\drivers\etc\hosts" For Append As #fFile
Print #fFile, " # test"
Print #fFile, "127.0.0.1 www.google.ru # test"
Print #fFile, " # test "
Close #fFile
End

Такому файлу KIS дает индекс опасности 3 (из 100). Еще немного, и в
доверенные бы занес по собственной инициативе 🙂

Если совсем оборзеть, то можно даже не делать окно прозрачным. Окно можно
сделать черным и прикинуть насколько низок будет процент людей (процента 3),
которых напугает вдруг моргнувший экран и они бросятся качать AVZ и выкладывать
логи на virusinfo.info. Одни примут моргнувший экран за проблемы в железе
(напряжение скакнуло), другие свалят на ОС, а большинство вообще думать ничего
не будет по этому поводу.

Помимо обработки движения мыши можно сделать обработку еще чего-нибудь
другого, самое главное тут — это дождаться какого-то действия от человека, а не
помещать весь вредоносный код в функцию Form_Load().

 

Прощай, немытый WinApi…

Думаю, что всем известно, что в природе не встречается "чистого" CreateFile,
он обязательно будет оканчиваться либо буквой A, либо W, который в свою очередь
(после того, как разберутся с кодировками) вытекают в (Nt)ZwCreateFile, в
котором происходит примерно следующее (необходимо учитывать, что не у всех ХР):

MOV EAX,25 // код вызова для ХР
MOV EDX,7FFE0300
CALL [DWORD DS:EDX] // SystemCall - 7C90EB8B

А при переходе по адресу видим следующее:

MOV EDX,ESP // EDX больше не нужен, в него кладем указатель на вершину
стека
SYSENTER // прощай, немытый WinApi

При минимуме инструментов и отсутствии рабочего поисковика можно исследовать
sysenter следующим образом: с помощью отладчика (OllyDbg подойдет) доходим до
SYSENTER’a и осматриваемся вокруг, точнее смотрим на содержание eax, edx и
стека. Использование прямого вызова снижает примерно в 2 раза индекс опасности,
но и в такое же количество раз снижает и вероятность того, что файл вообще
заработает — на более старых ОСях или более новых — коды другие, поэтому файл
должен перед работой проверять в какой ОСи он находится и использовать
соответствующие коды.

Использование прямых вызовов — достаточно рискованный ход. Во-первых, это
очень подозрительная деятельность с точки зрения антивируса, во-вторых, падает
стабильность работы приложения — чуть что не так и …

 

РЕ-файлы бывают разные — желтые, зеленые, красные…

Зачем зацикливаться на одном единственном файле, который будет выполнять все
действия в системе? Какой-то код можно перенести в dll и вызывать оттуда
функции. Эту библиотеку можно носить с собой двумя способами: извлекать из себя
и загружать (LoadLibrary) или извлекать из себя ЕХЕ-файл (загрузчик библиотеки)
и библиотеку в какую-нибудь папку и запускать загрузчик. В деле размещения кода
в dll можно пойти еще дальше — весь функциональный код поместить в библиотеку
(потенциально опасные действия), а в самом загрузчике оставить лишь необходимое
для функционирования. Загрузка библиотеки может быть через LoadLibrary
непосредственно из кода или всю работу можно отдать системному загрузчику
(прописать dll в таблицу импорта, причем сделать это можно с помощью
разнообразных PE-edit’ов и с чужим файлом).

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

.if reason == DLL_PROCESS_DETACH
...наш_вредоносный_код...
.endif

И эмулятор ничего не заподозрит.

 

Stupid user

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

Неоднократно мне приходилось видеть реакцию простых пользователей на красный
алерт с поросячьим визгом от продуктов ЛК — нажимали либо "Да", либо первое на
что попадет курсор, а более продвинутые пользователи могли при этом поискать
знакомые буквы в тексте сообщения от антивируса. Шансы того, что юзер нажмет
"Да" — очень высоки, поэтому достаточно немного поэкспериментировать с файлом —
нужно, что бы антивирус что-то спросил у пользователя. Но на этом приятные
моменты не заканчиваются, антивирус дает возможность пустить в ход серое
вещество и тем, которые ищут знакомые буквы на алерте от антивируса — для
большей понятности в алерте изображена иконка приложения (о котором вопрошает) и
рядышком пишется то, что находится в описание файла в версии (Version Info) —
все это можете просмотреть практически у любой серьезной программы через
редактор ресурсов. Например, если редактором ресурсов "прилепить" все эти
"обвесы" от WinRAR’a к маленькому вредному файлу с именем ya_virus.exe, то на
запросе к пользовалю будет красоваться иконка архиватора и надпись "WinRAR
archiver" рядом (при этом имя файла нигде не будет фигурировать).

Предлагаю пари: не менее 70% пользователей на такой запрос нажмут "Да" 🙂

 

Послесловие

Не следует воспринимать эмулятор KIS’a как некую постоянную во времени и
пространстве субстанцию, он не является высеченным на камне и после этого
зашитым в антивирус набором правил. Эмулятор обновляется также как и базы и не
стоит на одном месте. Еще сегодня файл мог получать индекс опасности 35, а
завтра он уже получает 70, но данный процесс иногда происходит и в обратном
направлении — индекс опасности может и снижаться. Не думаю, что все эти методы
смогут пофиксить с первыми обновлениями, если по ним подкрутят правила до
более-менее приличного в течение месяца, то это уже будет хорошо. Технологии в
продукте заложены очень сложные и серьезные, но "до ума" они еще не доведены —
сказывается распыление сил разработчиков и аналитиков на множество задач. Чего
только стоит война патентов в США (см. новости ИТ за последние полгода),
"окучивание" новых рынков, выпуск новой версии, песочница…

Уже настало то время, когда самой серьезной уязвимостью в безопасности
является именно пользователь — компьютеры теперь также распространены (почти)
как и телевизоры/холодильники, и отношение к ним стало таким же — сколько
домохозяек имеют хотя бы отдаленное представление о том, как работает
холодильник? Аналогично происходит и с компьютерами, если лет 15 назад те, кто
смотрел в монитор старались понять "как это работает", то сегодня многие даже не
хотят понимать "почему ничего не работает", а на почве подобной безграмотности
расцветают махровым цветом запугивание, дезинформация, искажение реального
положения дел и т.д.

На этом греют руки все, начиная от "Скорой компьютерной помощи" и заканчивая
антивирусными компаниями, поэтому на небольшое "потепление рук"
хакеров-программистов никто и не обращает особого внимания — апельсин большой,
всем хватит.

Оставить мнение

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…