Russian
Интернет находится в нормальном состоянии, крупных эпидемий и других серьезных инцидентов службой мониторинга «Лаборатории Касперского» не зафиксировано. Уровень опасности: 1

Загадка фреймворка Duqu

Игорь Суменков
Эксперт «Лаборатории Касперского»
опубликовано 7 мар 2012, 19:58  MSK
Сюжеты: Duqu
0.5
 

В процессе анализа компонентов Duqu мы обнаружили интересную особенность в его основном компоненте, который реализует практически всю его бизнес-логику — в Payload DLL. Мы хотели бы поделиться полученной информацией и попросить о помощи в анализе данных.

Расположение кода

На первый взгляд, Payload DLL выглядит как обычная загружаемая библиотека формата Windows PE, скомпилированная Microsoft Visual Studio 2008 (версия компоновщика 9.0). Код, расположенный в точке входа, абсолютно стандартный. Единственная экспортируемая функция под номером 1 тоже написана на MSVC++. Эта функция вызывается из PNF DLL и реализует весь функционал данной библиотеки – соединение и общение с C&C серверами, получение и выполнение дополнительных модулей троянца. Интересные детали обнаруживаются при более глубоком анализе кода, который вызывается этой функцией в процессе работы.

Содержимое секции кода Payload DLL типично для исполняемого файла, скомпонованного из нескольких исходных модулей. Секцию можно условно разделить на несколько разделов, каждый из которых соответствует одному или нескольким файлам исходного кода. Большая часть разделов присутствует в любой программе, написанной на C++, — это, например, функции стандартной библиотеки шаблонов STL, функции стандартной библиотеки языка и собственно код программы. Однако самый большой раздел, реализующий всю логику общения с C&C серверами, отличается от них во всем.


Содержимое секции кода Payload DLL

Этот раздел не типичен для C++ программ, потому что его исходный код – не C++. Код внутри раздела не обращается к другим функциям программы, написанным на C++, и не использует стандартную библиотеку языка, хотя используемые парадигмы явно указывают, что исходный текст был написан на объектно-ориентированном языке программирования. Мы назвали это Фреймворком Duqu.

Фреймворк

Особенности

В коде Фреймворка Duqu прослеживаются явные особенности:

  • Весь функционал реализуют объекты.
  • Таблица функций объекта находится непосредственно в его памяти и может быть изменена в процессе выполнения.
  • Нет явных отличий между классами, которые можно было бы отнести к какой-либо стандартной библиотеке (связные списки, хэш-таблицы), и классами троянца.
  • Объекты общаются между собой с помощью прямых вызовов их методов, отложенных вызовов и объектов для обратного вызова по событию.
  • Не используются функции стандартных библиотек, при этом активно используются функции Windows API.

Объекты

Все объекты являются экземплярами какого-либо класса, мы обнаружили в коде 60 различных классов. Каждый объект создаётся с помощью функции-конструктора, которая выделяет память, заполняет таблицу функций и инициализирует поля.


Функция-конструктор для класса связного списка

Расположение полей в памяти объекта зависит от конкретного класса. Например, не у всех классов таблица функций находится в начале. При этом у некоторых классов бинарно совместимы таблицы функций, но прямых указаний на наличие у них общего класса-предка, как в других объектно-ориентированных языках, не обнаруживается.


Расположение полей в объекте связного списка. Первые 10 полей — указатели на функции

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


Функция-деструктор для класса связного списка

Методы классов могут вызываться по указателю из таблицы функций (аналогично «виртуальным» функциям C++) или напрямую. В большинстве объектно-ориентированных языков методы получают параметр «this», при этом порядок передачи этого параметра обычно фиксирован — в определенном регистре или параметре в стеке. Однако для классов Фреймворка Duqu этот порядок не фиксирован — параметр может передаваться в любом регистре или в стеке.


Метод класса связного списка. Параметр «this» передается первым параметром в стеке

Событийно-ориентированное программирование

Реализация и содержание объектов в Фреймворке Duqu не совместимо с объектами C++, которые используются во всех других компонентах Duqu. Однако есть ещё одна особенность, которая активно используется во Фреймворке — парадигма событийно-ориентированного программирования.

Фреймворк содержит специальные объекты, которые реализуют свою модель обработки событий:

  • Объект события, использующий системные объекты Windows API.
  • Контексты потоков, хранящие состояния потоков, списки принадлежащих им событий и очереди отложенных вызовов.
  • Объекты обратных вызовов, связывающиеся с объектами событий.
  • Мониторы событий, которые создаются в каждом потоке и отвечают за обратные вызовы по срабатыванию событий.
  • Глобальных объект, хранящий список всех контекстов потоков.

Модель напоминает среду исполнения языка Objective C, однако её реализация не похожа на код Objective C, создаваемый известными нам компиляторами данного языка.


Обработка событий в Фреймворке Duqu

Каждый контекст потока запускает «основной цикл», который следит за появлением новых объектов в списках событий и отложенных вызовов. Большая часть кода Duqu следует единому принципу: создать объект, привязать несколько обратных вызовов к собственным или внешним событиям и выйти. Затем мониторы событий отслеживают срабатывания данных событий и вызывают соответствующие функции обратного вызова в их потоках исполнения.

Пример псевдокода для объекта сетевого сокета:

SocketObjectConstructor {
    NativeSocket = socket();
    SocketEvent = new MonitoredEvent(NativeSocket);
    SocketObjectCallback = new ObjectCallback(this, SocketEvent, OnCallbackFunc);
    connect(NativeSocket, ...);
}
OnCallbackFunc {
    switch(GetType(Event)) {
    case Connected: ...
    case ReadData: ...
...}
}

Выводы

  • Фреймворк Duqu, возможно, написан на неизвестном языке программирования.
  • В отличие от остальных компонентов Duqu, исходный язык Фреймворка— не C++, при этом использован отличный от Microsoft's Visual C++ 2008 компилятор.
  • Событийно-ориентированная архитектура позволяет коду выполняться в разных, в том числе асинхронных средах.
  • С учетом масштаба проекта Duqu можно предположить, что Фреймворк разрабатывала отдельная команда, не связанная с авторами эксплойтов и остальных его компонентов.
  • Загадочный язык программирования — определенно НЕ C++, Objective C, Java, Python, Ada, Lua и не многие другие языки, которые мы проверили.
  • Фреймворк Duqu — одна из особенностей, значительно отличающих Duqu от Stuxnet, который полностью написан на MSVC++.

Фреймворк Duqu: что же это?

Мы потратили много времени на анализ кода и можем с уверенностью утверждать, что Фреймворк Duqu написан не на Visual C++. Возможно, авторы использовали собственные средства для генерации конечного кода на C или написали его на другом языке программирования.

Мы хотели бы обратиться к сообществу разработчиков и попросить любого, кто знает средства разработки, языки или компиляторы, генерирующие подобный Фреймворку код, связаться с нами или оставить комментарий к посту. Мы надеемся, что это поможет нам разгадать и эту загадку в истории Duqu.


89 комментариев

Murmoshka

09 мар 2012, 18:15
0
 

Я конечно понимаю... но скажу

Привет привет всем!
Зовут меня Маша, Лукьянова, я вам вот что скажу.
Вся эта череда статей насчет вируса Duqu напоминает хорошо заезженный ФСБ-щный спектакль. Цель спектакля, по моему мнению, не узнать подробности насчет Duqu\Stuxnet, а выявить сетевых авторов, которые располагают какими-то знаниями насчет подобных вирусных технологий, открыть на них ДОУ и поставить их на контроль.

Зачем это нужно ФСБ?

Потому что программисты тесно общаются между собой, а даже у нас в Москве есть группы программистов, которые пишут по заказу ФСБ подобные вирусные программы. Некоторые из них прицельно встраиваются на личные страницы бесплатных сетевых вирусов типа Mail.ru или Vkontakte, другие реализуются путем подмены целевых сайтов (например, в режиме эмуляции сервера какой-нибудь газеты).

А ФСБ очень не любит, когда, говоря языком их агентов "кто-то палит конторку". Поэтому я бы на месте всех авторов выше приведенных комментариев не писала бы г-ну Гостеву и иже с ним НИЧЕГО.

Не поддерживайте тех, кто не против заниматься нечестными делами.

С уважением, Маша

Для добавления комментариев необходимо


Bookmark and Share
Закладки

Также в аналитике

В блоге