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