Пару недель назад глаз царапнула новость специфического свойства. У компьютерного вируса Duqu — который интересен уже своим родством со знаменитым «цэрэушным» Stuxnet — после полугода изучения обнаружилось более чем необычная особенность. Спецы Лаборатории Касперского пришли к выводу, что авторы вируса использовали неизвестный язык программирования. С тех пор тему поднимали не раз (в том числе в Национальной деловой сети, см. материал Евгения Гукова), однако за последние дни она пополнилась новыми деталями и теперь есть повод перетряхнуть её с самого начала.
Но прежде давайте вернёмся на двадцать лет назад, в конец 80-х, когда восьмибитные «игровые» компьютеры вроде Commodore 64 ещё занимали заметную долю рынка. Моя компьютерная юность прошла на отечественном «Специалисте» (детище журнала «Моделист-конструктор») и отечественном же клоне британского ZX Spectrum, у которых было по 48 тысяч байт оперативной памяти на брата. Тысяч байт! Даже 64 килобайта дома были тогда недостижимой роскошью. Да и на «профессиональных» IBM PC ситуация отличалась несильно, там в лучшем случае счёт шёл на сотни.
Именно ограниченный объём оперативной памяти был главной трудностью для разработчиков программного обеспечения. То, что микропроцессоры тогда работали на тактовой частоте в единицы мегагерц (в тысячу раз медленней, чем персоналки сегодня), не играло особой роли: для работы с килобайтами памяти их производительности хватало. А чтобы максимально эффективно использовать каждый свободный байт, программисты были вынуждены писать на низкоуровневых языках. «Низкий» подразумевает не качество кода, а степень родства с микропроцессором: чем меньше преобразований нужно сделать, транслируя программу на данном языке в инструкции, понимаемые самим процессором, тем более низкоуровневым он считается.
Предельный случай — Ассемблер, составленный из простейших операций вида «сложить А и Б», «перейти на адрес XXXX» и тому подобных. По сути это родной язык микропроцессора, прямо переводимый в понятную машине мешанину чисел. Он гарантирует максимальное быстродействие, максимально компактный код, но и писать на нём большие программы — задача не из лёгких.
Однако когда в вашем распоряжении только десятки килобайт, другого выхода просто нет. Вот и писали программы на Ассемблере, обходясь без удобных сред разработки. Поработав так какое-то время, можно обходиться и вовсе без компилятора, общаясь с процессором напрямую, числами. Я до сих пор помню наизусть шестнадцатеричные коды значительной части команд Intel 8080.
Ко второй половине 90-х набравшая ход эволюция PC изменила две вещи. Во-первых, языки программирования стали создавать уже не только компании или институты, вкладывавшие миллионы долларов и десятки человеко-лет труда, но и одиночки-энтузиасты. Случился настоящий всплеск разнообразия, были придуманы языки на самые мелкие случаи жизни, часть которых впоследствии стала очень популярной. Классический пример — PHP, появившийся как набор команд для обслуживания одной домашней странички.
Во-вторых, софтверные разработчики стали активней использовать высокоуровневые языки. Пропал смысл экономить отдельные байты и задумываться о производительности. Среднестатистический программер обленился. А вместе с ним обленились и вирусописатели.
Если за десять лет до того вирусы писались на Ассемблере, то излюбленным инструментом в конце XX — начале XXI веков стал Visual Basic. А лень стала для киберкриминала профессиональным почерком, modus operandi. И сегодня, к примеру, основная масса заразы для платформы Android — писк моды, передний край! — пишется с использованием высокоуровневых «детских конструкторов» вроде App Inventor. Вот почему сообщение, что Duqu написан на неизвестном языке, вызвало такой резонанс среди специалистов. Кому это сегодня надо — придумывать новый язык программирования?
Устройство и предполагаемое назначение Duqu подробно рассматривались в октябрьской колонке (см. «Вирус Duqu и государственный терроризм»), но если коротко, внимание он привлёк по двум причинам. Прежде всего, он очень похож на печальной известный Stuxnet — тот самый, что сломал урановые центрифуги на горно-обогатительном комбинате в Натанзе, Иран. Другая причина — отсутствие в Duqu деструктивных функций и механизма репликации. Вместо этого он оснащён богатейшим арсеналом для шпионажа. Предположительно, два этих вируса работали в паре: Duqu засылался на компьютер жертвы и собирал необходимую информацию, после чего уже Stuxnet наносил удар, используя собранные сведения.
Неизвестного в той истории осталось много, и в марте 2012 она получила продолжение: Лаборатория Касперского обратилась к участникам конференции CanSecWest с просьбой помочь в идентификации языка, на котором Duqu написан.
После перевода (компиляции) инструкций любого языка программирования на понятный процессору машинный код, в программе остаются следы, свидетельствующие о том, какой язык использовался для её написания. Анализ Duqu показал, что большая его часть написана на популярном C++. Однако установить языковую принадлежность некоторых элементов не удалось. Эксперты последовательно отмели все известные варианты, от C до Ады, и обратились за помощью к общественности, чтобы исключить вариант последний: неужели и вправду авторы Duqu использовали новый, собственный язык?
Сложная, изощрённая механика Duqu уже говорит многое о его создателях. Но факт применения нового языка добавил бы к этому портрету важный штрих. Кто может позволить себе такую роскошь? Только государственные организации.
Что ж, вариантов было предложено много, вплоть до самых экзотических (вроде заимствования инструментов из операционных систем тридцатилетней давности), и буквально в этот понедельник задачку удалось решить. Ответ получился и проще, и интересней одновременно.
Таинственным языком программирования оказался самый обычный C. Но вот текст программы был написан особым образом, с применением только низкоуровневых системных функций. Это значит, что авторам Duqu пришлось самостоятельно учесть тысячи тончайших нюансов управления устройствами и операционной системой. Что легче, чем создать новый язык, но всё равно недостижимо сложно для 99 процентов рядовых горе-взломщиков.
Создатели Duqu очевидно преследовали цель получить максимально предсказуемую в работе, максимально переносимую программу. Вот почему для разработки был выбран C — язык сравнительно низкого уровня. Высокоуровневые языки в процесс компиляции могут порождать конструкции, поведение которых непредсказуемо и содержащие ошибки, о которых программист может даже не догадываться.
Но и на этом история не кончается. В «Касперском» считают, что загадочные элементы могли достаться Duqu от другой, уже существующей программы. Иначе говоря, можно предположить, что Duqu и Stuxnet созданы в рамках более крупного проекта, составляющие и назначение которого остаются неизвестными. А значит и прощаться рано. Однажды нам предстоит столкнуться с Duqu или его наследниками вновь.
P.S. Вчера Symantec обнаружила новый вариант Duqu, модифицированный с целью обхода антивирусных программ.