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