Голая правда

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

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


    Как это случается часто, в последнее время, новые вирусы приходят прямиком в почту, — быстро, удобно и совсем не надо напрягаться. Последний вирус прислал себя вот в таком вот письме:
    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 и ее темного драйвера-защитника.
    Поделиться публикацией

    Похожие публикации

    Комментарии 11

      0
      Гениально. Настоящме Хакеры.

      В смысле как Торвальдс...
        0
        интересная статья. спасибо
          0
          Браво!

          Кстати, Winnt32.dll - вполне себе Donwloader. Препарировал на днях, описалово - тут (http://vilgeforce.habrahabr.ru/blog/4374…). Помимо sysenter есть и другие "фишки" - например doserrno, который еще и на разных версиях системы разный результат возвращает. Кстати, Pakes касперыча, если я ничего не путаю - это когда они только упаковщик опознали. А он тут характерный...
            0
            мда,
            Распакованный драйвер - Trojan-Dropper.Win32.Agent.rek
            Нераспакованная winnt32.dll (еще не распаковывал) - Trojan-Downloader.Win32.Mutant.yq

            бардак (
            –3
            К чемубы этот пост?
            1. Может нам хоят расказать как работают вирусы???
            2. Или это краткая инструкция по эксплуатации?
            3.
            > Под личиной голой дивы скрывается не просто троян. Это целый программный комплекс из трех
            > программ - инстраллятора, руткит-драйвера и динамической библиотеки режима пользователя.
            Очень инетерсно)

            >Техники, [b]используемые для внедрения вредоносного кода,[/b]
            Самое интересное в этом, что основной _исполняющий код_ - это пользователь.
            >>> Честно говоря не урладывается в голове как такое может быть:
            >>> Пользователь получивщий якобы скринсервер размером в 100 килобайт. Упаковынный Zipом.
            >>> Думает:::
            >>> "- ого О.о Перис Хилтон ))) подружка моей соседки прислала мне рыбок в аквариуме....
            >>> -Как замечательно. Всегда мечтал =)" И начинает распаковывать и запускать.
            Где здесь логика.....
            Ужас.... ну такое исполнить ?!

            >просты, действенны и не лишены оригинальности. Но, как всегда, замечу, что при запрещенной >записи в %SYSTEMROOT%\system32, >инсталлятор обламывается по полной.

            Нууу это уже совсем ... если условный пользователь начинает запускать у себя на компе приложения неизвестно откого пришедшие... то я уж не думаю что он позаботится о защиет ветки реестра %)
              0
              Минусующий ... может объяснишь?
                0
                1 - да
                2 - да
                3 - да
                4 - логики тут нет. поэтому спам и рассылают, что он _работает_, поэтому и ботнеты оценивают в хрен знает сколько миллионов машин.
                5 - есть надежда, что прочитав, позботится

                не минусовал
              0
              почти ничего в вирусах не понимаю, а читать интересно. Как детектив :)
                0
                Пишите ещё =)

                В своё время работал над антиспайваре софтом - ностальгия захлестнула прям.
                  0
                  Интересно читать :) Я, как системный администратор, глубоко в вирусы не лезу, но вычищать всякую гадость всегда интересно, и нотификации winlogon'a это не такая уж и редкость в наше время, и драйвера ставят правда почти все вирусы (те что не ставят - удаляются на раз). Всё труднее и труднее лечить становится. Вспоминаю как пару-тройку лет назад было трудно вычищать всякие BHO и сравниваю с тем, что теперь творится, жить становится все лучше, жить становится все веселее :) Зачастую единственный способ удалить - только загрузка с чистого носителя. Пишите еще.
                    0
                    да, сейчас обе стороны копают все глубже, и конца этому не видно.
                    спасибо

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое