На языках высокого уровня написано достаточно много вирусов. Но все они, как правило, достаточно примитивны - редко встретишь шифрующиеся или стелс- вирусы. А полиморфиков и того меньше. Точнее говоря, мне известно только три полиморфика, написанных на паскале. (И не стоит упрекать меня в невежестве - я не обязан знать все вирусы.)
Первый из них написан RedArc'ом и опубликован в журнале MoonBug #2. Вирус состоял из нескольких частей, которые компилировались отдельно друг от друга, и при поражении файла эти куски в каждой новой жертве находились в новом месте. Это конечно все оригинально, но занимает 75Kb. К тому же антивирусники быстро разобрались с этим полиморфиком.
Второй вирус - это широко известный Win.Apparition by Lord ASD. Он написан на Borland Pascal with Objects и поражает файлы в формате PE (для Windows). К его недостаткам относится большой размер вируса - около 88 Kb. Этот вирус использует собственную функцию-полиморфный генератор. Как написал Касперский в своей книге, "мне так и не удалось заставить ее функционировать". Тем не менее, этот вирус вполне работоспособен и очень оригинален. Для мутации в исходный текст добавляются команды-"пустышки" и код перекомпилируется.
Третий из известных мне полиморфный вирусов на паскале, является мой ;)) вирус HLLP.TRANS.Demo
Мой вирус использует технологию TRANS : Take RANdom Switch (Взять Случайный Переключатель). Идея TRANS заключается в перекомпиляции исходного текста вируса каждый раз с новыми, выбираемыми случайным образом установками директив компилятору. Полученные при этом вирусы имеют разный размер и разное содержимое. Недостатком вируса HLLP.TRANS.Demo (так же как и вируса Win.Apparition) является невозможность мутирования вируса при отсутствии в PATH компилятора языка Pascal.
Представляемый вашему вниманию вирус HLLP.TRANS.Demo является примером реализации TRANS-технологии. Он написан на Turbo Pascal 7.0 и может быть откомпилирован компиляторами BPC.EXE (Borland Pascal) или TPC.EXE (Turbo Pascal). (Стоит заметить, что результатом компиляции одного и того же исходника разными компиляторами, будут являться файлы с разным содержимым. Чем не зацепка для полиморфизма? ). Этот вирус мной широко не тестировался. Возможно, что при некоторых комбинациях ключей он утратит работоспособность и станет Intended. Так что принимайте его AS IS (как есть), изучайте и придумывайте что-то новое.
В связи с тем, что вирус мутирует путем перекомпиляции исходника, он должен таскать этот исходник с собой. Если таскать его непакованным, то вирус будет занимать слишком много места (поскольку исходник ~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.
![]() |
Вернуться на страницу оглавления |