Análisis de virus: PHX
Por Leandro Caniglia y Fernando Bonsembiante
Es raro que un virus argentino y nuevo se convierta
rápidamente en epidemia. El Willistrover III lo logró, a
pesar de no tener grandes sofisticaciones a nivel de
infección u ocultamiento.
Este virus, llamado Willistrover III por el Scan y PHX
por el F-Prot, está causando estragos en todo el país. Se
lo encontró en muchos lugares de Buenos Aires, Rosario, y
otras ciudades, mientras que en Posadas se encuentran
cantidades de una variante del mismo que no es detectada
por el Scan pero si por el F-Prot. No se sabe por qué
este virus está tan difundido, y por lugares tan lejanos
como los nombrados. Se lo encontró en instituciones
oficiales y en diskettes de shareware, lo que no se sabe
es que vía usó el autor para distribuirlo, o si su éxito
fue casual o planificado. Por algunas características del
virus podemos suponer que al autor le interesaba que se
disperse lo más posible. El virus está buscando algo en
especial para iniciar sus rutinas de daño, está buscando
un programa o determinada tarjeta instalada en la PC,
algo que todavía no podemos determinar con total
seguridad. Quizá algún lector de Virus Report pueda
descubrir de qué se trata.
Nos hemos comunicado con el autor del virus, a través de
un BBS, pero no nos dio casi ningún dato sobre qué es lo
que busca, ni sobre algunos interrogantes que planteamos
en esta nota. Lo único que nos dijo es que él le puso
Tracker al virus (obviamente porque está buscando algo,
tracker en inglés significa rastreador). Esta persona se
hace llamar Armagedon, y es argentino (no confundir con
el autor de virus del mismo nombre de origen griego).
Dice que hizo el virus para vengarse de una persona que
le jugó una mala pasada con un programa. El virus está
buscando el programa y la máquina de su enemigo y va a
corromper lentamente sus datos cuando los encuentre.
Infecta tanto programas .exe como .com. El daño que
produce, bajo las condiciones de que haya encontrado el
programa que busca, es el de cambiar el bit más alto del
último byte grabado en cada operación de disco. El cambio
consiste en invertir su valor, si es 1 pasa a ser 0, y si
es 0 pasa a ser 1. Esta rutina es muy peligrosa, ya que
causa daño muy lentamente, y cuando el usuario nota algo
extraño ya es demasiado tarde. Se activa cuando se cumple
alguna de las siguientes condiciones:
1) Un string del environment termina con PHX.
2) En algún momento se ejecuta un determinado programa
reconocido por el virus.
3) El port 3E4h está activo. (puede tratarse de alguna
placa especial en la PC)
Si se cumple alguna de las tres condiciones, el virus
chequea que se haya instalado por lo menos 128 veces en
la misma máquina. Esto lo verifica mediante un contador
que pone en la CMOS, ubicado en un lugar que normalmente
no se usa. Si se cumplen esas condiciones, o sea, una de
las tres que mencionamos antes, y que el contador tenga
ese valor, empieza a corromper lentamente los datos
escritos. Como cada vez que se instala en memoria el
virus incrementa el contador, y la rutina funciona cuando
éste está entre 128 y 255 (luego va a pasar a 0
nuevamente), el proceso de destrucción es extremadamente
lento.
Otro dato interesante es que el virus tiene un contador
interno de generaciones, si éste es 0 es el original, si
tiene el valor 1 es la primera generación, y así
sucesivamente. Los ejemplares que estudiamos tienen más
de 11 generaciones.
También cabe destacar que el virus funciona solamente en
286 y superiores, ya que usa instrucciones sólo válidas
en esos procesadores.
Funcionamiento
Lo primero que hace el virus es chequear si está presente
en memoria, para ver si debe reinstalarse o no. En el
caso de los .com tiene un bug que hace que se reinstale
cada vez, en el caso de los .exe no sucede. En el caso de
que esté ya instalado en memoria, reconstruye el
principio del programa huésped y lo ejecuta.
Para instalarse en memoria, tanto si es un .exe o un
.com, llama a dos rutinas. Una de ellas mueve el código
al final de la memoria, y la otra instala la nueva
interrupción 21h.
La rutina que mueve el virus al final de la memoria
primero libera los últimos 41h párrafos de memoria y
luego le asigna 40h de ellos al virus, ya que el DOS
necesita uno como header del bloque de memoria. Toma ese
header y le pone el valor 0800 en el offset 1, indicando
que esa memoria pertenece al IBMDOS.COM, o sea, que es
parte del sistema operativo. En el offset 08 del header
pone SP como nombre del programa dueño de la porción de
memoria. Luego copia el virus a ese bloque. De esta forma
pretende ocultarse de algún programa que examine la
memoria, aunque usando algunos de ellos, como el Manifest
de Quarterdeck se puede ver claramente una porción de
memoria extraña. Usando el MEM del DOS se ve como una
porción de memoria de datos perteneciente al IBMDOS.
La rutina que instala la interrupción 21h nueva busca el
valor actual del vector de la interrupción 21h y modifica
el propio código del virus para hacer apuntar un jump al
handler de la interrupción 21h del DOS. Luego instala su
propio handler de la interrupción 21h y aumenta en uno el
valor de su contador en la CMOS. De esta forma queda
instalado en memoria, y tomando la interrupción 21h.
Interrupción 21h
El handler de esta interrupción instalado por el virus
verifica si el servicio pedido es el 04Bh (ejecutar
programa), 03D02h (abrir archivo para lectura y
escritura), 0B974h (chequeo de la presencia del virus en
memoria) o 040h (escritura en archivo o en dispositivo).
Si no es así, vuelve a la vieja interrupción 21h para
procesar el pedido normalmente.
El servicio 0B974h instalado por el virus simplemente
devuelve el valor 2808h en AX, con lo que dice que el
virus está en memoria. Ese valor parece tener algún
significado especial, ya que al final del virus aparecen
los bytes 28h 08h 93h, parece ser una fecha, pero escrita
en hexadecimal e interpretada como si fuesen números
decimales. Esos bytes son usados como identificador para
el virus. En realidad el virus fue descubierto antes de
esta fecha, así que no es la fecha de creación del virus.
Si a algún lector se le ocurre qué puede significar esa
fecha, que nos lo diga.
Si la función pedida es 04Bh, ejecutar un programa, el
virus pide la dirección del Program Segment Prefix de
quien pidió la función. Del PSP saca la dirección del
environment local del programa, y en éste environment
busca un string que termine con PHX. Si lo encuentra,
pone en 1 el flag que indica que encontró el programa que
buscaba. Para empezar la rutina de infección reemplaza la
interrupción 24h del DOS (error crítico) para que
devuelva siempre 03. Luego de esto verifica si en el
disco de donde se está leyendo el programa a ejecutar hay
por lo menos dos clusters disponibles. Si no es así,
sigue con la interrupción 21h normal luego de recuperar
el vector original de la interrupción 24h. Antes de salir
verifica si el port 3E4h no devuelve el valor 0FFh. Si
devuelve otro valor pone en 1 el flag de que encontró lo
que buscaba. Si hay lugar para el virus, procede a
infectar el archivo. Lo primero que hace es modificar el
nombre del archivo de una forma especial (que no vamos a
decir cómo es). Esto tiene una razón de ser, sirve para
confundir al Vsafe, el residente del Microsoft Anti
Virus, que no detecta nada raro de esta forma. Luego
guarda los atributos del archivo, los modifica para poder
infectar incluso archivos read only, poniendo como
atributo solamente 'archivo'. Luego abre el archivo con
acceso lectura y escritura, y obtiene y guarda la fecha y
hora del archivo. Lee los primeros 1Ch bytes (28 bytes),
y verifica si se trata de un .exe, controlando que
empiezen con MZ. En el caso de que sea un .com, modifica
el código del virus guardando los tres primeros bytes del
programa a infectar en las instrucciones que luego se
encargarán de restituirlos. Luego lee el final del
archivo para verificar si termina con los bytes '28 08
93', si es así, considera el programa ya infectado y
vuelve a la interrupción 21h original. En el caso de que
no esté infectado, verifica si el programa .com tiene
lugar suficiente como para albergar el virus. Recordemos
que el tamaño máximo de un .com es 64k, y si el virus mas
el programa fueran mayores a eso el programa infectado
dejaría de funcionar. En el caso de no haber lugar,
vuelve. Si todo es correcto, reemplaza los tres primeros
bytes del archivo por un jump al final del archivo, que
es donde se alojará el virus. En ese momento incrementa
el contador interno de archivos infectados o
generaciones, y se copia al final del archivo. Para
terminar la infección, escribe en el principio del
archivo las modificaciones que ya mencionamos. Vuelve a
poner en el archivo los viejos atributos y la fecha y
hora que tenían, recupera el nombre original del archivo,
y se va de la forma que ya explicamos.
En el caso de que el programa sea un .exe, verifica si
está previamente infectado, buscando '28 08 93' en el
final del archivo. Busca el comienzo del programa en el
.exe y modifica su código para que se ejecute el programa
huésped a continuación del virus. Luego compara si el
tamaño del exe cuando está en memoria es el mismo que el
tamaño efectivo del archivo. Si no es así, asume que
tiene overlays y no lo infecta. Si decide que puede
infectarlo, modifica el header del .exe para que apunte
al comienzo del virus, se escribe a si mismo al final del
.exe, modifica el header del archivo en disco y se va.
En el caso de que la función sea la 40h, escribir
archivo, verifica si el flag de empezar a destruir está
en 1. Si no, vuelve a la interrupción 21h normal. A
continuación pregunta si AX es igual a 1, si es así, se
va. El problema es que si AH es igual a 40h, AX no puede
ser nunca 1. Probablemente quiso verificar con BX el
número de handle, si es 1 se trata de la consola y no
tiene sentido hacer el daño sobre la consola. Por lo
tanto, debe ser un bug del virus. Si todo está bien,
verifica si el contador de la CMOS es menor a 80h. Si es
así, vuelve. Si no, empieza su daño. Para eso toma el
final del buffer que se quiere escribir en el archivo
usando la función 40h del DOS y le cambia el bit 7 del
último byte. Con esto hace un daño muy sutil pero
efectivo. Después de hacerlo vuelve a la interrupción 21h
original.
En el nuevo handler de la función 3D02h, abrir archivo
para lectura y escritura, lo que hace es comparar el
código que llamó a esa función con tres pedazos de código
que tiene almacenados. Si no los reconoce, no hace nada y
vuelve a la interrupción 21h original. Si los reconoce,
pone en 1 el flag que indica que hay que empezar a hacer
daño, y vuelve.
Conclusiones
Este virus es especial porque está buscando una máquina o
programa en especial para iniciar su daño. Podríamos
decir que es un virus vengativo o dirigido especialmente
a un objetivo determinado. De todas formas, el virus
afectó a muchísima gente, aunque sin hacer daño a la
mayoría. Fue una molestia para mucha gente que no tenía
nada que ver con el problema que tuvo el autor del virus
y que ocasionó que decidiera hacerlo.
Leandro Caniglia es Doctor en Ciencias Matemáticas,
Profesor Adjunto en FCEN (UBA) e Investigador Asistente
del CONICET. Puede ser contactado en internet en
caniglia@mate.edu.ar o en leandro@ubik.satlink.net y en
FidoNet 4:901/303.4.
Fernando Bonsembiante es jefe de redacción de Virus
Report y está estudiando los virus informáticos desde
hace varios años. También es miembro de la comisión
directiva del Círculo Argentino de Ciencia Ficción,
(CACyF) y participa como columnista de varias revistas
sobre informática. Puede ser contactado por Fido en
4:901/303 o en Internet en ubik@ubik.to
==============================
Estos son los tres trozos de código que busca el virus
para iniciar su ataque, junto con el string del
environment terminado en PHX y el port 3E4H activo. Si
quieren buscar si tienen ese programa, pueden agregar
estos strings a un anti virus y pasarlo por sus discos.
Si algún lector llega a alguna conclusión interesante con
esto, que nos avise.
73 05 BA B9 02 EB E0 A3 C0 01 B4 3F 8B 1E C0 01
72 C7 A3 05 01 8B D8 B8 00 3F B9 00 01 BA 48 C8
72 C1 A3 05 01 8B D8 B8 00 3F B9 00 01 BA 1A CA