Две недели назад специалисты «Лаборатории Касперского» обратились к сообществу с просьбой помочь определить язык программирования, на котором написана троянская программа Duqu. Обнаруженная в октябре 2011 года, она до сих пор ставила в тупик экспертов.
«Лаборатория Касперского» сначала обратились к экспертам по реверс-инжинирингу, но те ничем не смогли помочь. Ясно было, что язык программирования — определённо не C++, не Objective C, не Java, не Python, не Ada, не Lua и ещё не 30 других языков программирования, которые они проверили. После нескольких месяцев безуспешных попыток анализа оставалось только предположить, что ключевой фрагмент вредоносной программы написан на неком неизвестном языке.
Однако, благодаря помощи сообщества эту головоломку всё-таки удалось решить.
![](https://habrastorage.org/r/w1560/storage2/e79/a97/811/e79a97811f39b0d5094fdc4aab43e653.png)
Функция-конструктор для класса связного списка
![](https://habrastorage.org/r/w1560/storage2/d4e/c78/481/d4ec7848100214654ded220c2a502ef0.png)
Функция-деструктор для класса связного списка
Специалисты «Лаборатории Касперского» получили более 200 комментариев и более 60 писем с указанием различных языков и фреймворков. Благодаря помощи с форумов Reddit и от независимых разработчиков в итоге удалось понять, что авторами Duqu был использован компилятор из поставки Microsoft Visual Studio.
После нескольких экспериментов с различными версиями MSVC и опциями компиляции специалист «Лаборатории Касперского» Игорь Суменков сумел воспроизвести код функции конструктора с первого скриншота и получить из этого кода бинарный код, совпадающий с найденным в Duqu.
Вот восстановленный вручную код этой функции на языке C.
![](https://habrastorage.org/r/w1560/storage2/f05/bfd/3e4/f05bfd3e460546ac2ffc145afa7864fc.png)
«При компиляции указанного выше кода на С с помощью компилятора из поставки MSVC 2008 с опциями /O1 (оптимизация по размеру) и /Ob1 (разворачивать только __inline функции) получается машинный код, совпадающий с оригинальным кодом этой функции в Duqu, — пишет Игорь Суменков. Он также пытается проанализировать причины, по которым неизвестный автор Duqu решил использовать OO C вместо C++, и предполагает, что причин может быть две: 1) широкая переносимость и 2) недоверие к компиляторам С++. «Это типично для разработчиков с многолетним опытом, которые начинали с ассемблера, а затем постепенно перешли на С. Когда появился С++, многие отказались от его использования из-за неявного управления памятью и запутанных конструкций, вызывавших неявное выполнение кода (конструкторы, операторы и т.п.). Обе причины явно указывают, что код фреймворка был написан разработчиками «старой школы» с многолетним опытом работы».
«Лаборатория Касперского» сначала обратились к экспертам по реверс-инжинирингу, но те ничем не смогли помочь. Ясно было, что язык программирования — определённо не C++, не Objective C, не Java, не Python, не Ada, не Lua и ещё не 30 других языков программирования, которые они проверили. После нескольких месяцев безуспешных попыток анализа оставалось только предположить, что ключевой фрагмент вредоносной программы написан на неком неизвестном языке.
Однако, благодаря помощи сообщества эту головоломку всё-таки удалось решить.
![](https://habrastorage.org/storage2/e79/a97/811/e79a97811f39b0d5094fdc4aab43e653.png)
Функция-конструктор для класса связного списка
![](https://habrastorage.org/storage2/d4e/c78/481/d4ec7848100214654ded220c2a502ef0.png)
Функция-деструктор для класса связного списка
Специалисты «Лаборатории Касперского» получили более 200 комментариев и более 60 писем с указанием различных языков и фреймворков. Благодаря помощи с форумов Reddit и от независимых разработчиков в итоге удалось понять, что авторами Duqu был использован компилятор из поставки Microsoft Visual Studio.
После нескольких экспериментов с различными версиями MSVC и опциями компиляции специалист «Лаборатории Касперского» Игорь Суменков сумел воспроизвести код функции конструктора с первого скриншота и получить из этого кода бинарный код, совпадающий с найденным в Duqu.
Вот восстановленный вручную код этой функции на языке C.
![](https://habrastorage.org/storage2/f05/bfd/3e4/f05bfd3e460546ac2ffc145afa7864fc.png)
«При компиляции указанного выше кода на С с помощью компилятора из поставки MSVC 2008 с опциями /O1 (оптимизация по размеру) и /Ob1 (разворачивать только __inline функции) получается машинный код, совпадающий с оригинальным кодом этой функции в Duqu, — пишет Игорь Суменков. Он также пытается проанализировать причины, по которым неизвестный автор Duqu решил использовать OO C вместо C++, и предполагает, что причин может быть две: 1) широкая переносимость и 2) недоверие к компиляторам С++. «Это типично для разработчиков с многолетним опытом, которые начинали с ассемблера, а затем постепенно перешли на С. Когда появился С++, многие отказались от его использования из-за неявного управления памятью и запутанных конструкций, вызывавших неявное выполнение кода (конструкторы, операторы и т.п.). Обе причины явно указывают, что код фреймворка был написан разработчиками «старой школы» с многолетним опытом работы».