Перспективы развития вирусов

Киберпространство растет и обеспечить его необходимым количеством вирусов достаточной сложности становится все тяжелее.

Поэтому мы приходим к генераторам/конструкторам вирусов с одной стороны и к совместному написанию вирусов (коим все бредят) с другой стороны. Конструкторы и генераторы вирусов дают большое количество простых продуктов. Совместное написание дает минимальное (даже скажем - нулевое) количество вирусов сравнительно сложных.

После написания возникает вопрос о распространении.

Здесь и проявляются охуительно быстро распространяющиеся макро-черви. Такой червь может в считанные дни "разнести" некоторый дополнительный блок данных по большому числу компьютеров, хотя будет почти так же быстро вылечен. В противоположность им идут файловые вирусы, распространяющиеся с намного меньшей скоростью, но зато и время "излечения" от оных во много раз больше, чем от макро-червей. Сравните по продолжительности эпидемии onehalf-а и cih-а с одной стороны и meliss-ы и iloveyou с другой стороны.

Почему такая разница во времени "излечения"? Ключ лежит в слове "эпидемия", то есть - в резком увеличении количества вирусов за малое время, причем даже не столько самих вирусов, сколько побочных от них эффектов - типа факапа сети, или же просто мелких, но неприятных неожиданностей на юзерских компьютерах.

После распространения вируса возникает вопрос о сопротивлении его "лечению".

Тривиальным решением является установка вируса на произведение глобального пиздеца. В этом случае лечить просто нечего. Более сложным решением является удаление/патч антивирусов пришедших на компьютер ПОСЛЕ вируса и "пробивание" защит антивирусов установленных на компьютере ДО вируса.

Сопротивление лечению можно понимать по всякому, и, как мне кажется, сюда входит также и сопротивление детектированию вируса. Ибо чем позже будет обнаружен вирус, тем позже он попадет к антивирусникам. В этом плане большое преимущество имеют медленно распространяющиеся файловые вирусы о которых становится известно далеко не сразу. Как противодействие детектированию существуют такие технологии как стелс, полиморфик и uep. Стелс не дает беспокоиться юзеру, полиморфик и uep скрывают вирус от эвристических анализаторов.

Кроме того, в сопротивление лечению входит также и сопротивление написанию антивируса. О чем это я? А о времени, которое антивирусники затратят на написание лечилы. Это время зависит от:

Самым важным фактором я считаю сложность вируса. Суммарный объем кода, количество возможных производимых действий, реакции вируса на различные ситуации, сложность и количество методов заражения файлов и распространения по сети, всякие анти-чего-то-там примочки и т.п.

Анализ подобных вещей отнимает огромное количество времени у дисассемблирующего вирус антивирусника, тем самым давая вирусу возможность распространяться все дальше и все быстрее.

Если только просмотреть и вникнуть, ну скажем, в iloveyou, составляет где-нибудь пол часа, то сколько времени надо затратить на 100-килобайтный метаморфно-полиморфно-пермутирующий мультиплатформенный вирус, написанный в основном на ассемблере, кусками шифрованный, с антитрассировками, антиотладками, вставками на си и паскале, шитым кодом и прочей хуйней?... Это я, конечно, пошутил, но большие сложные вирусы, существующие в реальности, не такие уж и простые.

Та же ситуация наверное была и с моррисовским червем - дизассемблировать умели немногие, у половины из них свои дела, а сеть перегружена, связи никакой, да еще и охуевший народ анноит звонками типа "а что за хуйня".

Кто-нибудь, наверное, спросит - какие же из перечисленных свойств лучше вставлять в вирус -- медлененное или быстрое распространение, макро- или файловый, с сетевыми примочками или без, полиморфик или нет, с факапом или анти-антивирусными фичами и т.п.

Давно известно, что решение проблемы не есть один из нескольких очевидных путей, а суть комбинация их. Поэтому вставлять в вирус нужно ВСЕ что только возможно.

А что если в вирусе есть несколько фич, из которых вызвать нужно только одну? Самым примитивным вариантом является применение рандомера, то есть вызывать возможные ветви алгоритма случайным образом. Я имею в виду дублирующиеся ветви. Например несколько методов заражения файлов - один из нуля, один через api, причем и то и другое - и hll-методом и изменением секций, и т.п.

Что дает подобная хрень? Во-первых, необходимую сложность. Во-вторых, изменение функциональной сигнатуры, правда не сильное - навроде перемешивания блоков с кодом в вирусе, но все же хоть такое. И, в третьих, некое подобие антитрассировки. Представьте, что вы поставили бряк на одну из api-функций вируса, а в следующий запуск вызовется уже совсем другая функция, или не вызовется вообще, или вызовется, но для других действий.

Какими еще свойствами будет обладать такой сложный вирус? Появляются, например, возможности алгоритмически задавать стратегию распространения вируса. Я говорю вот о чем: пусть вирус умеет заражать скажем PE файлы и документы. Предположив, что время на всех компьютерах выставлено правильно, можно задать распространение через EXE файлы по четным неделям и через документы по нечетным. И, скажем, чтобы через каждый месяц вирус менял метод заражения файлов, а каждый месяц из трех "засыпал". Получается нечто псевдо-"умное". Каким будет результат? При медленном распространении не возникнет эпидемии, не будет одновременно большого числа компьютеров с одними и теми же "симптомами" заражения. Распространение вируса будет выглядеть как много локальных неопасных эпидемий разных вирусов.

Предположим теперь что мы запрограммировали в вирус некоторые дополнительные возможности, например процедуру, изменяющую все сигнатуры вируса (перемешивающую определенные команды например), но зашифровали эту фичу случайным ключом. И во время работы вируса перебираем наши ключи. Таким образом можно прикинуть, и отложить "мутацию" вируса на определенное время, причем добраться до зашифрованного кода нельзя никаким способом, кроме перебора. Аверы, конечно, могут найти приличный компьютер и устроить перебор на нем, но смогут/станут ли они это делать? В результате вирус через, скажем, месяц, изменяет все свои сигнатуры и мы имеем уже не один вирус а десяток его недетектируемых модификаций в разных местах.

Теперь о вирусных эффектах, то бишь что можно с этого всего поиметь. Есть две принципиально разных цели в соответствии с которыми можно выбирать стратегию распространения вируса.

Вариант первый. Макро-червь, быстро распространяющийся и выполняющий несложную задачу, типа отправки маздаевого реестра на емыл богданову, засирки антивирусного саппорта или просто причинения пользы в виде освобождения диска от программ. Как вариант - устанока на компьютер бэкдора/трояна или другого, уже более сложного вируса.

Вариант второй. Файловый вирус, распространяющийся сравнительно медленно и не вызывающий больших эпидемий. Тут, честно говоря, сказать сложно, что б с них поиметь. Ну, тот же самый факап, демонстрация похабных политических лозунгов и т.п. Опять же установка бэкдора. Как вариант - патч некоторого программного обеспечения. Чтобы например антивирус перестал определять вирусы, достаточно изменить в нем две подпрограммы (или макроса) -- подсчет вирусных контрольных сумм и проверку собственной целостности. Еще вариант - имитация поломки харда. Зачем оно надо? Спросите любого компьютерного ремонтера, он вам объяснит. ;-)

И еще одна крайне прикольная фича - первертация кода. Идея - в изменении случайных кусков кода во ВСЕХ программах (с сохранением их работоспособости), начиная с точки входа. Например перестановка инструкций местами, замена mov r1,r2 на push r2/pop r1 и т.п. В результате изменяются сигнатуры программ, упаковщиков, троянов и даже других вирусов.

* * *

(c)