Главная→Блог→Исследования→ 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.
|
07 мар 2012, 23:33
паскаль/delphi/object pascal я надеюсь вы рассмотрели? |
|
2 |
Re:
>>> Каждый контекст потока запускает #171;основной цикл #187;...
Не Qt ли? его часто ошибочно считают фреймворком только для гуя, тогда как у него очень сильная базовая часть именно вот в таком стиле.
Или вообще Smalltalk - оттуда все вот это пошло и в Qt, и в Objective-C.
|
0 |
Re: Re:
Qt - фреймворк на известном нам языке. Язык точно не тот.
Попробовали Smalltalk MT (нативная компиляция под Windows) - точно не тот компилятор. Возможно, другой?
|
0 |
Re: Re: Re:
Игорь, точнее, человек, использующий имя Игорь, Вам это зачем?
Ведь давали вы присягу народу и закону служить. А разве это служение народу и закону?
|
1 |
Re: Re: Re: Re:
Без паники, видимо у него хобби такое, выяснять что на чём написано и чем скомпилировано.
|
08 мар 2012, 00:19
Это может быть .NET IL после обработки с помощью ngen.exe? |
|
08 мар 2012, 00:40
Erlang смотрели? |
|
08 мар 2012, 01:17
|
|
08 мар 2012, 04:12
Язык D рассматривали? |
|
08 мар 2012, 07:03
|
|
08 мар 2012, 09:20
Очень похоже на шитый код. Посмотрите реализации целевых компиляторов Форта. |
|
08 мар 2012, 10:07
OCaml это. |
|
0 |
|
08 мар 2012, 10:57
Google Go Language может быть? |
|
0 |
|
08 мар 2012, 11:07
Если вспомнить, что в команде Дуку есть люди, не чуждые промышленной автоматизации (вся та же история со Стухнетом) и обратить внимание на событийный подход к программированию, то сразу вспоминаются различные визуальные среды программирования, в которых программы рисуются в виде квадратиков, соединенных стрелочками, а потом все это превращается в СИ-шный или СИ++ код, который потом компилится чем угодно под какую угодно платформу. Возможно, это Isagraf, Codesys, да и тот же STEP 7. |
|
0 |
Re: Re:
Скорей, экзотические. В 90-х годах я видел (но не работал с ними) некоторые разработки этих систем, которые строили промежуточный Си-шный код. Могу ошибаться, но современные версии этих систем строят сразу исполняемый код или, сначала, какой-то внутренний p-код. Проверять надо. :(
|
-1 |
Re: Re: Re:
Ребята, вас элеметарно провоцируют на записи, вычисляют ваши адреса и ставят на контроль, скорее всего НЕ БУДЬТЕ БАРАНАМИ, это ЦИРК
|
08 мар 2012, 11:28
Событийно-ориентированная архитектура, возможно это выход из каких-то лабораторий, возможно гугла, т.е. сам язык может ещё не открыт, студенты уже пошаливают.. |
|
08 мар 2012, 11:42
Eiffel же! |
|
08 мар 2012, 12:29
Кандидаты Коль скоро упоминается Objective C, который является помесью C и Smalltalk, у меня есть пара кандидатов - нетрадиционные Smalltalk'и, умеющие генерировать машинный код (традиционные используют байткод, исполняемый на виртуальной машине). Это |
|
0 |
|
08 мар 2012, 14:46
Внесу своих 5 копеек. Есть у вас специалисты по Lisp-у? Смотрите в их сторону: возможно это какая-то модификация, а может и чистый lisp. |
|
08 мар 2012, 19:29
Создание полноценного компилятора "с нуля", как известно, очень затратно, не очень верится, что сейчас кто-то будет его реализовывать (хотя вероятность всё же есть). Поэтому для начала неплохо бы определить, что именно использовалось для генерации машинного кода. Это может быть компилятор C (msvc, gcc, clang, watcom, borland, Intel C++ и.т.д.), компилятор какого-либо другого языка в машинный код (Delphi разве что вспоминается), общедоступный backend компилятора (их 2 - gcc и llvm). |
|
-1 |
Re:
Вполне вероятно, что исходный код на некотором языке был сначала транслирован в C, а затем уже с оптимизацией скомпилирован чем-то известным, в таком случае наиболее вероятный кандидат - gcc (на msvc не похоже, возможно clang).
В случае, если использовалась межмодульная оптимизация, соглашения вызовов могли быть успешно откинуты.
Исходных языков мы перепробовали много, в том числе и трансляторы в Си - пока без видимого успеха.
|
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
|
-1 |
Re: Re:
Гм. Кстати, мысль. Такие вещи умеет, например, XDS от компании Excelsior. Издохник пишется на Modula-2 или Обероне(в этих языках, кстати, и ООП прикручен), потом либо сразу линкуется, либо - что интересно! - предварительно при помощи XDSC перетранслируеся в C, чтобы можно было использовать любой другой компилятор.
|
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, 22:34
хотелось бы подкинуть идею о том, что чисто теоретически сие может быть luajit'ом ;) На мысль натолкнуло заявление автора об реализации им под это дело нечто с названием DynAssembler ;) |
|
0 |
Re:
Lua'вский jit был проверен одним из первых. Генерит очень много функций рантайма, совсем не похожих на наш экземпляр.
|
09 мар 2012, 01:06
|
|
09 мар 2012, 03:36
Передача параметров функций Такой вопрос: вы анализировали методы передачи параметров в функции? Наверняка да. |
|
09 мар 2012, 04:02
Событийно ориентированное программирование Рулез, сами пользуем подобный фреймворк. |
|
09 мар 2012, 04:12
Поправка |
|
09 мар 2012, 18:15
Я конечно понимаю... но скажу Привет привет всем! |
|
10 мар 2012, 00:58
Есть мысль, что исходный код gcc открыт, а следовательно квалифицированному программисту не является проблемой сделать свой С/С++ компилятор, который будет генерировать немного странный код. При этом изначально это может быть вполне себе чистый С++. |
|
0 |
Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Хотите правду? Все насчет Duqu / Stuxnet / X67 уже давно известно?
Как?
Потому что кроме самодеятельных подментованных криминалистов, вроде здешних, есть еще огромная агентура СВР и ГРУ. Потому что в разработке вышеупомянутой платформы были задействованы около 4500 программистов в центре разработке программных средств в Санта-Барбаре. Потому что на эту тему была отослана в разведцентр в Тропарево хренова туча донесений и это все было обработано нашими аналитиками, в том числе, из ИК на Профсоюзной.
Вас тут держат некоторые авторы на форуме за откровенных идиотов.
Я еще раз и еще раз повторяю, что им не нужны ваши познания, им не нужна ваша помощь, потому что предоставленные тут данные, скриншоты, явно недостаточны для полноценного криминалистического заключения. Эта серия статей - сама является обманкой, им надо выяснить IP адреса и взять на контроль всех, кто интересуется антивирусной тематикой, потому что ФСБ ведет аналогичные разработки (я имею в виду 18 лабораторию в ЦСТ - Центре специальной техники) и поэтому им надо нейтрализовать всех, кто может потенциально даже рассекретить аналогичные российские разработки. Понятно?
Маша
|
1 |
Re: Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Мрак, пойду-ка я наверное шапочку из фольги куплю... :)
|
0 |
Re: Re: Не ведитесь, умоляю Вас, на провокации! Берегите Ваш разум!!!!!!!!!
Не поможет от микроволн. учи биофизику
|
10 мар 2012, 07:46
А какая вообще разница на чём он написан? Специалистам Лаборатории Касперского значит больше заняться нечем? Если любители пишут свои простенькие компиляторы, то и команда программистов которым хорошо платят напишет всё что угодно. исправлено: w8m, 10 мар 2012, 08:48 |
|
0 |
Re:
Вот именно! Это чистой воды провокация. ФСБ почти наверняка разрабатывает подобные программы, чтобы ставить бесконтактным способом "на контроль" наших оппозиционеров, так что им интересны все, кто в этом хоть что-то понимает, чтобы "нейтрализовать" их деятельность, ведь верно говорят, "не пали конторку".
Вы знаете, я уже шестой год в разведке служу, это стиль совершенно узнаваемый, они могут изменять адреса, пароли, явочные квартиры, сайты, ключи etcetera, но стиль они не меняют! Это очень сложно - изменить стиль.
Маша
|
0 |
|
0 |
Re: Re: Re:
Ну они фашисты по своей морали, так что они будут использовать очень разные и совершенные методы. Ведь перемалывать людей как скот на бойне придумали далеко не нацисты, а англичане во время Англо-Бурской войны. Так и вирусы придумали на Западе, а применяют у нас. Хотя по этике и морали и те и те - палачи
|
0 |
|
0 |
Re: Re: Re: Re: Re:
Это сведения ограниченного распространения.
Шокирует меня большей частью факт аморального поведения сотрудников "ЛК", являющихся внештатниками в ФСБ.
|
0 |
Re: Re: Re: Re: Re:
Ладно, извините, мне пора идти заниматься.
Пишите на murmoshka(AT)bk.ru.
Спасибо
|
0 |
|
10 мар 2012, 19:39
Эрланг.Он как раз использует событийно-ориентированную поточную модель. |
|
0 |
Re:
Ты прав, друг! Но я поправлю, это не собственно Эрланг, а аналогичный ему язык, разработанный под задачи ЦРУ в недрах этой же организации. Кстати, похожий код обнаружили ребята из ИК ЦСТ в устройствах для бесконтактной связи, которые применяли в москве их шпионы для связи с нашими контрагентами.
|
0 |
Re: Re:
В нашем неспокойном мире ЦРУ не котируется, они стараются выглядеть тем, чем не являются.Гораздо опаснее частники.
Сейчас у частников денег и ресурсов побольше будет.
|
0 |
Re: Re: Re:
=))) Тебе рассказать, как умирают такие частники. Нередко через повешение. Почему? Потому что суициды с явной картиной самоповешения и очаровательной запиской типа "Прощайте, прошу считать меня коммунистом" никто и никогда не расследует. И концы в воду. Рассказать тебе про Асанжа?
|
11 мар 2012, 01:19
Была вот например такая штука: |
|
11 мар 2012, 09:41
SystemC или какие-нибудь трансляторы с "языков описания аппаратуры" |
|
11 мар 2012, 11:40
а меня вот интересует вопрос-а зачем было вообще огород городить и делать какой-то там фраймворк на каком то там языке? Нафига!? Все что описано, легко можно было сделать на с/с++, или найти готовую реализацию... |
|
1 |
Re:
> Люди с такими деньгами пойдут на все, чтобы не докопались до истины.
А в коде, судя по приведённым примерам, не было обфускации.
|
0 |
Re:
А ты слышал выражение "На воре шапка горит". Подумай, во-первых, почему Лабораторию Касперского заинтересовал именно Duqu (что на свете мало других вредоносных программ). И ответь на вопрос, почему эта Лаборатория Касперского вдруг работает и на ФСБ, с одной стороны, и на Майкрософт. И ты придешь к совершенно восхитительной мысли о том, что спецслужбы США и России, хотя и враждуют между собой, но некоторые грязные делишки все же делают сообща... Включай воображение, в мире столько всего интересного =)
Маша
|
11 мар 2012, 14:47
Попробуйте Gambit Scheme он как раз в С транслирует и у него очень интересный компилятор. |
|
11 мар 2012, 14:48
если это и правда очень похоже на LISP, как написали в англоязычных комментах, то у меня есть версия - CLIPS. Компилируется в нативный код, связан с программированием микроконтроллеров... |
Также в аналитике
В блоге