D V L # 2

Полиморфизм на паскале
Part I
(c) by Duke/SMF


Введение

На языках высокого уровня написано достаточно много вирусов. Но все они, как правило, достаточно примитивны - редко встретишь шифрующиеся или стелс- вирусы. А полиморфиков и того меньше. Точнее говоря, мне известно только три полиморфика, написанных на паскале. (И не стоит упрекать меня в невежестве - я не обязан знать все вирусы.)

Первый из них написан RedArc'ом и опубликован в журнале MoonBug #2. Вирус состоял из нескольких частей, которые компилировались отдельно друг от друга, и при поражении файла эти куски в каждой новой жертве находились в новом месте. Это конечно все оригинально, но занимает 75Kb. К тому же антивирусники быстро разобрались с этим полиморфиком.

Второй вирус - это широко известный Win.Apparition by Lord ASD. Он написан на Borland Pascal with Objects и поражает файлы в формате PE (для Windows). К его недостаткам относится большой размер вируса - около 88 Kb. Этот вирус использует собственную функцию-полиморфный генератор. Как написал Касперский в своей книге, "мне так и не удалось заставить ее функционировать". Тем не менее, этот вирус вполне работоспособен и очень оригинален. Для мутации в исходный текст добавляются команды-"пустышки" и код перекомпилируется.

Третий из известных мне полиморфный вирусов на паскале, является мой ;)) вирус HLLP.TRANS.Demo

Сущность технологии TRANS

Мой вирус использует технологию TRANS : Take RANdom Switch (Взять Случайный Переключатель). Идея TRANS заключается в перекомпиляции исходного текста вируса каждый раз с новыми, выбираемыми случайным образом установками директив компилятору. Полученные при этом вирусы имеют разный размер и разное содержимое. Недостатком вируса HLLP.TRANS.Demo (так же как и вируса Win.Apparition) является невозможность мутирования вируса при отсутствии в PATH компилятора языка Pascal.

О вирусе HLLP.TRANS.Demo

Представляемый вашему вниманию вирус HLLP.TRANS.Demo является примером реализации TRANS-технологии. Он написан на Turbo Pascal 7.0 и может быть откомпилирован компиляторами BPC.EXE (Borland Pascal) или TPC.EXE (Turbo Pascal). (Стоит заметить, что результатом компиляции одного и того же исходника разными компиляторами, будут являться файлы с разным содержимым. Чем не зацепка для полиморфизма? ). Этот вирус мной широко не тестировался. Возможно, что при некоторых комбинациях ключей он утратит работоспособность и станет Intended. Так что принимайте его AS IS (как есть), изучайте и придумывайте что-то новое.

Процесс создания вируса HLLP.TRANS.Demo

В связи с тем, что вирус мутирует путем перекомпиляции исходника, он должен таскать этот исходник с собой. Если таскать его непакованным, то вирус будет занимать слишком много места (поскольку исходник ~6Kb). К тому же при просмотре по F3 пораженного файла в нем обнаружится куча текста. Значит исходник надо упаковать - меньше места и нет текста. Воспользуемся популярной программой PKZIP и будем таскать с собой ZIP-архив с исходником. (Тут выявляется еще один недостаток вируса HLLP.TRANS.Demo - его зависимость от утилиты PKUNZIP.EXE в каталогах PATH.) Но это значит, что в нашем вирусе будет иметься постоянный кусок, а именно ZIP-архив. Этого допустить нельзя, иначе антивирусники получат в руки готовую сигнатуру :(( Следовательно, надо шифровать архив с ключом, случайно меняющимся от одного экземпляра вируса к другому. Этот ключ мы тоже будем хранить в пораженном файле.

Каким образом HLLP-вирусы обычно поражают файлы? Они переносят кусок из начала файла в конец файла, причем размер куска должен быть больше или равен длине вируса, а сами записываются в начало. Раз уж у нас имеется ключ, будем шифровать (xor'ить) переносимый кусок файла с этим ключом. Это своего рода "защита от выкусывания".

Раз у нас HLLP-вирус, то нам необходима метка-идентификатор зараженности файла. А поскольку у нас полиморный вирус, сделаем эту метку разной в каждом новом экземпляре вируса. Я сделал ее зависящей от первых двух символов в шифровальном ключе. Если ключ имеет вид "0123456789ABCDEF", то в пораженном файле по адресу $0A будет стоять "10".

По адресу $0С располагается длина откомпилированного вируса (назовем ее SL). Полная длина вируса равна SL+16+ZS, где длина ключа равна 16, ZS - размер ZIP-архива. Прирост файла при заражении равен SL+16+ZS-2 (т.к. символы "MZ" из начала пораженного файла в конец не переносятся, а "остаются на месте").

Таким образом, структура пораженного файла принимает вид:

       
         +--------------------+
         |  Вирус  (SL байт)  |
         +--------------------+
         |   Ключ (16 байт)   |
         +--------------------+
         |ZIP-архив (ZS байт) |
         +--------------------+
         | Конец файла-жертвы |
         +--------------------+
         |Зашифрованное начало|
         |    файла-жертвы    |
         | (SL+16+ZS-2 байт)  |
         +--------------------+
После запуска инфицированного файла управление получает вирус. Он проверяет наличие в каталогах PATH утилиты PKUNZIP.EXE и одного из компиляторов паскаля (BPC.EXE или TPC.EXE). Если они обнаружены, то проводится поиск одного незараженного EXE-файла в текущем каталоге. Если такой файл найден, то вирус переходит к его заражению (иначе - к запуску файла-носителя). Вирус читает ключ и расшифровывает ZIP-архив в файл $.ZIP; извлекает из архива файл $.PAS; редактирует файл $.PAS, устанавливая переключатели директив в случайные положения; компилирует его в файл $.EXE; дописывает к $.EXE случайно сгенерированный ключ и зашифрованный с этим ключом архив; определяет длину (SN) полученного файла $.EXE, ставит метку о пораженности этого файла; переносит SN-2 байт из начала жертвы в ее конец; пишет содержимое $.EXE в начало жертвы. Мы получаем инфицированный файл. Вспомогательные файлы удалаются.

Теперь пора запускать файл-носитель. Для этого пораженный файл копируется в файл $.DAT, а файл-носитель редактируется : расшифрованный кусок из конца устанавливается на свое место в начале файла, а лишняя дописка в конце отсекается. Поэтому даже контролирующие себя на предмет заражения программы будут работать без криков о своем изменении. Когда вирус снова получает управление, он замещает файл-носитель файлом $.DAT.

В связи со спецификой вируса он не заражает файлы размером меньше 10Kb.

Немного технических подробностей

При мутировании вируса используются переключатели директив компилятора. Стоит подробнее рассказать о них - что они означают и как влияют на работу компилятора. Символ "+" за директивой означает ее разрешение, а "-" - запрет. Отмеченные символом "*" директивы называются локальными и дейтсвуют до отмены. Описание на директивы дается при переключателе, установленном в "+", а в скобках - для случая "-".


{$A+}   - выравнивать данные награницу слова (байта)
          [при A+ все переменные и константы длиной более байта 
          выравниваются по четным адресам и между ними образуются промежутки;
          в противном случае они размещаются одна за другой]
{$B+} * - вычислять логические ыражения полностью (до получения результата)
          [генерируется машинный код разного содержания]
{$D+}   - разрешить (запретить) работу со встроенным отладчиком
{$E+}   - включить (отключить) режим программной эмуляции сопроцессора
          [при E+ к программе добавляется библиотека программной эмуляции
          сопроцессора]
{$F+}   - использовать дальнюю FAR (ближнюю NEAR) модель вызова
{$G+} * - использовать (не использовать) полный набор команд микропроцессора
          Intel 80286 (микропроцессора Intel 8088)
          [эта директива появилась в TP 7.0]
{$I+} * - включить (отключить) контроль операций ввода-вывода
          [при I+ генерируется дополнительный код, который проверяет ошибки
          после каждой операции ввода-вывода, при обнаружении ошибки 
          программа останавливается]
{$L+}   - включить (не включать) локальные символы в информацию для 
          отладчика
{$N+}   - использовать числовой сопроцессор (реализовать операции с 
          плавающей точкой программно)
{$O+}   - разрешить (не разрешать) создание оверлейной структуры
{$R+} * - включить (отключить) контроль границ диапазона
{$S+} * - включить (отключить) контроль возможного переполнения стека
          [при S+ генерируется дополнительный код, проверяющий стек на 
          переполнение]
{$V+} * - включить (отключить) контроль длины строк при обращении к 
          процедуре или функции
{$X+}   - использовать (не использовать) расширенный синтаксис
          [эта директива появилась в TP 7.0]
К моему большому сожалению (по техническим причинам) в этом номере журнала не удалось опубликовать окончание статьи и исходник вируса HLLP.TRANS.Demo. В следующем номере журнала вы увидите окончание статьи "Полиморфизм на паскале" и примеры применения технологии TRANS - вирусы HLLP.TRANS.Demo и HLLP.TRANS.Master.
Back Вернуться на страницу оглавления