Главная→Блог→Исследования→ 7 мар 2012→Загадка фреймворка Duqu→2
В процессе анализа компонентов 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 прослеживаются явные особенности:
Все объекты являются экземплярами какого-либо класса, мы обнаружили в коде 60 различных классов. Каждый объект создаётся с помощью функции-конструктора, которая выделяет память, заполняет таблицу функций и инициализирует поля.
Функция-конструктор для класса связного списка
Расположение полей в памяти объекта зависит от конкретного класса. Например, не у всех классов таблица функций находится в начале. При этом у некоторых классов бинарно совместимы таблицы функций, но прямых указаний на наличие у них общего класса-предка, как в других объектно-ориентированных языках, не обнаруживается.
Расположение полей в объекте связного списка. Первые 10 полей — указатели на функции
Объекты удаляются с помощью функций-деструкторов. Типичный деструктор удаляет объекты-поля, затем освобождает память самого объекта.
Функция-деструктор для класса связного списка
Методы классов могут вызываться по указателю из таблицы функций (аналогично «виртуальным» функциям C++) или напрямую. В большинстве объектно-ориентированных языков методы получают параметр «this», при этом порядок передачи этого параметра обычно фиксирован — в определенном регистре или параметре в стеке. Однако для классов Фреймворка Duqu этот порядок не фиксирован — параметр может передаваться в любом регистре или в стеке.
Метод класса связного списка. Параметр «this» передается первым параметром в стеке
Реализация и содержание объектов в Фреймворке Duqu не совместимо с объектами C++, которые используются во всех других компонентах Duqu. Однако есть ещё одна особенность, которая активно используется во Фреймворке — парадигма событийно-ориентированного программирования.
Фреймворк содержит специальные объекты, которые реализуют свою модель обработки событий:
Модель напоминает среду исполнения языка Objective C, однако её реализация не похожа на код Objective C, создаваемый известными нам компиляторами данного языка.
Обработка событий в Фреймворке Duqu
Каждый контекст потока запускает «основной цикл», который следит за появлением новых объектов в списках событий и отложенных вызовов. Большая часть кода Duqu следует единому принципу: создать объект, привязать несколько обратных вызовов к собственным или внешним событиям и выйти. Затем мониторы событий отслеживают срабатывания данных событий и вызывают соответствующие функции обратного вызова в их потоках исполнения.
Пример псевдокода для объекта сетевого сокета:
Мы потратили много времени на анализ кода и можем с уверенностью утверждать, что Фреймворк Duqu написан не на Visual C++. Возможно, авторы использовали собственные средства для генерации конечного кода на C или написали его на другом языке программирования.
Мы хотели бы обратиться к сообществу разработчиков и попросить любого, кто знает средства разработки, языки или компиляторы, генерирующие подобный Фреймворку код, связаться с нами или оставить комментарий к посту. Мы надеемся, что это поможет нам разгадать и эту загадку в истории Duqu.
|
11 мар 2012, 18:00
Не смотрели в сторону AngelScript и прочих встраиваемых языков, используемых в геймдеве? |
|
12 мар 2012, 08:53
? Простите, вы смотрели в сторону ASM подобных обьектно ориентированных оберток? Просто уж больно код красивый в дизасме... похож очень на то, что видишь после компиляции именно асм-программ. Возможно какая-нить вариация есстественно, типо fasm, nasm. Ведь этот язык в первую очередь и ценится за полную свободу, даже несмотря на рутинность некоторых вещей. |
|
12 мар 2012, 11:40
Искать надо среди языков у которых корутины first-class citizens. OnCallbackFunc - типичный корутин, а система в целом написана в соответствии async pattern. Те объекты которые корутины принимаю в качестве this - это не объекты, это замыкания, они автоматически генерятся средой, отсюда и их колличество, и их мутная структура. Я работаю с Vala, мне это хорошо знакомо, но у вас не Vala. Vala завязан на GLib, и это сразу было бы видно, было бы много текстовых строк с именами классов, методов и т.д. Спросите у этих ребят: http://live.gnome.org/Vala они в этом настоящие звери. |
|
12 мар 2012, 11:50
Бесперспективно Бесперспективное, во всех отношениях, для вас занятие. Но из "уважения" к дяде Жене и Микро посоветовал бы, для полноты картины, покопать сети ЗАО АСЭ февралем 2010 и ОАО НИАЭП мартом 2012. Удачи. |
|
0 |
Re: Бесперспективно
Дядя Женя, как вы его назвали - обвиняемый по делу о разглашении государственной тайны и о государственной измене. Он в бегах, объявлен в международный розыск, сидит где-то в Англии, где шпионы МИ-5 ему приготовили место в атомном бункере, где как и в Раменках, вечное лето и птички поют механическими голосами
|
12 мар 2012, 14:08
А теперь давайте все смешаем... |
|
0 |
Re:
А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.
|
0 |
Re:
А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.
|
12 мар 2012, 15:29
to Игорь Суменков unknown framework :D |
|
12 мар 2012, 17:31
Может быть код был смешан. В смысле к примеру С++ + asm и может быть ещё "поковырялись" в дизассемблере. Такое смешание точно будет трудно распознать. Скорее невозможно. |
|
12 мар 2012, 21:59
Код на Dutu framework Если вы действительно хотите чтобы вам помогли, открыли бы для начала код Dutu написанный на неизвестном языке. По крайней мере можно будет сделать попытку восстановления конструкций языка по коду. исправлено: Bazuzu, 13 мар 2012, 00:00 |
|
0 |
|
13 мар 2012, 00:31
to Игорь Суменков (continue of previous post) |
|
0 |
Re: to Игорь Суменков
О... ребята из ШАБАК подвалили...
Пошли пиво пить в пивную на Новокузнецкой
По следам боевой славы...
То есть последам аморального военного атташе,
Который так некстати засветился в постели с Наташей (она же Оксана), ну та, что с Демушкиным, из 31 ГКБ...
|
13 мар 2012, 14:00
Странный код Duqu первоисточник тут: исправлено: Bazuzu, 13 мар 2012, 14:48 |
|
13 мар 2012, 15:07
Пробовали выделить части которые можно назвать стандартными (списки, хэши) и поискать бинарные сигнатуры в большой выборке? |
|
0 |
Re:
2+2=5
Больной дошел до 4 стадии и не проснулся.
Водка несовместима с вождением.
Уважай правила. Води по-человечески.
Управление ГИБДД по Ярославской области.
|
13 мар 2012, 21:52
Мы пойдем в лукошко - два кота и кошка! |
|
13 мар 2012, 21:55
Do: |
|
0 |
Re:
Oh no, Murmoshka is a trap!!11
А вы, простите, что тут забыли вообще, если всюду ФСБ и прочие? Благими намерениями распугиваете обычный программистский народ? ФСБшникам в случае чего пробить базу трудоустройства и так проблемы не составит, а кто за шторкой сидит, тот и так не дурак и не спалится лишний раз.
|
14 мар 2012, 15:25
Vala? |
Также в аналитике
В блоге