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