Главная→Блог→Исследования→ 7 мар 2012→Загадка фреймворка Duqu
В процессе анализа компонентов 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.
|
14 мар 2012, 15:25
Vala? |
|
13 мар 2012, 21:55
Do: |
|
0 |
Re:
Oh no, Murmoshka is a trap!!11
А вы, простите, что тут забыли вообще, если всюду ФСБ и прочие? Благими намерениями распугиваете обычный программистский народ? ФСБшникам в случае чего пробить базу трудоустройства и так проблемы не составит, а кто за шторкой сидит, тот и так не дурак и не спалится лишний раз.
|
13 мар 2012, 21:52
Мы пойдем в лукошко - два кота и кошка! |
|
13 мар 2012, 15:07
Пробовали выделить части которые можно назвать стандартными (списки, хэши) и поискать бинарные сигнатуры в большой выборке? |
|
0 |
Re:
2+2=5
Больной дошел до 4 стадии и не проснулся.
Водка несовместима с вождением.
Уважай правила. Води по-человечески.
Управление ГИБДД по Ярославской области.
|
13 мар 2012, 14:00
Странный код Duqu первоисточник тут: исправлено: Bazuzu, 13 мар 2012, 14:48 |
|
13 мар 2012, 00:31
to Игорь Суменков (continue of previous post) |
|
0 |
Re: to Игорь Суменков
О... ребята из ШАБАК подвалили...
Пошли пиво пить в пивную на Новокузнецкой
По следам боевой славы...
То есть последам аморального военного атташе,
Который так некстати засветился в постели с Наташей (она же Оксана), ну та, что с Демушкиным, из 31 ГКБ...
|
12 мар 2012, 21:59
Код на Dutu framework Если вы действительно хотите чтобы вам помогли, открыли бы для начала код Dutu написанный на неизвестном языке. По крайней мере можно будет сделать попытку восстановления конструкций языка по коду. исправлено: Bazuzu, 13 мар 2012, 00:00 |
|
0 |
|
12 мар 2012, 17:31
Может быть код был смешан. В смысле к примеру С++ + asm и может быть ещё "поковырялись" в дизассемблере. Такое смешание точно будет трудно распознать. Скорее невозможно. |
|
12 мар 2012, 15:29
to Игорь Суменков unknown framework :D |
|
12 мар 2012, 14:08
А теперь давайте все смешаем... |
|
0 |
Re:
А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.
|
0 |
Re:
А точнее, в СУП - писать закладки для выведения из строя компьютеров, за которыми сидят оппозиционеры, которых травят предатели, которые, увы, все еще работают у нас в конторе.
|
12 мар 2012, 11:50
Бесперспективно Бесперспективное, во всех отношениях, для вас занятие. Но из "уважения" к дяде Жене и Микро посоветовал бы, для полноты картины, покопать сети ЗАО АСЭ февралем 2010 и ОАО НИАЭП мартом 2012. Удачи. |
|
0 |
Re: Бесперспективно
Дядя Женя, как вы его назвали - обвиняемый по делу о разглашении государственной тайны и о государственной измене. Он в бегах, объявлен в международный розыск, сидит где-то в Англии, где шпионы МИ-5 ему приготовили место в атомном бункере, где как и в Раменках, вечное лето и птички поют механическими голосами
|
12 мар 2012, 11:40
Искать надо среди языков у которых корутины first-class citizens. OnCallbackFunc - типичный корутин, а система в целом написана в соответствии async pattern. Те объекты которые корутины принимаю в качестве this - это не объекты, это замыкания, они автоматически генерятся средой, отсюда и их колличество, и их мутная структура. Я работаю с Vala, мне это хорошо знакомо, но у вас не Vala. Vala завязан на GLib, и это сразу было бы видно, было бы много текстовых строк с именами классов, методов и т.д. Спросите у этих ребят: http://live.gnome.org/Vala они в этом настоящие звери. |
|
12 мар 2012, 08:53
? Простите, вы смотрели в сторону ASM подобных обьектно ориентированных оберток? Просто уж больно код красивый в дизасме... похож очень на то, что видишь после компиляции именно асм-программ. Возможно какая-нить вариация есстественно, типо fasm, nasm. Ведь этот язык в первую очередь и ценится за полную свободу, даже несмотря на рутинность некоторых вещей. |
|
11 мар 2012, 18:00
Не смотрели в сторону AngelScript и прочих встраиваемых языков, используемых в геймдеве? |
|
11 мар 2012, 14:48
если это и правда очень похоже на LISP, как написали в англоязычных комментах, то у меня есть версия - CLIPS. Компилируется в нативный код, связан с программированием микроконтроллеров... |
|
11 мар 2012, 14:47
Попробуйте Gambit Scheme он как раз в С транслирует и у него очень интересный компилятор. |
|
11 мар 2012, 11:40
а меня вот интересует вопрос-а зачем было вообще огород городить и делать какой-то там фраймворк на каком то там языке? Нафига!? Все что описано, легко можно было сделать на с/с++, или найти готовую реализацию... |
|
0 |
Re:
А ты слышал выражение "На воре шапка горит". Подумай, во-первых, почему Лабораторию Касперского заинтересовал именно Duqu (что на свете мало других вредоносных программ). И ответь на вопрос, почему эта Лаборатория Касперского вдруг работает и на ФСБ, с одной стороны, и на Майкрософт. И ты придешь к совершенно восхитительной мысли о том, что спецслужбы США и России, хотя и враждуют между собой, но некоторые грязные делишки все же делают сообща... Включай воображение, в мире столько всего интересного =)
Маша
|
1 |
Re:
> Люди с такими деньгами пойдут на все, чтобы не докопались до истины.
А в коде, судя по приведённым примерам, не было обфускации.
|
11 мар 2012, 09:41
SystemC или какие-нибудь трансляторы с "языков описания аппаратуры" |
|
11 мар 2012, 01:19
Была вот например такая штука: |
|
10 мар 2012, 19:39
Эрланг.Он как раз использует событийно-ориентированную поточную модель. |
|
0 |
Re:
Ты прав, друг! Но я поправлю, это не собственно Эрланг, а аналогичный ему язык, разработанный под задачи ЦРУ в недрах этой же организации. Кстати, похожий код обнаружили ребята из ИК ЦСТ в устройствах для бесконтактной связи, которые применяли в москве их шпионы для связи с нашими контрагентами.
|
0 |
Re: Re:
В нашем неспокойном мире ЦРУ не котируется, они стараются выглядеть тем, чем не являются.Гораздо опаснее частники.
Сейчас у частников денег и ресурсов побольше будет.
|
0 |
Re: Re: Re:
=))) Тебе рассказать, как умирают такие частники. Нередко через повешение. Почему? Потому что суициды с явной картиной самоповешения и очаровательной запиской типа "Прощайте, прошу считать меня коммунистом" никто и никогда не расследует. И концы в воду. Рассказать тебе про Асанжа?
|
10 мар 2012, 07:46
А какая вообще разница на чём он написан? Специалистам Лаборатории Касперского значит больше заняться нечем? Если любители пишут свои простенькие компиляторы, то и команда программистов которым хорошо платят напишет всё что угодно. исправлено: w8m, 10 мар 2012, 08:48 |
|
0 |
Re:
Вот именно! Это чистой воды провокация. ФСБ почти наверняка разрабатывает подобные программы, чтобы ставить бесконтактным способом "на контроль" наших оппозиционеров, так что им интересны все, кто в этом хоть что-то понимает, чтобы "нейтрализовать" их деятельность, ведь верно говорят, "не пали конторку".
Вы знаете, я уже шестой год в разведке служу, это стиль совершенно узнаваемый, они могут изменять адреса, пароли, явочные квартиры, сайты, ключи etcetera, но стиль они не меняют! Это очень сложно - изменить стиль.
Маша
|
0 |
|
0 |
|
0 |
Re: Re: Re: Re: Re:
Ладно, извините, мне пора идти заниматься.
Пишите на murmoshka(AT)bk.ru.
Спасибо
|
0 |
|
0 |
Re: Re: Re: Re: Re:
Это сведения ограниченного распространения.
Шокирует меня большей частью факт аморального поведения сотрудников "ЛК", являющихся внештатниками в ФСБ.
|
0 |
Re: Re: Re:
Ну они фашисты по своей морали, так что они будут использовать очень разные и совершенные методы. Ведь перемалывать людей как скот на бойне придумали далеко не нацисты, а англичане во время Англо-Бурской войны. Так и вирусы придумали на Западе, а применяют у нас. Хотя по этике и морали и те и те - палачи
|
10 мар 2012, 00:58
Есть мысль, что исходный код gcc открыт, а следовательно квалифицированному программисту не является проблемой сделать свой С/С++ компилятор, который будет генерировать немного странный код. При этом изначально это может быть вполне себе чистый С++. |
|
0 |
Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Хотите правду? Все насчет Duqu / Stuxnet / X67 уже давно известно?
Как?
Потому что кроме самодеятельных подментованных криминалистов, вроде здешних, есть еще огромная агентура СВР и ГРУ. Потому что в разработке вышеупомянутой платформы были задействованы около 4500 программистов в центре разработке программных средств в Санта-Барбаре. Потому что на эту тему была отослана в разведцентр в Тропарево хренова туча донесений и это все было обработано нашими аналитиками, в том числе, из ИК на Профсоюзной.
Вас тут держат некоторые авторы на форуме за откровенных идиотов.
Я еще раз и еще раз повторяю, что им не нужны ваши познания, им не нужна ваша помощь, потому что предоставленные тут данные, скриншоты, явно недостаточны для полноценного криминалистического заключения. Эта серия статей - сама является обманкой, им надо выяснить IP адреса и взять на контроль всех, кто интересуется антивирусной тематикой, потому что ФСБ ведет аналогичные разработки (я имею в виду 18 лабораторию в ЦСТ - Центре специальной техники) и поэтому им надо нейтрализовать всех, кто может потенциально даже рассекретить аналогичные российские разработки. Понятно?
Маша
|
1 |
Re: Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Мрак, пойду-ка я наверное шапочку из фольги куплю... :)
|
0 |
Re: Re: Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Не поможет от микроволн. учи биофизику
|
09 мар 2012, 18:15
Я конечно понимаю... но скажу Привет привет всем! |
|
09 мар 2012, 04:12
Поправка |
|
09 мар 2012, 04:02
Событийно ориентированное программирование Рулез, сами пользуем подобный фреймворк. |
|
09 мар 2012, 03:36
Передача параметров функций Такой вопрос: вы анализировали методы передачи параметров в функции? Наверняка да. |
|
09 мар 2012, 01:06
|
|
08 мар 2012, 22:34
хотелось бы подкинуть идею о том, что чисто теоретически сие может быть luajit'ом ;) На мысль натолкнуло заявление автора об реализации им под это дело нечто с названием DynAssembler ;) |
|
0 |
Re:
Lua'вский jit был проверен одним из первых. Генерит очень много функций рантайма, совсем не похожих на наш экземпляр.
|
08 мар 2012, 21:48
Возможно фрагмент кода в первом блоке принадлежит LabView Пруф линк: исправлено: ElfkbntVtyzGj;fkeqcnf, 08 мар 2012, 22:16 |
|
1 |
Re: Возможно фрагмент кода в первом блоке принадлежит LabView
Методы в дизассемблерном листинге мы назвали сами - это результат анализа кода.
Предположение интересное, спасибо, попробуем. Но, возможно, и не оно - по утверждению авторов LabView, скомпилированные им приложения сильно зависят от внешних библиотек рантайма.
|
0 |
Re: Re: Возможно фрагмент кода в первом блоке принадлежит LabView
Я тоже сразу про LabView подумал. Только не про LabView, а про LabWindows/CVI - он строит СИ-шный код для ваткомовского компилятора. Но увы, этот код полностью завязан на обработку сообщений от лицевой панели. Можно ли "отвязать"? Не знаю.
|
08 мар 2012, 19:29
Создание полноценного компилятора "с нуля", как известно, очень затратно, не очень верится, что сейчас кто-то будет его реализовывать (хотя вероятность всё же есть). Поэтому для начала неплохо бы определить, что именно использовалось для генерации машинного кода. Это может быть компилятор C (msvc, gcc, clang, watcom, borland, Intel C++ и.т.д.), компилятор какого-либо другого языка в машинный код (Delphi разве что вспоминается), общедоступный backend компилятора (их 2 - gcc и llvm). |
|
-1 |
Re:
Вполне вероятно, что исходный код на некотором языке был сначала транслирован в C, а затем уже с оптимизацией скомпилирован чем-то известным, в таком случае наиболее вероятный кандидат - gcc (на msvc не похоже, возможно clang).
В случае, если использовалась межмодульная оптимизация, соглашения вызовов могли быть успешно откинуты.
Исходных языков мы перепробовали много, в том числе и трансляторы в Си - пока без видимого успеха.
|
-1 |
Re: Re:
Гм. Кстати, мысль. Такие вещи умеет, например, XDS от компании Excelsior. Издохник пишется на Modula-2 или Обероне(в этих языках, кстати, и ООП прикручен), потом либо сразу линкуется, либо - что интересно! - предварительно при помощи XDSC перетранслируеся в C, чтобы можно было использовать любой другой компилятор.
|
0 |
Re: Re:
>>> В случае, если использовалась межмодульная оптимизация, соглашения вызовов могли быть успешно откинуты.
В теории да, если указано, что функция имеет тип связывания Internal Linkage (в терминах llvm), то никакого соглашения о передаче параметров соблюдать вообще не надо... довольно таки продвинутая оптимизация, может посмотреть, какие инструменты её поддерживают? Причём не просто поддерживают, а умеют распределять регистры произвольным образом, как в исходном коде трояна.
Ещё можно попробовать чисто визуально угадать, что за компилятор=) Открыть в IDA что-нибудь скомпилированное msvc, gcc, clang, попытаться выявить характерные признаки (прологи/эпилоги функций, реализация switch-ей, и.т.д.)
>>> Таблица функций объекта находится непосредственно в его памяти и может быть изменена в процессе выполнения.
Если копать в другом направлении (через язык), то это очень похоже на прототипный подход http://en.wikipedia.org/wiki/Prototype-based_programming (ссылку на русскую страницу движок искажает)
Если язык использует классовый подход, то абсолютно незачем хранить vtable в каждом объекте.. ну только если чтоб запутать исследователей кода :) Там же в википедии есть список языков, которые этот подход используют.
И ещё, по характеру кода довольно просто определить типизацию языка.. по тем фрагментам, что тут выложены, скорее всего используется статическая типизация.. не очень представляю, как язык с динамической типизацией можно настолько сильно оптимизировать. Хотя кто его знает, может и можно, пока ничего подобного не встречалось.
исправлено: eXtremal, 09 мар 2012, 01:07
Также в аналитике
В блоге