|
|
|||||||||||||||||||||||||||||
|
Эксперты "Лаборатории Касперского" разгадали очередную загадку троянца DuquИсточник: SecureList
В поисках решенияВ предыдущем блогпосте про Фреймворк Duqu я писал про одну из нерешенных нами задач - определение языка, на котором написан необычный код, отвечающий за общение Duqu с C&C серверами. Нам, техническим специалистам, задача показалась очень интересной, и мы решили предложить IT-сообществу поучаствовать в ее решении. Мы получили намного больше ответов, чем ожидали - более 200 комментариев и 60+ писем с указанием различных языков и фреймворков, которые могли быть использованы при создании кода Фреймворка Duqu. Мы хотим поблагодарить всех, кто участвовал в решении и помогал идентифицировать загадочный код. Самыми популярными вариантами, которые вы предложили, были:
Несколько комментариев оказались особенно полезными, благодаря им мы нашли решение, которое считаем верным. Мы также получили два письма, в которых Pascal Bertrand и другой автор, пожелавший остаться анонимным, предположили, что код Фреймворка Duqu был создан с помощью одного из объектно-ориентированных диалектов языка С, называемых обычно "OO C". Все эти комментарии оказались очень важными, они позволили точно определить компилятор, который был использован авторами Duqu, - компилятор из поставки Microsoft Visual Studio. После нескольких экспериментов с различными версиями MSVC и опциями компиляции мне удалось воспроизвести код функции конструктора, о котором я писал в предыдущем посте, и получить из этого кода бинарный код, совпадающий с найденным в 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, - уникальная разработка, выделяющаяся на фоне всех вредоносных программ.
|
|