Загадочный язык программирования фреймворка Duqu определён

    Две недели назад специалисты «Лаборатории Касперского» обратились к сообществу с просьбой помочь определить язык программирования, на котором написана троянская программа Duqu. Обнаруженная в октябре 2011 года, она до сих пор ставила в тупик экспертов.

    «Лаборатория Касперского» сначала обратились к экспертам по реверс-инжинирингу, но те ничем не смогли помочь. Ясно было, что язык программирования — определённо не C++, не Objective C, не Java, не Python, не Ada, не Lua и ещё не 30 других языков программирования, которые они проверили. После нескольких месяцев безуспешных попыток анализа оставалось только предположить, что ключевой фрагмент вредоносной программы написан на неком неизвестном языке.

    Однако, благодаря помощи сообщества эту головоломку всё-таки удалось решить.


    Функция-конструктор для класса связного списка


    Функция-деструктор для класса связного списка

    Специалисты «Лаборатории Касперского» получили более 200 комментариев и более 60 писем с указанием различных языков и фреймворков. Благодаря помощи с форумов Reddit и от независимых разработчиков в итоге удалось понять, что авторами Duqu был использован компилятор из поставки Microsoft Visual Studio.

    После нескольких экспериментов с различными версиями MSVC и опциями компиляции специалист «Лаборатории Касперского» Игорь Суменков сумел воспроизвести код функции конструктора с первого скриншота и получить из этого кода бинарный код, совпадающий с найденным в Duqu.

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



    «При компиляции указанного выше кода на С с помощью компилятора из поставки MSVC 2008 с опциями /O1 (оптимизация по размеру) и /Ob1 (разворачивать только __inline функции) получается машинный код, совпадающий с оригинальным кодом этой функции в Duqu, — пишет Игорь Суменков. Он также пытается проанализировать причины, по которым неизвестный автор Duqu решил использовать OO C вместо C++, и предполагает, что причин может быть две: 1) широкая переносимость и 2) недоверие к компиляторам С++. «Это типично для разработчиков с многолетним опытом, которые начинали с ассемблера, а затем постепенно перешли на С. Когда появился С++, многие отказались от его использования из-за неявного управления памятью и запутанных конструкций, вызывавших неявное выполнение кода (конструкторы, операторы и т.п.). Обе причины явно указывают, что код фреймворка был написан разработчиками «старой школы» с многолетним опытом работы».
    Support the author
    Share post

    Comments 44

      +3
      Вообще странно, ведь, по сути, почти любой «язык» итак можно написать поверх Си… Разве что соглашение о вызовах функций будет тяжеловато какое-нибудь другое использовать ;)
        –22
        Отличный повод позлорадствовать для любителей называть МС «корпорацией зла» :)
          +13
          Я нагуглил сайты с уязвимостями или написал письмо с вредоносным содержимым из gmail. Гугл — корпорация зла.
            +6
            А я вижу все это в Опере и переслал другу громоптицем — еще две корпорации зла.
            Не говоря уже про всех вендоров железа в системнике :)
            –5
            Как минимум 19 человек провалили проверку на чувство юмора.
              –2
              Уже двадцать :)
                0
                Больше ненависти!
            +35
            Может я тупой, по почему так важно, на каком языке написан вирус?
              +55
              Потому что это лишний раз позволяет пропиариться антивирусной компании.
                +52
                фиговый пиар, раз целая(!) антивирусная компания, не узнала Си(
                  +5
                  и Студию
                  +15
                  Плюс изначально строились догадки, что использовался чуть-ли не свой собственный язык разработанный в тайных лабораториях третьего рейха.

                  На самом деле если почитать все статьи на тему дуку на securelist, то это скорее роман, чем описание технических подробностей работы зловредной программы.
                +65
                Ммм, недопонял что-то: ведущие специалисты не смогли сразу установить, что код написан на одном из самых распространенных языков и скомпилирован при помощи одного из самых распространенных компиляторов?
                  +31
                  Просто так получилось, что исследование поручили именно автору Duqu. Если бы он сразу все раскрыл, то это было бы слишком легко и неинтересно. А так вот какая эпопея получилась…
                    +7
                    Обе причины явно указывают, что код фреймворка был написан разработчиками «старой школы» с многолетним опытом работы

                    Рыбак рыбака видит издалека :)
                    +6
                    Потому что в коде используется ООП, соответственно спецы отбросили все не ОО языки программирования, в том числе и С.
                      0
                      Т.е. «ведущие специалисты» оказались не в курсе, что на C можно писать в ОО-стиле? Однако…
                      Тогда вот такое им лучше вообще не показывать, а то, боюсь, шаблон у них не только порвётся, но и вывернется наизнанку.
                        0
                        На С написано много ОО языков программирования. Программирование на голом С в объектном стиле очень подобно использованию фреймворка-надстройки над С или более высокоуровнего языка программирования.
                          0
                          Компилятору на фреймворки пофиг — он тупо транслирует операторы/структуры данных. Чего там взбрело в голову создателям фреймворков, его абсолютно не интересует — для него это обычный валидный С-код.
                    +7
                    Так еще Кармак свои движки писал. Структуры с указателями на функции и никакого С++
                      +7
                      И сам C++ тоже таким же образом написали на Си.
                        +8
                        The first C++ compiler (Cfront) was written in C++. Bjarne Stroustrup
                          0
                          Эээ, что-то я не догоняю… а на чем Cfront был скомпилирован? Курица и яйцо получается какое-то.
                            0
                            Что было раньше: первый компилятор или его исходники?)
                            Бьярн отвечает на ваш вопрос там, откуда выдернута цитата, а именно в своем FAQ
                            +1
                            Страуструп сам себя опровергает в том же абзаце: «To build that, **I first used C** to write a „C with Classes“-to-C preprocessor.» То, что в конце концов С++ смог **позже** компилировать сам себя из исходников на самом себе (а это умеют все серьезные ЯВУ — Лисп, Смолтолк, Форт, ...) — не исключает использование Си на первом этапе разработки С++. Без Си из упомянутых языков обошлись лишь Лисп и Форт, т.к. оба старше, чем Си :)
                        0
                        жееесть, ну наконец-то разобрались, а то на создавали мифов)
                          +8
                          правильно писать «а то на насоздавали мифов на»
                            +1
                            надо все-таки спать иногда, прошу прощения.
                        • UFO just landed and posted this here
                            +7
                            «Quite frankly, even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C.»/Torvalds/
                              +10
                              Это было хитроспланированной провокацией.
                              Логика ребят из ЛК была следующая:
                              1) давайте объявим «это» неизвестным языком программирования.
                              2) хацкеры все самолюбивы, поэтому автор услышав это обязательно где нибудь опубликует разоблачительный пост «вы — уроды, я писал на Си!»
                              3) вот тут мы его с схватим!

                              Авантюра не удалась. Тег [шутка] вставлять по вкусу.
                                +5
                                Откуда известно что не удалась? За вами выехали.
                                +5
                                Я кстати был прав насчет Си (в предыдущей статье). Чем-то похоже на олдскульный код эмуляции ООП через сишные структуры. Жалко конечно, что это не какой-нибудь новый язык системного программирования… Я так надеялся:)
                                  +16
                                  то есть вместо Страшного Тайного Языка всего лишь оптимизация по размеру? Крутые аналитики, да…
                                    +2
                                    С ставит Лабораторию Касперского в тупик… А на Brainfuck вирус можно написать?
                                      +1
                                      Можно. Пишите.
                                        +2
                                        Да я как бы не спец, просто идея понравилась (смайлик)
                                      +9
                                      Угу, а писали то как «объектно-ориентированный язык, оптимально подходящий для сетевого программирования». Вот он, этот супер-язык: Си :)))
                                        +4
                                        Забавно другое: все глумились очень долго и упорно, но что-то никто не поспешил четко изложить данные из статьи, открыть, что это именно С, показав свою высокую квалификацию.
                                        Мне кажется, или все-таки репутацию конторы не стали бы ставить на кон из-за ерундового вопроса? как-то вот и конкуренты не метнулись впереди паровоза ткнуть носом неумелых собратьев? ;)
                                          +1
                                          Это может означать, что задача действительно сложная и конкуренты (по продажам, а не по исследованиям) тоже не смогли помочь. Зато сколько зеленой желчи выше.
                                          0
                                          Может, действительно, не всё не так, как кажется…
                                          А, если ключевой вопрос исследования это изучение переносимости программы на уровне исходного кода?
                                          Тогда, можно предположить, как скоро можно ожидать подобное на других платформах…
                                            0
                                            Прежде чем критиковать аналитиков из ЛК, все же стоит признать, что они проделали немалый труд по анализу файла, распознать и разобрать в ассемблерном коде все эти очереди событий, объекты и прочее, все же не так и просто.

                                            Но странно, что Си не узнали. Видимо, хакеры использовали объектный файл без стандартных библиотек и стандартного сишного пролога?
                                            • UFO just landed and posted this here
                                              +2
                                              Похоже, прав был анонимный параноик, утверждавший, что «просьба о помощи» — всего лишь способ собрать контактные данные интересующихся.

                                              Only users with full accounts can post comments. Log in, please.