Pull to refresh

Голая правда

Reading time 6 min
Views 852
Нудные технические подробности, без которых никак не обойтись, выделены знаком параграфа: ¶. Надеюсь, их можно пропускать без потери смысла изложения.

Часть первая. Высадка


Как это случается часто, в последнее время, новые вирусы приходят прямиком в почту, — быстро, удобно и совсем не надо напрягаться. Последний вирус прислал себя вот в таком вот письме:
From: «Shauna Hoover» <olwen.davie@mairie-paris.fr>
To: <xxx@xxx.xx>
Subject: Paris Hilton

Good afternoon, buddy.

I found nude Angelina Jolie!
See in attachment!
Bye.

Поначалу сбивает, конечно, с толку, почему тема письма про П. Хилтон, а внутри — про А. Джоли, но… войдем все-же в положение сетевых злодеев! Работа у них нервная, бывает и ошибаются. Хорошо, что хоть вообще письма до адресатов доходят, постарались.

Присоединенный файл назвается xjolie.scr.zip, и внутри содержит «как бы» скринсейвер xjolie.scr. Файл подозрительный: кода мало, всего три функции, данных тоже почти нет. На скринсейвер не тянет, и для вируса маловато. Онлайн сканнер касперского обозначает файл, как зараженный вирусом «Trojan.Win32.Pakes.cyu».

¶ В самом начале выполнения натыкаемся на сюрприз: программа вызывает функцию NtDeleteValueKey (используя KiFastCallEntry, который, по сути есть инструкция sysenter), причем передает ей в качестве аргументов неинициализированные локальные переменные, в которых лежит всякий мусор. Поэтому NtDeleteValueKey в 99.9 процентах случаев должна возвращать STATUS_INVALID_HANDLE. Это значение (0xC0000008) используется как стартовое, из которого путем долгих вычислений (многочисленные «мусорные» арифметические операции), программа получает некий нужный ей адрес. Задача системного вызова здесь, видимо, — обмануть автоматические анализаторы и прочие антивирусы.

Кстати, работающий в тот момент симантек даже и не пикнул, и упорно твердил «Clean»; так что в очередной раз уверяюсь, что надеяться на эвристический анализ в ближайшие лет двенадцать не стоит.

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

После того, как программа расшифровала себя, делаем дамп:
.writemem unpacked0.dmp 00402088 L00009400
, записывая расшифрованный файл на диск.


Этот блок данных на самом деле также является полноценным исполняемым файлом, который мы будем называть unpacked0. Вот эта программа уже и есть настоящий дроппер, целью которого является установка вредоносного ПО на ЭВМ жертвы.

Структура кода дроппера довольно понятна и проста, написан, по-видимому, на «С». Файл внутри содержит строку «d:\programs\siberia\install\objfre_wxp_x86\i386\Install.pdb». Вряд ли это досадное упущение. Может быть, автор пытается таким образом сообщить антивирусным компаниям, «рекомендованное производителем» официальное название вируса?



Инсталляция


Проверка версии ОС. Если честно, то удивил меня этот кусок кода.
¶ В псевдокоде это выглядит так:
if Version.Major = 5
  if Version.Minor = 0
    is_win2k = 1
  else
    is_win2k = 0
else
  is_win2k = 0
is_win2k_temp = is_win2k

После чего идет еще три блока один в один: для XP и 2003 server. Зачем столько переменных и сколько сравнений? Короче, я эти танцы с бубном не понял.

Программа проверяет текущую версию ОС, и заканчивает свою работу, если это не Windows 2000, XP или 2003 server.

Базовый адрес. unpacked0, как и полагается правильному дестантнику, выясняет, где же он, в конце концов очутился. Для этого используется один самых простых методов поиска, основанный на том, что начало загруженного образа совпадает с началом страницы памяти. Ее размер умолчанию на наших обычных x86 компьютерах равна четырем килобайтам. Берется текущее место в коде, из него переходим на начало текущей страницы, ищем в начале сигнатуру MZ, если не найдено, переходим на предыдущую страницу.

Таблица импорта. Так как unpacked0 не может опираться на фиксированный базовый адрес, заданный при компиляции, то и таблица импорта должна быть обновлена. Для этого программа разбирает свой собственный заголовок (который находится в самом начале загруженного образа, а адрес его был найден на прошлом шаге), таким же способом разбирает заголовок библиотеки kernel32, находит ее таблцу экспорта, и методом простого сравнивания строк находит две основные функции: LoadLibraryA и GetProcAddress, используя их, загружает все остальные необходимые для его черного дела функции.

Извлечение драйвера. Да, черт возьми, опять драйвер. Вирусы без драйвера, похоже, уже только лохи пишут. Как некоторые уже догадались, тело драйвера содержится в ресурсах у unpacked0. Кстати, файл с драйвером содержит строку «d:\programs\siberia\protect\objfre_wxp_x86\i386\protect.pdb». Тенденция однако…



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

Извлечение winnt32.dll. А теперь, — внимание, — финт ушами. Из только что извлеченного драйвера извлекается еще один компонент. Из ресурсов, а как же. Теперь число компонент нашего вируса стало равно четырем: начальный файл xjolie, распакованный инстолер (unpacked0), драйвер и библиотека со скромным названием winnt32.dll.
Общая схема распаковка приведена на рисунке (синий цвет — код, коричневый — ресурсы).
Последовательная распаковка программ

Название «winnt32.dll» не случайно выбрано из «страшных», даже продвинутые пользователи вряд ли решатся удалить такой файл.
¶ 
kernel32!CreateFileA:
7c801a24 8bff            mov     edi,edi
0:000> da poi(esp+4)
0012feac  "C:\WINDOWS\System32\WinNt32.dll"


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

Настройка winnt32.dll. Собственно, использование библиотеки как основного файла троянца — ход интересный. Антивирусы и пользователи практически не обращают внимания на них, и в принципе, обоснованно: ведь не исполняемый файл, чего там. Но все-таки есть способы заставить систему загрузить библиотку и передать на нее управление. Способ, применяемый данным трояном, довольно оригинален: он использует механизм нотификаций процесса winlogon.

Для того, чтобы включить этот механизм, дроппер добавляет в раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify реестра следующие значения
DLLName: winnt32.dll
StartShell: WLEventStartShell
Impersonate: 0
Asynchronous: 0

(Список возможных параметров с описанием приводится здесь: msdn.microsoft.com/en-us/library/aa379402.aspx)

Это вкратце означает, что Winlogon при логине пользователя обязан загрузить winnt32.dll, вызвать у нее функцию WLEventStartShell, синхронно, не используя имперсонализацию — под тем же аккаунтом, под которым работает сам winlogon, то есть SYSTEM. Для пользователя, который будет логиниться, это означает Страшные Вещи.

На этом установка winnt32.dll закончена, и дроппер возвращается обратно к драйверу.

Установка драйвера. Перво-наперво, дроппер пробует подключиться к уже установленному драйверу, используя имя устройства ""\\.\Prot2". Если подключиться не получилось, то сохраняет тело драйвера в файл со случайным именем вида %SystemRoot%\System32\drivers\Wwwdd.sys, где W — заглавная, w — строчные буквы, d — цифры.
kernel32!CreateFileA:
7c801a24 8bff mov edi,edi
0:000> da poi(esp+4)
0012fc94 "C:\WINDOWS\System32\drivers\Hwo84.sys"


После этого драйвер регистрируется и запускается функциями API CreateService-StartService. Также дроппер добавляет нужные строки реестра в разделы
SYSTEM\CurrentControlSet\Control\SafeBoot\Network\
SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal\
SYSTEM\ControlSet002\Services\
SYSTEM\ControlSet001\Services\

То есть, при возврате к последней успешной конфигурации или загрузке в безопасном режиме драйвер все равно будет загружаться. Очень подло.

После чего вызывает cmd.exe с командной строкой /c del FILENAME >> NULL, удаляя себя с компьютера пользователя.

Вывод


Под личиной голой дивы скрывается не просто троян. Это целый программный комплекс из трех программ — инсталлятора, руткит-драйвера и динамической библиотеки режима пользователя. Техники, используемые для внедрения вредоносного кода, просты, действенны и не лишены оригинальности. Но, как всегда, замечу, что при запрещенной записи в %SYSTEMROOT%\system32, инсталлятор обламывается по полной.

Во второй части рассмотрим вредоносный функционал десантированной библиотеки winnt32.dll и ее темного драйвера-защитника.
Tags:
Hubs:
+19
Comments 11
Comments Comments 11

Articles