Эксперты "Лаборатории Касперского" разгадали очередную загадку троянца Duqu

Источник: SecureList

В поисках решения

В предыдущем блогпосте про Фреймворк Duqu я писал про одну из нерешенных нами задач - определение языка, на котором написан необычный код, отвечающий за общение Duqu с C&C серверами. Нам, техническим специалистам, задача показалась очень интересной, и мы решили предложить IT-сообществу поучаствовать в ее решении.

Мы получили намного больше ответов, чем ожидали - более 200 комментариев и 60+ писем с указанием различных языков и фреймворков, которые могли быть использованы при создании кода Фреймворка Duqu. Мы хотим поблагодарить всех, кто участвовал в решении и помогал идентифицировать загадочный код.

Самыми популярными вариантами, которые вы предложили, были:

  • LISP (различные диалекты)
  • Forth
  • Erlang
  • Google Go
  • Delphi
  • OO C
  • Старые компиляторы C++ и других языков

Несколько комментариев оказались особенно полезными, благодаря им мы нашли решение, которое считаем верным.

Мы также получили два письма, в которых Pascal Bertrand и другой автор, пожелавший остаться анонимным, предположили, что код Фреймворка Duqu был создан с помощью одного из объектно-ориентированных диалектов языка С, называемых обычно "OO C".

Все эти комментарии оказались очень важными, они позволили точно определить компилятор, который был использован авторами Duqu, - компилятор из поставки Microsoft Visual Studio. После нескольких экспериментов с различными версиями MSVC и опциями компиляции мне удалось воспроизвести код функции конструктора, о котором я писал в предыдущем посте, и получить из этого кода бинарный код, совпадающий с найденным в Duqu.


Результат дизассемблирования кода Duqu: функция конструктора класса связного списка


Восстановленный вручную код этой функции на языке С

При компиляции указанного выше кода на С с помощью компилятора из поставки MSVC 2008 с опциями /O1 (оптимизация по размеру) и /Ob1 (разворачивать только __inline функции) получается машинный код, совпадающий с оригинальным кодом этой функции в Duqu. Следует заметить, что другие опции компиляции, а также изменение порядка операции и if/else блоков изменяет конечный код; компилятор MSVC 2005 также генерирует другой код. Из этого следует, что, скорее всего, Фреймворк Duqu был скомпилирован MSVC 2008 с опциями /O1 /Ob1 из исходного текста на языке С.

Благодаря полученным данным мы можем выделить два наиболее вероятных решения исходной задачи:

  1. Код был написан с использованием объектно-ориентированной надстройки С, основанной на макросах или стороннем препроцессоре. Это решение было предложено и в ваших комментариях, т.к. это стандартный способ реализации объектно-ориентированного подхода в С.
  2. Код был написан на чистом С с использованием объектно-ориентированных методов. Мы не можем полностью отрицать этот вариант, т.к. технически почти невозможно отличить препроцессор от программиста, практикующего разработку в режиме копирования/вставки.

Насколько мы можем судить по количеству однотипного кода в конструкторах и других функциях, все же использовался препроцессор, т.е. вариант 1 более вероятен.

В настоящее время существует несколько "ОО С" фреймворков с открытым исходным кодом, причем некоторые из них генерируют код, близкий к коду Duqu. Наиболее похожий код создается с помощью SOO (Simple Object Orientation for C), однако вряд ли именно он был использован - проект появился в то время, когда Duqu уже атаковал первые компьютеры-жертвы.

Независимо от того, какой из вариантов решения является правильным, можно сделать определенные выводы. В Payload DLL содержится 95 Кб событийно-ориентированного кода, написанного на ОО С, - языке без автоматического управления памятью, с небезопасными указателями. Подобный стиль программирования присущ серьезным "гражданским" программным проектам, но не встречается в современном вредоносном ПО. Более того, событийно-ориентированная модель была разработана как часть Duqu или его ОО расширения С.

Трудно однозначно определить причины использования ОО С вместо С++. Мы попробовали найти причины этого, опираясь на описания других ОО С проектов и пообщавшись с профессионалами, использующими подобные методы разработки. Наиболее вероятными причинами представляются:

  1. Недоверие к компиляторам С++. Это типично для разработчиков с многолетним опытом, которые начинали с ассемблера, а затем постепенно перешли на С. Когда появился С++, многие отказались от его использования из-за неявного управления памятью и запутанных конструкций, вызывавших неявное выполнение кода (конструкторы, операторы и т.п.).
  2. Широкая переносимость. Многие годы не было общего для всех компиляторов стандарта С++, возникали проблемы совместимости с компиляторами различных производителей. Если нужно было обеспечить компилируемость различными средствами разработки под несколько платформ, нужно было использовать С.

Обе причины явно указывают, что код Фреймворка был написан разработчиками "старой школы" с многолетним опытом работы.

Выводы

  • Фреймворк Duqu был написан на C и скомпилирован с помощью MSVC 2008 с опциями "/O1" и "/Ob1".
  • При разработке, скорее всего, использовалось собственное объектно-ориентированное расширение языка С, обычно называемое "ОО С".
  • Событийно-ориентированная архитектура была разработана как часть Фреймворка или в рамках расширения ОО С.
  • Код общения с C&C мог быть позаимствован из другого программного проекта и затем адаптирован к задачам проекта Duqu.

Мы полагаем, что разработка велась профессионалами, использующими наработки программистов "старой школы". Подход, который использовали авторы Duqu, обычно встречается в серьезных программных проектах, и почти никогда - во вредоносных программах. Это ещё раз указывает на то, что Duqu, как и Stuxnet, - уникальная разработка, выделяющаяся на фоне всех вредоносных программ.


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=28524