Análisis de virus: virus sencillos
Por Fernando Bonsembiante
Vamos a ver algunos virus muy sencillos, pero que a pesar
de su sencillez ilustran muy bien algunos conceptos
interesantes.
En números anteriores hablábamos de las técnicas que
utilizan los virus para evadir la detección por los
antivirus. Es indudable que muchas de esas técnicas han
tenido el éxito esperado, pero no siempre se engaña a un
antivirus complejo con un virus complejo. A veces, un
virus simple puede causar tanto o más problemas que uno
sofisticado. Estos virus que presentamos ahora tienen esa
característica, de ser extremadamente simples.
TrekWar
TrekWar es un virus de los llamados acompañantes. No
modifica el archivo a infectar, simplemente crea un
archivo con el mismo nombre que un .exe en el mismo
directorio, pero con extensión .com. Ese archivo es el
virus. Como el DOS ejecuta el .COM en el caso de que haya
un .com y un .exe con el mismo nombre en el directorio,
el virus es ejecutado, y luego el virus ejecuta al
programa infectado. Notemos que si bien el comportamiento
de este virus, para el usuario, es exactamente igual al
de un virus común, este no modifica el programa huésped,
por lo tanto algunos investigadores no consideran que se
trate realmente de un virus. De todas formas, nosotros
vamos a considerarlo como tal, ya que el efecto neto es
como el de un virus común, ya que se reproduce y se
asocia a los programas del usuario.
El virus empieza liberando la memoria que no va a usar,
ya veremos por qué. Luego empieza a leer el directorio en
memoria. Carga en un buffer uno por uno los nombres de
archivos que tienen extensión .EXE, y los copia a otro
buffer con extensión .COM. Luego intenta abrir el
archivo. Si el archivo se puede abrir, supone que existe,
y busca otro .EXE. Si no puede abrirlo, supone que no
existe y se prepara para infectarlo. De esta forma, cada
vez que se ejecute el virus va a infectar el siguiente
.EXE que se encuentre en el directorio actual. Notemos
que todo el trabajo lo hace en el directorio actual, y no
busca en otros directorios, ni en el donde estaba el
virus originalmente. Por lo tanto, si ejecutamos un
programa infectado en un directorio que está en el path,
pero no en el actual, el próximo archivo infectado estará
en el directorio actual.
En el caso de que encuentre en el directorio actual un
archivo .EXE sin su correspondiente .COM acompañante,
procede a infectarlo. Primero crea el archivo, y si le da
error, termina. Si no, escribe el virus en memoria en un
archivo con el mismo nombre que el .EXE a infectar, pero
con extensión .COM. Luego de hacerlo, cambia sus
atributos a Read Only y Hidden, para que sea un poco más
difícil de encontrar haciendo un dir normal. A
continuación, llama a la interrupción 2Eh para ejecutar
el programa infectado, con .exe incluido. Lo que hace
esta interrupción es pasar al command.com el argumento
como si fuera tecleado por el usuario directamente. Por
eso liberaba antes la memoria, para que se pudiera cargar
el programa y tuviese lugar. El problema que puede causar
este método es que si el programa infectado se llama
desde un batch, puede causar resultados extraños, ya que
esta interrupción no funciona correctamente con batchs.
Luego de ejecutar el comando, termina y vuelve al DOS.
Como el que ejecuta el programa es el virus, y no se
preocupa por el errorlevel que pueda devolver, un
programa infectado no devolvería el errorlevel intentado
por el programa, sino cero.
El virus mide 543 bytes. Es bastante corto, pero lo
sorprendente es que contiene una gran cantidad de texto
que nunca se muestra, el texto es el siguiente:
Beyond
The rim of the star-light
My love
Is wand'ring in star-flight
I know
He'll find in star-clustered reaches
Love
Strange love a star woman teaches.
I know
His journey ends never
His star trek
Will go on forever.
But tell him
While he wanders his starry sea
Remember, remember me.
[TrekWar]
Ese texto es la letra de la música de apertura de la
serie Star Trek. Si ese texto no estiviese, el virus
mediría sólo 230 bytes, menos de la mitad.
TrekWar puede engañar a los chequeadores de integridad o
a los controladores de comportamiento sin ningún
problema.
Zero-2-O
Este virus recibe ese nombre porque convierte todo cero
que encuentra en la pantalla en una letra O mayúscula, en
el momento en que es activado. Es un virus residente y
overwriting, o sea que en vez de infectar el archivo y
ejecutar el programa infectado después de ejecutar el
virus, el programa infectado queda destruido, y queda
solamente el virus.
Lo primero que hace al cargarse es buscar el handler de
la interrupción 21h con el servicio 35h de la
interrupción 21h. Luego instala su propio handler, usando
el servicio 25h. Después de esto, queda residente con la
interrupción 27h. Eso es todo lo que hace en el momento
de ejecutarse. No verifica si ya estaba instalado en
memoria.
El handler instalado de la interrupción 21h es el que
hace todo el trabajo de infección y de cambiar los 0 a O.
El handler redefine el stack al empezar, y verifica qué
función fue la llamada. Si se trata de la función 4Bh,
load and execute, se activa, e intenta infectar el
archivo. Si es otra función retorna el control a la vieja
interrupción 21h. Cuando se activa toma el segmento B800,
que corresponde al buffer de texto de modos de video
color. Si el sistema tiene una plaqueta hércules, cuyo
buffer empieza en el segmento B000, no se verá ningún
efecto. El virus no hace el menor esfuerzo para detectar
el tipo de tarjeta gráfica. El código que reemplaza los 0
con O es el siguiente:
mov ax,0B800h
mov ds,ax ; DS:BX = Memoria de video
mov bx,0 ; tarjetas color
cero_a_o:
mov al,[bx] ; Leer caracter de pantalla
cmp al,'0' ; Es un '0'?
jne siguiente ; No, saltar
mov al,'O' ; Si, poner una 'O'
siguiente:
mov [bx],al ; Copiar nuevamente
inc bx ; en la pantalla
inc bx ; saltear atributo
cmp bx,1000h ; repetir mil veces
jne cero_a_o
Como vemos, la rutina lee cada caracter de la pantalla y
lo vuelve a escribir, sea o no un cero. Simplemente
cambia los 0 cada vez que los encuentra a O.
Cuando ya hizo el reemplazo, se prepara a infectar. Lo va
a hacer buscando el primer archivo .COM y comparando su
longitud. El criterio que usa para decidir si el archivo
está infectado es si tiene exactamente el mismo largo que
el virus. Si es así, no lo infecta. Notemos que no va a
infectar el archivo que se está por ejecutar, sino el
primer archivo que encuentra en el directorio actual.
Esto es un comportamiento extraño para un virus
residente. Sigue buscando archivos hasta que encuentra
uno infectable o se le acaban los archivos .COM del
directorio. Cuando encuentra un archivo que puede
infectar, lo sobreescribe con su propio código en
memoria. Luego continua con la interrupción 21h normal.
Zero-2-0 tiene sólo 403 bytes, pero podría ser más chico
si en vez de usar variables internas usara memoria
externa a sí mismo. Contiene el texto 'ScUD 1991!', que
nunca se muestra, lo que indicaría que fue escrito en
1991.
Trivial.40.B
Este virus no tiene mucho más interés que ser uno de los
más pequeños del mundo. Mide 40 bytes solamente, y hace
lo mínimo que se puede esperar de un virus: reproducirse.
No es residente (¡no se puede esperar tanto!) y es
overwriting, o sea, sobreescribe el archivo que infecta,
no deja el código del programa infectado. Infecta
solamente el primer archivo .COM que encuentra en el
directorio default.
Funciona de la siguiente manera: Con el servicio 4Eh de
la interrupción 21h busca el primer archivo que termine
con .com. Si no lo encuentra, se va. Si lo encuentra, lo
abre y escribe sobre los primeros 40 bytes del mismo su
propio código, sacándolo de la memoria. Termina con el
servicio 4Ch de la interrupción 21h, que cierra los
archivos abiertos y vuelve al DOS. De esta forma ahorra
unos bytes de código. A pesar de ser tan pequeño, no hace
nada en forma desprolija, abre y cierra los archivos en
forma correcta, en caso de error sale sin infectar, e
infecta archivos .COM solamente. Hemos visto versiones
más chicas, de 35 o incluso 30 bytes, que no chequean
errores o que infectan cualquier archivo, por ejemplo,
(con lo cual ahorran dos bytes, en cada caso), pero esta
versión funciona muy bien.
Sterculius
El virus Sterculius usa una técnica poco usada pero vieja
de quedar residente en memoria. Se copia en el espacio
libre que deja el DOS después de la tabla de
interrupciones en la dirección 0000:01E0. Ocupa apenas
280 bytes, e infecta sólo archivos .COM.
El virus, cuando es ejecutado, debe buscar el offset
donde está cargado, ya que se copia al final del archivo
infectado. Para esto usa el método de hacer un call, y
luego hacer un POP SI, con lo cual obtiene en SI el
offset del comienzo del virus luego de restarle 3. A
continuación restaura los cuatro primeros bytes del
programa huésped, donde había puesto un jump a su propio
código. Después saca al MSAV o CPAV de memoria con un
simple llamado a una interrupción. Se fija si ya está
residente en memoria buscando el identificador STERCULIUS
(en realidad, solamente el ST del nombre en el offset 3
del virus). Si estaba residente, vuelve al programa
original. Si no, se copia a la dirección 0000:01E0, salva
la vieja interrupción 21h, e instala su propio handler de
la interrupción 21h. Luego vuelve al programa original
poniendo 100h en el stack y haciendo un RET, con lo cual
ejecuta el programa.
El handler de la interrupción 21h instalado por el virus
chequea si el servicio pedido es ejecutar un archivo. Si
no lo es vuelve a la interrupción 21h original. Si se
pidió ejecutar un programa con la función 04Bh del DOS,
pide los atributos del archivo y los salva. Luego borra
los atributos del mismo para poder infectarlo sin
problemas. También guarda la hora y fecha original del
archivo para luego salvarlos. Abre el archivo y lee los
primeros cuatro bytes en un buffer. Chequea si el archivo
es .EXE verificando si empieza con MZ, y si tiene una S
mayúscula en el tercer byte, que es el identificador del
virus. Si es exe o está infectado, se va. Si no, procede
a infectarlo. Para esto escribe en el final del archivo
el virus desde memoria, y en el principio escribe el jump
al virus y una S a continuación para reconocerse a si
mismo. Luego restaura los atributos, la fecha y hora, y
sigue con la interrupción 21h normal.
Conclusiones
Como vemos, estos virus son muy sencillos, pero cada uno
de ellos tiene algo que los hace especial. Con esto vemos
que no hace falta que un virus sea complicado como para
que funcione.
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 de la comisión directiva
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