VR12: 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:
- Un string del environment termina con PHX.
- En algún momento se ejecuta un determinado programa reconocido por el virus.
- 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