Главная→Блог→Исследования→19 мар 2012→Фреймворк Duqu: задача решена
В предыдущем блогпосте про Фреймворк Duqu я писал про одну из нерешенных нами задач — определение языка, на котором написан необычный код, отвечающий за общение Duqu с C&C серверами. Нам, техническим специалистам, задача показалась очень интересной, и мы решили предложить IT-сообществу поучаствовать в ее решении.
Мы получили намного больше ответов, чем ожидали — более 200 комментариев и 60+ писем с указанием различных языков и фреймворков, которые могли быть использованы при создании кода Фреймворка Duqu. Мы хотим поблагодарить всех, кто участвовал в решении и помогал идентифицировать загадочный код.
Самыми популярными вариантами, которые вы предложили, были:
Несколько комментариев оказались особенно полезными, благодаря им мы нашли решение, которое считаем верным. Наиболее важными оказались следующие сообщения:
igorsk
Simple Object Orientation (for C)
It seems someone over at reddit (http://www.reddit.com/r/ReverseEngineering/) hit the jackpot: the code snippets look _very_ similar to what this would produce: http://daifukkat.su/wiki/index.php/SOO
There are a few other OO frameworks for C, but they don't match as well: http://ooc-coding.sourceforge.net/ http://sooc.sourceforge.net/
Jonwil
Re: Other C/C++ compiler?
I have seen how GCC works internally and its ABI (for a number of different versions) and I can confirm that the Duqu code is definitely not generated by GCC. I don’t know how other C++ compilers work but the things I see in the ASM (like where the pointers to the functions go, the way the "this" pointer is passed etc) do not suggest C++ to me but something else entirely. (such as the aforementioned "object-oriented" frameworks for C that exist)
igorsk
Re: Other C/C++ compiler?
I’m 99% sure the machine code was generated by MSVC. It’s something you get a feel with experience, but I can point out two things that are quite characteristic of MSVC: 1) it uses esi as the first candidate for temporary storage; 2) "pop ecx" instead of "add esp, 4".
Мы также получили два письма, в которых 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 более вероятен.
В настоящее время существует несколько «ОО С» фреймворков с открытым исходным кодом, причем некоторые из них генерируют код, близкий к коду Duqu. Наиболее похожий код создается с помощью SOO (Simple Object Orientation for C), однако вряд ли именно он был использован — проект появился в то время, когда Duqu уже атаковал первые компьютеры-жертвы.
Независимо от того, какой из вариантов решения является правильным, можно сделать определенные выводы. В Payload DLL содержится 95 Кб событийно-ориентированного кода, написанного на ОО С, — языке без автоматического управления памятью, с небезопасными указателями. Подобный стиль программирования присущ серьезным «гражданским» программным проектам, но не встречается в современном вредоносном ПО. Более того, событийно-ориентированная модель была разработана как часть Duqu или его ОО расширения С.
Трудно однозначно определить причины использования ОО С вместо С++. Мы попробовали найти причины этого, опираясь на описания других ОО С проектов и пообщавшись с профессионалами, использующими подобные методы разработки. Наиболее вероятными причинами представляются:
Обе причины явно указывают, что код Фреймворка был написан разработчиками «старой школы» с многолетним опытом работы.
Мы полагаем, что разработка велась профессионалами, использующими наработки программистов «старой школы». Подход, который использовали авторы Duqu, обычно встречается в серьезных программных проектах, и почти никогда — во вредоносных программах. Это ещё раз указывает на то, что Duqu, как и Stuxnet, — уникальная разработка, выделяющаяся на фоне всех вредоносных программ.
10 комментариев
|
20 мар 2012, 21:03
Re: Re: Юмор не оценил. Лучше сначала ответь на вопрос, какое это вообще имеет значение на каком языке он написан? То что в показанных примерах код генерируемый сишными компиляторами, это и так было понятно. |
Также в аналитике
В блоге