Análisis de virus: Vienna


Analizamos uno de los virus más famosos, antiguos y con más variantes: 
el vienna, y seguimos paso a paso la evolución de su variante violator.

El virus vienna es muy sencillo y antiguo, creado en Alemania. Fue usado 
como base para la creación de muchísimas variantes. Esto se debe a que 
su código fuente fue publicado en el libro "Computer viruses: A 
High-Tech Disease". Después de esto, mucha gente copió el código y 
simplemente lo modificó un poco para obtener variaciones del virus, que 
a veces difieren en unos simples bytes, o son mucho más complejos. 
Incluso el famoso VCL, o Virus Creation Lab, es, en cierta forma, un 
generador de variantes del virus vienna. En algunos BBS de virus se 
llegó hasta a prohibir subir variantes de este virus, porque los 
usuarios los inundaban con ellos, dado lo fácil que era conseguir su 
fuente y modificarlo. Se trata de un virus extremadamente simple, no es 
residente, e infecta solamente en el momento de ser ejecutado. Ataca 
solamente archivos .com.

Funcionamiento

Cuando se empieza a ejecutar, el virus restaura los tres primeros bytes 
del programa .com original. Luego verifica la versión del DOS sobre la 
que se está ejecutando. Si se trata de DOS 1 no intenta infectar nada y 
vuelve al programa original. Sólo va a infectar con DOS 2.0 o superior. 
Esto se debe a que trabaja con subdirectorios, que en el DOS 1 no 
existían. Vemos lo viejo que es el virus, actualmente ningún autor de 
virus se detendría a pensar en la versión 1 del DOS.

Guarda la dirección actual de la DTA (disk transfer area) y crea una 
nueva dentro de su propia área de datos. Para empezar a infectar, busca 
la variable PATH dentro del environment. El virus intentará buscar el 
primer archivo .COM del directorio actual, haciendo un findfirst de 
cualquier archivo terminado con .COM. En el caso de que en el directorio 
actual no haya ningún archivo .COM, o que estén todos infectados, va a 
buscar en los directorios que están definidos en el path. Busca en cada 
uno de los subdirectorios incluidos en el path hasta que encuentra un 
archivo .COM para infectar. En el caso de que no hubiese ningún archivo 
infectable en el path, termina y vuelve al programa original sin 
infectar nada. Cuando encuentra un archivo .COM, se fija si tiene los 
segundos en 62 (un valor imposible de que suceda naturalmente, pero 
posible de setear en un archivo). En ese caso, considera que el archivo 
está previamente infectado, y busca otro archivo con el método que ya 
describimos. Si el archivo es infectable, se fija si es menor a 64000 
bytes o mayor a 10 bytes. Si no es así, busca otro archivo. La 
comprobación de tamaño la hace la versión del virus que estudiamos 
nosotros (Vienna.645.A), otras versiones no lo hacen.

Cuando encuentra un archivo infectable, procede a leer y guardar sus 
atributos. Pone los atributos del archivo en 'archive', para poder 
escribirlo a pesar de estar en read only, y lo abre para leer y 
escribir. Si no puede abrir el archivo, le devuelve sus atributos y 
termina. Si lo abrió, lee y guarda la fecha y hora original del archivo. 
A continuación está el código de 'ataque' del virus. Genera un número 
pseudo aleatorio con el reloj del sistema y tiene una posibilidad en 
ocho de, en vez de infectar el archivo, sobreescribe los cinco primeros 
bytes del mismo con un código que hace resetear la máquina. Esos cinco 
bytes son 0EAH, 0F0H, 0FFH, 0FFH, 0FFH, y son un FAR JMP a la dirección 
FFFF:FFF0. Lo que va hacer con eso es que cada vez que se ejecute ese 
archivo la máquina se va a resetear. Luego de hacerlo, restaura los 
atributos del archivo y su fecha y hora original, pero poniéndole el 
valor 62 a los segundos. Algunas variantes del virus no destruyen de 
esta manera a los archivos.

En el caso de que deba infectar el archivo, lee los tres primeros bytes 
del mismo y los guarda en una variable. Posiciona el puntero del archivo 
al final del mismo, y prepara el jump al principio del virus que va a 
poner al principio del archivo. Escribe el virus al final del archivo, 
vuelve al principio del mismo, y escribe los 3 bytes del jmp al 
principio del virus en el comienzo del programa .COM.

Con esto el archivo está infectado. Sólo queda restaurar la fecha y hora 
original del archivo, pero modificando los segundos a 62. Cierra el 
archivo, restaura los atributos originales, restaura el DTA original, 
los registros que se usaron, y vuelve al comienzo del programa original.

Variantes

Una variante de este virus es el violator, creado en Canadá. El virus 
Vienna.Violator.716.A es una variante menor del vienna tradicional. La 
principal diferencia que tiene es que luego de chequear el DOS y 
modificar la DTA, y antes de buscar el path, intercala una rutina de 
destrucción de datos. Para activarla, chequea que el año sea mayor o 
igual a 1990, el mes mayor o igual a octubre, y el día mayor o igual a 
31. O sea, se activaría los días 31 de los meses octubre y diciembre a 
partir de 1990. Para hacerlo tiene un código altamente ineficiente: 
llama tres veces al servicio 2Ah de la interrupción 21h, para chequear 
el año, mes y día, cuando con una sola llamada habría alcanzado. Si 
decide que debe empezar a hacer daño, empieza a formatear todos los 
discos rígidos del sistema, a partir del C: hasta el Z:. Luego de hacer 
esta destrucción va a seguir con la infección, pero esto no va a 
importar, ya que los discos estarán destruidos. Aparte de esto, el virus 
funciona en forma muy similar a su predecesor, excepto que en vez de 
marcar los segundos con 62 lo hace con 60, y que si no encuentra ningún 
archivo infectable en el directorio actual o en el path va a intentar 
infectar en el directorio raíz del disco default. Tampoco tiene el 
código que destruye archivos ejecutables con el código para resetear. 
Otra variante es el violator B2 (Vienna.Violator.969), que es una 
versión más moderna del anterior. Sus cambios son que tiene un sistema 
para dificultar el desensamblado. Esto es relativo, ya que lo único que 
hace es agregar una rutina que llama a la interrupción 13h, 21h ó 26h 
según sea necesario. Entonces, en vez de llamar a interrupción en forma 
directa, pone un flag con el valor deseado (1 si es int 21h, 2 si es int 
13h y 3 si es int 26h) y llama a la rutina. Además de formatear el 
principio de cada disco, lo que es bastante fácil de recuperar, esta 
versión escribe 700 sectores de basura en el principio del disco C:, con 
lo cual lo destruye realmente. Esta versión tiene un mensaje de 
'copyright' que dice "Violator B2 (C) '9O RABID Nat'nl Development 
Corp."

La versión B3 (Vienna.Violator.843.B), es básicamente igual pero con 
algunas rutinas cambiadas de lugar. Ahora llama una sola vez a la 
interrupción 21h para obtener la fecha, con lo cual ahorra tiempo y 
longitud de código. Fuera de eso, y algunas modificaciones mínimas más, 
el virus es prácticamente igual. Ahora los bytes de copyright dicen 
"Violator Strain B3 - RABID Nat'nl Development Corp.", y ese texto es el 
que se escribe al disco, junto con parte de sus datos y algo de basura, 
cuando se destruye el disco.

La versión B4 (Vienna.Violator.5302), cambia en que se activa el día 25 
al 31 de diciembre de un año posterior a 1990. En el momento de 
activarse, luego de hacer el desastre que hacen sus predecesores, 
muestra en la pantalla un dibujo de un árbol de navidad. El mensaje que 
ahora escribe en el disco es:

"Violator Strain B4 - Written by The RABID Nat'nl Development Corp.
RABID would like to take this opportunity to extend it's sincerest 
holiday wishes to all Pir8 lamers around the world! If you are reading 
this, then you are lame!!! Anyway, to John McAffe! Have a Merry 
Christmas and a virus filled new year. Go ahead! Make our day!
Remember! In the festive season, Say NO to drugs!!! They suck shit! 
(Bah! We make a virus this large, might as well have something 
positive!)"

El árbol de navidad que muestra es el que vemos en la figura 1. Todos 
estos mensajes hacen que el virus sea muy largo (5302 bytes).
Por último, la versión C (Vienna.Violator.821) ya no chequea si el DOS 
es 2 o superior. En lugar de esto chequea si están presente los 
antivirus Virex/PC o FSP. Si están, no intenta infectar. Esta versión se 
activa en días mayor a 22, en meses mayor al 6 y en años mayores a 1991. 
En lugar de formatear un sector, formatea 256 sectores de cada disco, y 
no hace el borrado extra del drive C:. Si el año es menor a 1990, va a 
poner el año del reloj del sistema en 1990, y los minutos en 1. También 
se activa si los minutos del reloj es mayor a 15 y el año está en 1990. 
Esto es, 15 minutos después de ejecutarse por primera vez en una máquina 
con el año seteado antes de 1990, probablemente para causar daño en 
máquinas que tengan el reloj mal seteado. Antes de borrar los discos, 
imprime en pantalla el mensaje 'Violator strikes again...'. En esta 
versión los bytes de copyright son 'Violator Strain C - (C) 1991 RABID 
Int'nl Development Corp.'. Esta versión tampoco tiene el código de 
llamado indirecto a las interrupciones.

Conclusiones

Con estos ejemplos vemos que las modificaciones que hace a veces un 
'autor' de virus realmente no alcanzan para considerarlo un virus nuevo. 
Además de la rutina de destrucción y la muy dudosa rutina para confundir 
al que quiera desensamblarlo, el que hizo las modificaciones posteriores 
al original no parece tener mucha idea de programación, ni parece 
entender el código lo suficientemente bien como para mejorarlo mucho.

Fernando Bonsembiante es jefe de redacción de Virus Report y está 
estudiando los virus informáticos dese hace varios años. Tambien 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