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