Analisis de virus: VCL
por Fernando Bonsembiante
En este número vamos a analizar un programa generador de
virus, el VCL. Con este programa cualquiera puede ser
autor de su propio virus.
Una pregunta que se oye siempre en los seminarios sobre
virus es "¿es difícil hacer un virus?". La respuesta
suele ser variada, pero básicamente hay que tener un
conocimiento bastante bueno de assembler, de las
estructuras del DOS y de los archivos ejecutables. Por
supuesto que existen virus hechos en lenguajes de alto
nivel como Pascal o C, pero para que el virus sea
medianamente exitoso debe ser pequeño y rápido, por lo
cual el assembler es el lenguaje de elección.
Normalmente la producción de virus es algo para quienes
tienen algunos conocimientos. Incluso se dijo que si
hacer un virus sirve para algo, puede ser que el que lo
hace aprende mucho en el proceso. Pero el programa que
estamos analizando hoy es la demostración de que incluso
no sabiendo prácticamente nada de programación se pueden
hacer virus que funcionen.
El Virus Creation Lab, o laboratorio de creación de
virus, es un programa que permite crear virus
seleccionando una serie de opciones. El programa fue
hecho por alguien que se hace llamar "Nowhere Man",
perteneciente a una organizacion llamada 'NuKE', quien
indudablemente quiso ganarse la fama (bajo seudónimo)
haciendo la vida más fácil a los que quieren hacer virus.
La presentación del paquete no puede ser más profesional.
Trae un programa instalador que marca el disco para que
no se pueda distribuir el programa una vez instalado, y
los programas y documentación vienen comprimidos. No se
pueden descomprimir sin el instalador, con lo cual el
autor se asegura de que se mantenga la integridad del
programa.
La documentación es similar a la de cualquier programa de
shareware, está muy cuidada y detallada. Empieza
reconociendo las marcas registradas que se van a nombrar
en el texto, como cualquier manual de origen
norteamericano. Le sigue una nota supuestamente 'legal',
que cuesta decidir si fue escrita en broma o en serio.
Basicamente dice que Nowhere Man no puede ser hecho
responsable por ningun daño causado por el uso o mal uso
de cualquier programa producido en totalidad o en parte
por el VCL. Tambien se reserva el derecho de propiedad
sobre todo el código producido por el programa, sin el
permiso escrito de Nowhere Man. Me gustaría saber como es
el permiso escrito de una persona que se esconde tras un
alias. De todas formas, todo esto es para llegar a decir
que prohibe que se use cualquier código generado por el
programa para hacer un string de identificación para un
scanner o para examinarlo y encotrar la forma de
detectarlo y/o removerlo. Tambien se prohibe desensamblar
los virus generados con este programa. Todo esto no
parece haber preocupado mucho a los autores de anti-
virus, porque casi todos detectan a los virus producidos
por el VCL.
A continuación de esta nota, hay una de carácter más
práctico que dice que por favor le den crédito al VCL
cuando distribuyan virus creados con este programa,
porque un proyecto que le llevó varios meses. Tambien
avisa que se debe tener mucho cuidado con que se hace con
estos programas y a quien se los da porque son muy
peligrosos. Con esto quiza quiere calmar su conciencia
por haber hecho algo reprochable como crear este
programa, aunque en el resto de la documentación se
enorgullece de su producto.
El entorno de producción
El programa está hecho usando Turbo Vision, un conjunto
de rutinas y bibliotecas de funciones desarrolladas por
Borland para facilitar la creación de interfaces de
usuario. El resultado es un programa que es visual y
operativamente muy similar a los lenguajes de Borland.
Incluye un sistema de ayuda en contexto muy completo, con
hipertexto, que hace innecesario el manual cuando se está
usando el VCL.
Hay un menú de sistema, donde podemos encontrar el
'about', o sea, un copyright del programa, y la opción de
'boss key', para ocultar el programa en el caso de que se
acerque alguien. Esta opción está bastante bien hecha, ya
que se emula un DOS bastante bien, del que sólo se sale
tipeando NuKE. Luego tenemos el menú de manejo de
archivo, con el cual se puede crear un nuevo archivo de
definición de virus, cargar uno con el que ya se estaba
trabajando, guardar el que se está editando en ese
momento, y todas las opciones de archivo que normalmente
se encuentran en un entorno de trabajo de un lenguaje
tipo Borland. Tambien en ese menú tenemos la opción de
pedir información sobre el virus que se está creando, nos
da un resumen muy breve de como es el virus.
Opciones
El tercer menú ya es más interesante. En éste podemos
elegir que tipo de virus se creará. Las opciones son:
Appending, o sea que el virus se agregue al programa
infectado. Overwriting, donde el virus sobreescribe a su
huésped. Spawning, es el caso en el que en vez de
modificar el programa original se crea un archivo con el
mismo nombre pero con extensión .COM para que el DOS
ejecute en lugar del .EXE infectado. Trojan Horse, este
caso no es un virus, sino un caballo de troya, o sea un
programa que dice realizar una acción legítima pero en su
lugar produce un daño. Por último, tenemos las Logic
Bomb, bombas lógicas, en ese caso el VCL va a producir
una porción de código que se puede incorporar a un
programa para que, dada cierta condición, se active. El
caso típico de la bomba lógica es el programa de sueldos
y jornales que detecta que su autor fue despedido y
formatea el disco del empleador como represalia.
Para cada uno de estos casos tenemos varias opciones.
Para los virus, se puede elegir que infecten. En esta
versión del VCL solo se pueden crear virus parasitarios
que infecten archivos .COM, en el caso de los overwriting
pueden infectar .COM y .EXE, y en los spawning, por su
forma de funcionamiento, sólo .EXE. Empezamos a notar las
limitaciones del programa, ya que sólo permite infectar
.COM sin destruirlos (recordemos que los virus
overwriting destruyen sus huéspedes). La opción de ser
residente está presente pero no activa, en el manual la
prometen para la próxima versión. Esto es otra debilidad
del programa, ya que los virus más interesantes y
exitosos son residentes. Tambien se promete la opción de
hacer indetectable al virus para cualquier antivirus
residente, pero si la primer versión no tiene la opción
de hacerlos residentes parece muy difícil que pueda
llegar a tal nivel técnico en la segunda versión. Se
puede tambien elegir el tipo de búsqueda que va a hacer
el virus al infectar, o sea, en que directorios va a
buscar y que archivos, y la virulencia, o sea, la
cantidad de infecciones que va a hacer por cantidad de
veces que se ejecute el virus. Para todos los programas
generados, sean virus o no, están las opciones de generar
código que impida el desensamblado y la encripción. El
código anti-desensamblado se basa en deshabilitar el uso
de un debuger para seguir paso a paso el virus y en
incorporar 'basura' en el código para confundir un
desensamblado automático hecho con Sourcer. Ninguno de
los dos trucos son realmente útiles, ya que ningun
investigador anti-virus sigue el código paso a paso para
desensamblarlo, y las técnicas para evitar el uso del
Sourcer no dan mucho resultado y son fáciles de evitar.
La encripción puede llegar a ser más molesta, pero
tambien utiliza un esquema muy sencillo y fácil de
resolver. Por último, se puede agregar una nota interna a
la definición del virus.
Efectos
El menú de efectos es el que controla lo que va a hacer
el virus como 'ataque'. Se pueden elegir una gran
cantidad de rutinas, por ejemplo, mostrar un mensaje,
hacer un ruido, colgar la máquina, destruir uno o más
discos, etcétera. Una vez elegido el efecto, aparece un
menú que permite elegir cuando se va a disparar el
efecto. Se pueden configurar hasta cinco rutinas de
activación, como ser verificar si es una hora
determinada, si es un día determinado, al azar, si se
infectaron todos los archivos disponibles, el tipo de
CPU, etcétera. Esas condiciones pueden activar el virus
si están todas presentes o si por lo menos una se cumple.
Tambien se puede elegir si se activa antes o después de
la infección de un archivo. Algo interesante es que se
pueden agregar tanto condiciones como efectos,
simplemente hay que escribir la rutina en assembler
correspondiente y luego agregarla desde este menú.
Se pueden seleccionar hasta diez efectos distintos, que
se van a activar en la secuencia en la que aparecen en el
menú. Con esto se puede llegar a programar una cantidad
de efectos muy variada, pero que no hacen a la función
específica del virus que es la reproductora, sino a su
ataque. Si bien el ataque es la parte que causa los
problemas más visibles, la reproducción es la que hace
que un virus tenga éxito o no.
Creación del virus
La parte final del programa es la encargada de crear el
virus en si. Hay dos opciones dentro de ésta. Se puede
crear el archivo en assembler, o un .COM directamente,
listo para funcionar. En realidad, no produce archivos
.COM directamente, sólo ensambla el .ASM generado usando
el assembler que se defina en la configuración. El
peligro del programa es precisamente generar un archivo
.ASM y luego modificarlo a mano para que los antivirus no
lo detecten como un virus creado por el VCL. Los virus en
si, como ya vimos, no son peligrosos, son virus no
residentes comunes, sin complicaciones. El problema que
presenta el VCL es la posibilidad que le da a cualquiera
de crear su propio virus sin tener idea de programación.
Esto puede generar una superproducción de virus, algo que
es mucho más preocupante que los virus generados con el
VCL por si mismos.
Aquí tenemos la rutina generada por el VCL para encriptar
y desencriptar un virus. Es muy sencilla, utiliza un XOR
para hacer el trabajo, por lo tanto se puede usar para
encriptar o desencriptar. Cualquier persona con
conocimentos de assembler puede desencriptar un virus que
use este esquema.
encrypt_decrypt proc near
lea si,[bp + start_of_code] ; SI points to code to decrypt
mov cx,(end_of_code - start_of_code) / 2 ; CX holds length
xor_loop:
db 081h,034h,00h,00h ; XOR a word by the key
inc si ; Do the next word
inc si ;
loop xor_loop ; Loop until we're through
ret ; Return to caller
encrypt_decrypt endp