VR21: Análisis de virus: anti-tel
Por Fernando Bonsembiante
En este número analizamos un virus que hace unos años era muy famoso, y que es stealth: anti-tel.
El virus anti telefónica fue muy común hace unos años en Europa y también en Argentina. Toma su nombre de un string que encontramos en su código:
Campaña ANTI-TELEFONICA (Barcelona)
Por lo que vemos fue hecho en España, más precisamente en Barcelona, y probablemente como protesta contra Telefónica de España. Infecta boot sectors en diskettes y tablas de particiones en discos rígidos. El virus se activa después de bootear 400 veces con un disco infectado, y destruye el disco. Mientras destruye el disco, muestra en pantalla el mensaje que ya mencionamos.
Funcionamiento
Al bootear la máquina con un disco infectado, el virus se carga a partir de la dirección 0:7C00, y se empieza a ejecutar desde ese punto. Empieza moviendo el stack a una zona de memoria anterior al virus y cambiando la memoria disponible para el DOS, reservando 1k en el tope para su propio uso. Luego copia su propio código al final de la memoria, y continúa ejecutándose allí. A diferencia de muchos virus de boot, no continúa ejecutándose en la siguiente instrucción, sino que salta por encima de un área de datos y algunas rutinas. Una vez copiado y ejecutándose en la última parte de la memoria convencional, llama a la interrupción 13h para resetear el disco. Como el virus ocupa dos sectores dentro del disco, hay una tabla que indica para cada formato de disco en qué parte se guarda el resto del virus. Mediante una rutina determina la posición del código restante en el disco dependiendo de qué formato tenga, y usa otra rutina para leer el sector en memoria, a continuación del código movido. Esa rutina trata de leer cuatro veces el sector antes de devolver error. En el caso de discos rígidos, el sector es el 6 del cilindro 0, en el espacio anterior a la primera partición.
En este punto incrementa el contador de booteos, y si llegó a 400 activa la rutina de destrucción. Este código se encuentra en la segunda parte del virus, y funciona de la siguiente manera:
Primero que nada escribe el boot sector del virus con el contador en cero nuevamente. Esto es porque, si bien el virus destruye el disco rígido, si se reformatea la partición el virus seguirá allí, y a los 400 booteos va a destruir todo nuevamente. Como el virus está en la tabla de particiones, y la segunda parte del mismo está antes de la primera partición, el formateo no lo afecta. La rutina de destrucción toma como buffer de datos la parte más baja de la memoria, o sea, la tabla de interrupciones. El efecto neto es que se sobreescribe el disco con basura. Luego de destruir gran parte del disco, desencripta el mensaje y lo muestra en la pantalla. Cuando el mensaje ya está escrito, sigue destruyendo el disco e intenta destruir otros discos rígidos que se encuentren en el sistema. Cuando se acaban los discos, cuelga la máquina.
En el caso de que no haya que destruir el disco, el virus vuelve a escribir el sector de booteo o tabla de particiones en el rígido con el contador actualizado. Lee el boot original en memoria, que se encuentra en el sector siguiente de la segunda parte del código del virus, y lo pone en 0:7C00, donde debió haberse cargado en el principio. En el caso de que se haya cargado de diskette, procede a infectar el disco rígido. Para eso lee la tabla de particiones del disco rígido y verifica si ya estaba infectado. Si no lo estaba, lee los parámetros del disco rígido usando la función 08 de la interrupción 13h y guarda el número de cabezas, sectores y tracks en variables. En el caso de que la función no esté soportada o devuelva error, asume que hay cuatro cabezas, 17 sectores y 611 tracks. Luego guarda en variables el número de drive y el índice para la tabla que nombramos antes, que indica donde guarda el virus. Escribe el boot original en el disco, copia la información de la tabla de particiones en el cuerpo del virus, para que quede en el lugar correcto a pesar de que el virus reemplazó el código de booteo, y escribe en el disco el virus en la tabla de particiones y la segunda parte en su lugar. Reemplaza el vector de la interrupción 13h por su propio handler, y guarda en una variable el valor que había en la tabla. Después de eso ejecuta el boot sector original y sigue con el proceso normal de carga del sistema operativo.
En el caso de que se hubiese cargado de un disco rígido, simplemente redefine la interrupción 13h y vuelve al boot sector original, ya que no necesita infectar nada en ese momento.
Interrupción 13h
La rutina de servicio de la interrupción 13h que instala el virus verifica si se está tratando de acceder a un disco rígido o a un diskette. Si es un rígido, va a implementar una rutina de stealth. Si se intenta escribir en el cilindro 0, cabeza 0, el virus va a cambiar la función de escribir a una de verificar. De esta forma, cualquier intento de remover el virus con éste en memoria va a ser inútil si se usan las rutinas convencionales del BIOS. Si se intenta leer el master boot record, el virus muestra el sector original tal como estaba antes de infectarlo. Si se intenta leer alguna de las otras partes donde se aloja el virus, va a devolver otro sector sin virus.
El código que hace esto es el siguiente:
HDD_handler:
cmp ah,2 ; Quiere leer??
je leer ; Si, salta
cmp ah,3 ; quiere escribir?
jne eje_int13h ; No, volver a la int 13h original
; ----- handler de escribir
or ch,ch ; track = 0 ?
jnz eje_int13h ; no, int 13h original
or dh,dh ; head = 0 ?
jnz eje_int13h ; no
inc ah ; cambiar write a verify
jmp short eje_int13h
; ------ handler de leer
leer:
cmp al,1 ; un solo sector?
jne eje_int13h ; no, se va
or dh,dh ; head=0 ?
jnz eje_int13h ; no
cmp cx,1 ; track 0, sector 1
je boot_vir ; boot
cmp cx,6
je boot_org ; segunda parte del virus
cmp cx,7
jne eje_int13h ; ejecutar int 13h original
; ---- boot original o segunda parte del virus
boot_org:
push cx
push dx
mov cl,5 ; cambiar por sector 5
jmp short org_13h ; ejecutar int 13h orig.
; ----- boot del virus
boot_vir:
push cx
push dx
mov cl,7 ; boot original
org_13h:
call org_int_13h ; llamar a la int 13h original
pop dx
pop cx
pop ds
pop si
retf 2 ; salir
eje_int13h:
jmp l_01B0 ; ejecutar int 13h original
En el caso de que se intente acceder a un diskette, verifica que se trate del diskette a: y que sea una operación de lectura o escritura. Si es así, y el motor del diskette está prendido, intenta cuatro veces leer el sector de booteo. Cuando lo puede leer, verifica si ya estaba previamente infectado. Si lo estaba, y la operación era de lectura sobre el sector de booteo, saca de la tabla el dato de donde estaba el sector original y lo muestra en lugar del virus, haciendo con esto una operación de stealth. En el caso de que el disco no estuviese previamente infectado, procede a hacerlo. Determina que formato tiene el disco, y, de acuerdo a su tabla, decide en dónde va a poner el boot sector original y el segundo sector del virus. Copia la tabla de parámetros del diskette en su lugar dentro del virus, para que quede correcta en el boot sector contaminado, y escribe el virus en el disco.
Como vemos, se trata de un virus de boot con un stealth muy simple, pero efectivo. Es bastante peligroso en su activación, y, como no tiene fecha, sino cantidad de booteos, lo ideal es limpiarlo apenas se descubre, ya que el siguiente booteo puede ser el último.
Fernando Bonsembiante es jefe de redacción de Virus Report y está estudiando los virus informáticos desde hace varios años. Es miembro del Círculo Argentino de Ciencia Ficción, (CACyF) y participa como columnista de varias revistas sobre informática. También es asesor en seguridad informática y virus en varias empresas. Puede ser contactado por Fido en 4:901/303 o en Internet en ubik@ubik.to