Análisis de virus: Vienna
Por Fernando Bonsembiante
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