«Процес» публікує блог Sean Brian Townsend про «шифровані» комп’ютерні віруси. Текст опубліковано зі згоди автора мовою оригіналу
Люди часто путают корень “крипто” в словах “криптография” и “криптовалюта”. И если между первым и вторым есть определенная связь, то еще занятнее с компьютерными вирусами. Терминология складывалась хаотически, и “шифрованные” вирусы называют полиморфными, а если шифрование навесное, чтобы зловредный код не детектировался антивирусами, то “крипторами”. Первый такой вирус V2P6 появился в 1989 году и с тех пор технология практически не поменялась. Перед основным кодом идет небольшая подпрограмма, как правило случайный ARX-шифр, потому что сложение, циклические сдвиги и исключающее-ИЛИ легко обратимые функции.
Время шло. Обитатели вирусной сцены потихоньку впитывали технологию, но основное времяпровождение вирмейкеров сводилось преимущественно к склокам между собой о том, чей говноморфик на паскале лучше, бесконечным тусовкам в ньюсах и IRC и фантазиям о том, можно ли сделать вирус “фуллморфным”, чтобы менялась не только коротенькая процедура шифрования, но и весь код целиком. И так продолжалось до конца девяностых, пока наконец-то не появился свет в конце туннеля – RegSwap и Lexotan от Vecna, Mistfall за авторством Z0MBiE и Metaphor (Mental Driller). Все из группы #29A Не смотря на относительную простоту, те вирусы на порядок интереснее, чем унылый Стакснет, или еще какой-нибудь всратый BlackEnergy переделанный из краденного говнобота. С точки зрения политической или военной науки они может и представляют интерес, но технологий там – ноль. Скучища.
Развитие очень сильно тормозила общая склонность всех хакеров к байтоёбству. “Настоящие кодеры пользуются только ассемблером” и стремление к минимализму, которое укоренилось в хакерских мозгах еще со времен компьютеров вроде TX-0, PDP-1, и микрокомпьютеров 80-х. То что по-умному называется “преждевременная оптимизация”. Пока наконец-то, уже в нулевых не стало понятно, что для того чтобы изменять отдельные инструкции нужен ассемблер, дизассмеблер и компоновщик, и писать их лучше на Си, чтобы не офигеть в процессе. Потому Mistfall (названный в честь рассказа Джорджа Мартина) мне кажется куда более интересным, чем люто сложный Metaphor. Он разбирает программу-жертву на отдельные инструкции, смешивает с кодом вируса и собирает обратно. Проблема в том, что дизассемблирование – алгоритмически неразрешимая задача. Нельзя написать программу, которая посмотрит на байты и определит, что это? Код или данные? Адрес или константа. Фундаментальное свойство фон Неймановской архитектуры.
Между тем, “недетируемость” сводиться не к тому, чтобы тасовать инструкции как колоду карт, а к тому чтобы автоматически изменять её поведение, наращивая (или хотя бы не теряя) сложность, то есть нужно выяснить что программа делает, а не как выглядит (что тоже алгоритмически неразрешимая задача, и это бьет больше по антивирусам, чем по вирусам). Mental Driller писал о том, что желательно декомпилировать программу до промежуточного представления (IR), я же, по-прежнему, убежден, что нужно подняться ещё выше, как минимум до абстрактных синтаксических деревьев (AST). Декомпиляция действо еще более сложное, чем дизассемблирование, потому что трансляция программы в машинный код – процесс с потерей информации. Жаль, что за последние лет десять, а то и больше, ничего нового в этой области не появлось, и джуны-реверсеры по-прежнему тренируются на Мистфолле. С двухтысячного и по сей день.
Куда-то исчезло в людях ощущение прекрасного. Я как-то сделал мистфолл-подобный код – Lacrimae (потому что “lacrimae rerum”). Антивирусный разработчик, который его анализировал, попытался меня подколоть, дав довольно специфическую трактовку Вергилия. По его мнению Эней в храме размышляет о “тщетности сражений”. Герой троянской войны, предок основателей Рима и тщетность. Никогда не слышал ничего смешнее. Стоит процитировать этот отрывок полнее: “Слезы — в природе вещей, повсюду трогает души смертных удел; не страшись: эта слава спасет нас, быть может. Молвит и душу свою услаждает картиной бесплотной”.