Copy Link
Add to Bookmark
Report

VR16: Análisis de virus: virus sencillos

Por Fernando Bonsembiante

eZine's profile picture
Published in 
virus report
 · 2 years ago

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

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT