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
[email protected]