ZF

                     Мутационные технологии
                            by JHB

             ( Вольный перевод - DrMad, 1998 г. )

    Как только  я  впервые  услышал про идею Мутационной Технологии,  я
заинтересовался в том,  чтобы увидеть код,  который мог бы объяснить  -
как  может  работать  фрагмент  непостоянного кода.  Я заимел несколько
вирусов,  но большинство Мутационных Технологий  в  соответствии  с  их
природой  были сложны для дизассемблирования.  Так,  после знакомства с
кодом других авторов, я решил попытаться приложить свои ручонки к этому
типу  программирования.  Данная статья проиллюстрирует путь,  который я
избрал при разработке и реализации Мутационной Технологии.

    Для начала  я попытаюсь определить,  что такое Мутационная
Технология,  ее код, который может быть прилинкован или просто
присоединен к обычной программе или вирусу. Она:

    1. Расшифровывает себя,  также, как и программу, к которой
прилинкована.
    2. Создает  Расшифровщик,  который будет выполняться перед
основной программой.
    3. Каждый  Расшифровщик,  который  она  создает,  имеет   различные
сигнатуры.

    Хорошо, теперь давайте разъясним это определение,  сигнатура (когда
говорят о коде) - это фрагмент кода, который должен быть уникальным для
этого кода. Примером может служить сигнатура:

        EA 05 00 C0 07

    Которая является 16-ричным кодом для команды

        jmp     07c0:0005

    Это (как могут отметить многие) - первая строка кода вируса Stoned,
хотя  даже  и  этот  маленький  кусочек  кода,  помещенный   в   начале
загрузочного сектора, используется многими а/в продуктами, как признак.
(Далее не проверялось).

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

    Это означает,  что единственая сигнатура,  которая  должна
изменяться - это расшифровщик,  и это основной тип современных
Технологий.

    Первой частью     процесса     создания     является      генерация
шифровщика/расшифровщика,  который  должен выполнять достаточно простую
шифровку.  Я игрался со стандартными xor/add/sub,  но  они  вскрываются
немедленно  расшифровщиками  TBAV  и  F-prot.  Поскльку  основная  идея
Мутационной Технологии - обдуривать и людей и сканеры,  то это не самый
лучший путь.  Во время чтения конференций usenet я обнаружил упоминание
шифровки,  которая использует shl/shr. Многие могут быть удивлены, если
Вы  используете  shl/shr,  поскольку  либо  старший,  либо  младший бит
пропадают,  но это не совсем так,  ибо они  помещаются  в  флаг  carry.
Простым  добавлением этого бита к концу или началу регистров (или слов)
вы  можете  поиметь  реверсивную  шифрацию.  Сейчас  TBAV  обнаруживает
большинство  таких  шифровок,  исключая  четные количества сдвигов типа
2,4,8,  в то время  как  F-prot,  кажется,  пропускает  большинство  их
(только при эвристическом анализе и ключе /paranoid ).  ( Говорят,  это
потому чо shl 2,4,  8 может использоваться для быстрого  умножения  или
деления, так что TBAV не отмечает это как шифровку). Итак, я немедленно
использовал это для шифровки

             mov bx,offset virus_code
decrypt:
             mov     cx,4        ; ключ шифрации
             mov ax,cs:[bx]      ; взять слово для шифровки
again:
             clc                 ; не нужно, но я был юн, сорри J
             shl     1           ; ок, т.к. код перед этим был
                                 ; ax 1000 0000 0000 0000 cf = 0
                                 ; после shl
                                 ; ax 0000 0000 0000 0000 cf = 1
             jnc     no_high_bit ;
             inc     ax          ; это просо делает ax =
                                 ; ax 0000 0000 0000 0001
no_high_bit:
             dec     cx
             jcxz    done_unencr ; нормально завершено, двигаем дальше
             jmp     short again ; двигаем дальше
done_enencr:
             mov     cs:[bx],ax  ; Запоминаем расшифрованный код
             add     bx,2        ; двигаем наш указатель
             dec     dx          ; проверяем, сколько осталось
             jnz     decrypt

virus_code:

    Ок, теперь  у  нас  есть расшифровщик,  который использует shr и Вы
имеете шифрующую процедуру ( она в коде, который Вы читаете ;) ).

    Все нормально до этого момента,  поскольку у  меня  есть  шифрующая
Технология,  которая будет обдуривать TBAV и F-prot (вне зависимости от
того,  что Вы используете f-prot  /paranoid,  чего  даже  и  не  делают
обычные средние пользователи),  но это не Мутационная Технология.  Дык,
простейшая  мутация  состоит  в  том,  чтобы  изменять  регистры,   это
простейшая  вещь  всего лишь требует небольших исследований или хорошей
книжки по ассемблеру. Все команды ассемблера строятся по образцу

                        push    ax          что в 16-м будет
                        50h  или 1001 0000b
                                            теперь
                        push    bx          имеем
                        53h  или 10010 011b

    Обратите внимание,  что 3 последних  бита  -  единственная
вещь, которая изменяется при изменении словных регистров

                        ax = 000  0
                        cx = 001  1
                        dx = 010  2
                        bx = 011  3
                        sp = 100  4
                        bp = 101  5
                        si = 110  6
                        di = 111  7

    ОК, при помощи простейших команд and/or мы можем  изменить регистры
на другие, и, конечно, мы должны менять их случайным образом, проверяя,
какие мы уже использовали и имея в виду,  что мы заменяем все bx на cx.

    В этом месте некоторые люди начнут путаться, потому что мы начинаем
готовить исполнимый код,  к которому  намереваемся  обращаться,  как  к
данным. Посмотрите на примерчик:

                mov     cx,0004         ;b90400h

превращается в

shift_reg:
                db      0b9h            ;10111 001  <- cx
                dw      0004

    Теперь мутация для этого кода может выглядеть как

                mov     ax,[shift_reg]    ;
                and     ax,11111000h      ; это изолирует
                                          ; команду mov
                or      ax,00000111       ; это готовит команду
                                          ; mov di

    Лучший способ  заключался  бы  в  генерации   случайных   чисел   и
извлечении   числа   в  границах  0-7,  затем  в  операции  OR  его  на
использованную мной константу. Конечно, вы должны отслеживать регистры,
котолрые вы уже использовали и какие только собираетесь.

    Теперь, используя эту технику, мы получили ограниченную Муnационную
Технологию,  но не забудьте,  что F-prot все еще  ловит  ее.  Следующая
простая  мутация  заключается в использовании недокументированной формы
команды shl.

        shl AX,1        D1 E0    1101 000 1 1110 0000 <-Обычно
        SHL AX,1        D1 F0    1101 111 1 1110 0000 <-Недокум

        SHL AX,1        C1 E0 01                      <-Обычно
        SHL AX,1        C1 F0 01                      <-Недокум


        D1 F0           <-Кажется, FP и TB не найдут это

    Теперь несколько необычная часть:  пока весь приведенный код делает
аналогичные вещи, сдвигаем биты в регистре АХ влево при помощи F0h, что
не поддерживается большинством ассемблеров. ( Тем не менее, я читал про
шареварный ассемблер, который может использовать эти коды, и, вероятно,
трассировщик,       понимающий      такой      код).      Использование
"недокументированной" формы будет обдуривать F-Prot каждый раз,  но  на
байты  C1 F0 01 будет вставать TBAV-флажок (как же я люблю этот флажок)
"Обнаружена по крайней мере одна инструкция,  которая  требует  налиция
процессора 80186 или выше". Как будто бы после 8086 в систему команд не
добавлялись новые инструкции!!  Но для сгененированного вирусного  кода
это не тот флаг,  который вам хотелось бы видеть. И вообще, любой флаг,
которого там нет, будет вызывать проблемы.

    ОК, итак мы имеем простую мутацию простого  реверсивного шифровщика
и  как  минимум 4 формы расшифровывающего кода,  не содержащего мутации
регистров.  Следующая часть - это примочка,  которая ничего не  делает,
или мусорный код. Эту фигню надо вводить в действие осторожно. Мусорные
инструкции или Бесполезные байты - это те, которые делают нечто, но это
не влияет на ваш код.  Примеры такого кода - команды NOP и XCHG AX, AX.
В прежние  времена  мутационных  технологий  и  эвристических  сканеров
простое   добавление   NOP-ов   и   XCHG   делало  вирус  устойчивым  к
сканированию.  Но по мере того,  как  сканеры  совершенствовались,  они
научились не обращать внимания на мусорный код или предупреждать юзера,
что имеется код,  кторый не может служить ничему,  кроме  как  сокрытию
вируса.  И  снова  я считаю,  что вы могли бы использовать некоторые из
этих идей,  но имейте в виду,  что два или более NOP-а подряд  возбудят
TBAV.   Итак,   я   подумал,   что  вместо  использования  однобайтовых
инструкций,  почему бы не иметь процедурок,  которые используют  вызовы
прерываний. Просто найдите такие, которые не влияют на многие регистры,
или сохраняйте/восстанавливайте регистры,  это не повлияет на  реальный
код. Пример:

noise_6:
        push    ax           ;1 для использования сдвигов
        mov     ax,0200h     ;3 достаточно сохранить и восста-
        int     16h          ;2 новить AX
        pop     ax           ;1
end_noise_6:

    Используйте эти идеи совместно,  и вы  можете  получить  интересный
фрагмент   кода,   который   будет   генерировать   различные  варианты
расшифровщиков.  А мне  больше  и  не  нужно.  Если  вам  действительно
интересно,  как  хулиганить  с  использованием  Мутационных Технологий,
разберите несколько исходничков и попытыйтесь сделать  что-нибудь свое.
Даже  если  вы  обломитесь при производстве работоспособной Мутационной
Технологии,  вы поймете про них очень многое. Я, вообще, и не собирался
делать из моего кода реальную технологию, это только примерчик - и все.


(C) NF, 1998-2004