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 комментариев

старые сверху
«дерево»
 

AlpenColt

11 мар 2012, 18:00
0
 

Не смотрели в сторону AngelScript и прочих встраиваемых языков, используемых в геймдеве?

DrDevil666

12 мар 2012, 08:53
0
 

?

Простите, вы смотрели в сторону ASM подобных обьектно ориентированных оберток? Просто уж больно код красивый в дизасме... похож очень на то, что видишь после компиляции именно асм-программ. Возможно какая-нить вариация есстественно, типо fasm, nasm. Ведь этот язык в первую очередь и ценится за полную свободу, даже несмотря на рутинность некоторых вещей.

Aleck

12 мар 2012, 11:40
0
 

Искать надо среди языков у которых корутины first-class citizens. OnCallbackFunc - типичный корутин, а система в целом написана в соответствии async pattern. Те объекты которые корутины принимаю в качестве this - это не объекты, это замыкания, они автоматически генерятся средой, отсюда и их колличество, и их мутная структура. Я работаю с Vala, мне это хорошо знакомо, но у вас не Vala. Vala завязан на GLib, и это сразу было бы видно, было бы много текстовых строк с именами классов, методов и т.д. Спросите у этих ребят: http://live.gnome.org/Vala они в этом настоящие звери.

KapNemo

12 мар 2012, 11:50
-1
 

Бесперспективно

Бесперспективное, во всех отношениях, для вас занятие. Но из "уважения" к дяде Жене и Микро посоветовал бы, для полноты картины, покопать сети ЗАО АСЭ февралем 2010 и ОАО НИАЭП мартом 2012. Удачи.

Murmoshka

13 мар 2012, 21:50
0
 

Re: Бесперспективно

Дядя Женя, как вы его назвали - обвиняемый по делу о разглашении государственной тайны и о государственной измене. Он в бегах, объявлен в международный розыск, сидит где-то в Англии, где шпионы МИ-5 ему приготовили место в атомном бункере, где как и в Раменках, вечное лето и птички поют механическими голосами

killy

12 мар 2012, 14:08
0
 

А теперь давайте все смешаем...

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

с ув.

Murmoshka

13 мар 2012, 21:58
0
 

Re:

А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.

Murmoshka

13 мар 2012, 21:58
0
 

Re:

А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.

nlo

12 мар 2012, 15:29
1
 

to Игорь Суменков

unknown framework :D

sample code from Payload DLL
http://i42.tinypic.com/2637ptg.png

sample code from other DLL
http://i43.tinypic.com/242iqkp.png

1
 

Может быть код был смешан. В смысле к примеру С++ + asm и может быть ещё "поковырялись" в дизассемблере. Такое смешание точно будет трудно распознать. Скорее невозможно.
Причина смешения кода можно объяснить как угодно. К примеру может быть создателей вируса было несколько и вирус разрабатывался по частям на разных языках программирования, а потом всё было скомпилировано в одну программу.
Удачи.

Bazuzu

12 мар 2012, 21:59
1
 

Код на Dutu framework

Если вы действительно хотите чтобы вам помогли, открыли бы для начала код Dutu написанный на неизвестном языке. По крайней мере можно будет сделать попытку восстановления конструкций языка по коду.

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

исправлено: Bazuzu, 13 мар 2012, 00:00

w8m

13 мар 2012, 08:23
0
 

Re: Код на Dutu framework

Правильно. Просят помощи, а ничего показывать не хотят.

nlo

13 мар 2012, 00:31
0
 

to Игорь Суменков

(continue of previous post)
duqu mystery == http://i44.tinypic.com/34htic3.png

Murmoshka

13 мар 2012, 21:57
0
 

Re: to Игорь Суменков

О... ребята из ШАБАК подвалили...
Пошли пиво пить в пивную на Новокузнецкой
По следам боевой славы...
То есть последам аморального военного атташе,
Который так некстати засветился в постели с Наташей (она же Оксана), ну та, что с Демушкиным, из 31 ГКБ...

Bazuzu

13 мар 2012, 14:00
0
 

Странный код Duqu

первоисточник тут:
http://contagiodump.blogspot.com/2011/10/duqu-rat-trojan-precursor-to-next.html

1)
def ror(byte, count):
while count > 0:
byte = (byte >> 1 | byte << 7) 0xFF
count -= 1
return byte

2)
def decode (key, data):
keyxform = key ^ 0x8471122
decoded=''
for x in data:
decoded+= chr(ord(x)^(keyxform 0xff))

keymorph=ror(keyxform,3)
keyxform = ((((keymorph * keymorph) * 0x1e2d6da3) >> 0xc) + (0x4747293 * keymorph) + 1) ^ keymorph
return decoded
the ror is needed

Интересно что будут делать наши тайнохранители из Касперского когда в следующей версии весь код будет таким? ))) Ребята вы реально хотите разобраться с эти в одиночку?

Единственный аналог для примера ?1 (но это все же не то) это разложение полинома в двоичном поле Галуа (что жесть).

ОПИСАНИЕ:
Рассмотрим теперь программную процедуру, реализующую деление
на примитивный неприводимый многочлен х**3+х+1 в поле Галуа
GF(8), представленную короткой программой на языке Бейсик.
Переменные в ней рассматриваются как целые числа.

'программа деления на многочлен х**З+х+1
DEFINT A-Z
n = 1
DO
m = О

'-----------расчет бита переноса
IF n AND 2^2 THEN m = m+1
IF n AND 2^0 THEN m = m + 1
n = 2 * (n AND (2^2-1)) OR (m AND 1)
LOOP UNTIL n = 1
END

исправлено: Bazuzu, 13 мар 2012, 14:48

iso1600

13 мар 2012, 15:07
0
 

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

Murmoshka

13 мар 2012, 22:05
0
 

Re:

2+2=5
Больной дошел до 4 стадии и не проснулся.
Водка несовместима с вождением.
Уважай правила. Води по-человечески.
Управление ГИБДД по Ярославской области.

Murmoshka

13 мар 2012, 21:52
0
 

Мы пойдем в лукошко - два кота и кошка!
Отказ от назначения генералом грозит разжалованием в рядовые.
Клизма перед операцией назначается почти всегда, если операция плановая и нет противопоказаний.
На копейку уже ничего не купишь.
А хочешь, мы прямо сейчас полетим в Лилль? Ты был в Лилле, Серый?

Murmoshka

13 мар 2012, 21:55
0
 

Do:
Print "Я самый умный криминалист во всех Раменках":
Print "Умнее меня нет никого на этом свете, по крайней мере, в ЦСТ НТЦ ФСБ":
Loop:

Compile
Make
Run

Enjoy

haiku

12 июн 2012, 11:56
0
 

Re:

Oh no, Murmoshka is a trap!!11
А вы, простите, что тут забыли вообще, если всюду ФСБ и прочие? Благими намерениями распугиваете обычный программистский народ? ФСБшникам в случае чего пробить базу трудоустройства и так проблемы не составит, а кто за шторкой сидит, тот и так не дурак и не спалится лишний раз.

Кирюшык

14 мар 2012, 15:25
0
 

Vala?

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


Bookmark and Share
Закладки

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

В блоге