VIRUS

eLectronic @ magaZine #0



Curso de Antivirus

INTRODUCCION

Disposición Legal:

El motivo del presente curso es instruir a aquel que lo siga en el conocimiento de las técnicas usadas para combatir virus, empezando por las más básicas para acabar en las últimas novedades. Para ello profundizar‚ en el conocimiento del código vírico con el único propósito de poner al lector en disposición de saber a qué‚ nos enfrentamos cuando luchamos contra esta lacra del mundo informático.

La información contenida en el curso es información técnica que puede utilizarse en la fabricación de un virus. De ahí que la responsabilidad única es del lector, y a su elección queda usar bien o mal la información aquí relatada. Del mismo modo es su responsabilidad ejecutar cualquier código aparecido en el curso en su propio ordenador o en el de terceros, declinando yo toda responsabilidad por los posibles daños causados.

Para evitar en la medida de lo posible el uso fraudulento de esta información no dar‚ en ningún momento el código completo de ningún virus, sino sólo rutinas sueltas. De ese modo la confección de un virus a partir de las rutina mostradas en el curso es una labor que requiere un esfuerzo por parte del lector y por tanto un delito consciente.

De ahí que yo, el autor, declino toda responsabilidad civil y/o legal que discurra de la utilización fraudulenta de esta información. El responsable único y último ser  el lector si decide usarla para dichos fines.


El autor:
Manuel Llorens.


He creído conveniente comenzar el curso explicando cada una de las preguntas de la encuesta, dada la variedad de respuestas que he recibido. No me extenderé en aquellas que por su carácter meramente técnico pertenezcan más al curso de ASM de Pablo Barrón que al presente.

Cada uno de los puntos se desarrollar  a lo largo del curso allí donde sea conveniente. Aún no he decidido el "índice" del mismo, que ya incluir‚ en el próximo número (es por esperar a tener el mayor número posible de encuestas)

¿Sabes para lo que sirve una interrupción?

Una interrupción es el modo que tiene un programa ensamblador de ejecutar servicios y funciones del BIOS (Basic Input Output System, más conocido como la ROM) y el DOS.
La mayoría de los virus 'interceptan' estas interrupciones de modo que cada vez que se ejecuta uno de dichos servicios el virus supervisa lo que está haciendo el programa que ejecutó la interrupción, a este proceso se le denomina 'instalar un gestor de interrupción'.

La instrucción ensamblador que ejecuta una interrupción es

int número_de_la_interrupción.

La dirección de cada gestor de interrupción (vector de interrupción) se guarda en una tabla a partir de la dirección 0000:0000, y cada vector ocupa 4 bytes (seg:off).

¿Sabes instalar un gestor de interrupción?

Pues tan fácil como esto:

mov ah,25h (servicio establecer vector de interrupción)
mov al,interrupción_a_capturar (entre 0 y 255)
lds dx,gestor_de_interrupci¢n (dirección de la rutina gestora)
int 21h (llama a la interrupción del DOS)

Otro método que puede usarse si no se quiere llamar al DOS es el siguiente:

xor ax,ax
mov ds,ax
mov bx,4*interrupción_a_capturar
mov [bx],offset gestor_de_interrupción
mov [bx+2],cs (si el gestor está en el mismo segmento que el actual)

Generalmente es necesario guardar previamente el gestor de interrupción actual antes de cambiarlo por el nuestro con el fin de volver a instalar en antiguo al salir del programa. También generalmente es necesario que nuestro propio gestor de interrupción llame al antiguo. Por ejemplo un virus captura la interrupción 21h (la del DOS) si 'detecta' que el programa que la ejecutó está intentando abrir un fichero (mediante ah=3Dh) lo tratará de infectar y finalmente dejará que el DOS lo abra, llamando al gestor de interrupción antiguo. Igualmente si la función que el programa ejecuta no es útil a nuestro virus la dejará pasar al DOS 'intacta'.

¿Conoces la forma en la que arranca el DOS?

El proceso difiere ligeramente según se arranque desde el HD o desde un disquete, pero básicamente a grandes rasgos es el que sigue:

Primero se ejecuta una rutina que reside en el MBR (ver más abajo) que se encarga de cargar el sector BOOT de la partición activa. Si se está  arrancando desde un disquete el proceso es similar solo que no existe MBR ni tabla de partición, ya que el sector BOOT siempre está en la misma posición (el primero del disco). Se ejecuta el código contenido en el BOOT. El BOOT carga IO.SYS e MSDOS.SYS a partir de 0070:0000 o presenta un mensaje de error si el disco no era de arranque. A continuaci¢n ejecuta IO.SYS (una rutina contenida en el que se denomina SYSINIT) el cual ejecuta a su vez MSDOS.SYS. Cuando MSDOS.SYS devuelve el control a SYSINIT este carga el CONFIG.SYS lo procesa y al final entrega el control a COMMAND.COM para que cargue el autoexec.bat

Este proceso de carga es muy importante dado que si un virus consigue infectar el MBR o el BOOT toma el control del ordenador antes que ningún otro programa. A partir de aquí tendremos en cuenta la siguiente máxima del mundo de los virus:

"Toda porción de código ejecutable es susceptible de ser infectada"
"Toda porción de código no ejecutable puede ser infectada pero nunca puede dar lugar por si sola a una infección"
(por ejemplo un mensaje nunca puede dar lugar a una infección, aunque sí puede haber sido infectado por un virus como modo de guardar en él sus datos).

¿Sabes lo que es el DTA?

Es el Disk Transfer Address. Básicamente es una zona de memoria que se crea al ejecutar cada programa y que sirve para que las funciones del DOS devuelvan información al programa a través de aquellas interrupciones que no piden explícitamente una dirección de memoria.

Por ejemplo, cuando leemos un fichero en ASM mediante una interrupción le pasamos al DOS la dirección de memoria donde queremos que este meta los datos leídos del fichero, pero cuando le pedimos que nos diga qué ficheros encuentra que coincidan con '*.COM' la respuesta es enviada al DTA, ya que no le pasamos un dirección.

Por defecto se encuentra a partir del byte 80h del comienzo del segmento del programa (ver diferencias entre un COM y un EXE) y es la misma zona que usa el DOS para pasar los par metros de la línea de comandos a un programa por lo que si vamos a usar la DTA deberemos relocalizarla primero fuera de dicha zona o perderemos la información sobre dichos par metros. Relocalizarla es tal fácil como hacer:

mov ah,1ah
lds dx,dirección_del_nuevo_dta
int 21h

Lo normal es que el virus se cree su propio DTA para no interferir con los par metros que se le hayan podido pasar al programa infectado y luego restaura la DTA antes de salir.

¿Sabes lo que es un MCB?

Memory Control Block. Es una zona de memoria que se encuentra justo antes de cada bloque de memoria que reserva el DOS para uso de un programa que indica cuánta memoria se ha reservado, por qué programa y cual es el siguiente bloque. De este modo un virus puede reservar memoria para si mismo mediante la modificación directa de estos MCBs.

¿Sabes lo que es el MBR?

Es el Master Boot Record. Está presente en el sector 0 de cada disco duro, y contiene además de una porción de código ejecutable la tabla de partición. Puede crearse un MBR nuevo mediante la ejecución de FDISK /MBR, en caso de sospecharse que este pueda haber sido infectado.

Algunos discos duros de gran capacidad (>512 megas) instalan en el MBR su propia rutina para poder engañar al DOS y hacerle creer que son menores de lo que realmente son, ya que el DOS no puede trabajar con discos de tamaños >512 megas, de ahí que debemos ser cuidadosos. En cualquier caso, la destrucción del c¢digo ejecutable del MBR no es demasiado peligrosa, ya que siempre podemos restaurarlo mediante el FDISK o mediante las utilidades que nos entregaron con el HD, pero sí es más peligroso destruir la tabla de particiones, ya que si no recordamos los valores que contiene podríamos perder el acceso al disco duro.

¿Sabes lo que es un CRC?

Ciclyc Redundant Check. Es una forma de comprobar de forma unívoca que el contenido de un archivo no ha cambiado, mediante una operación matemática que afecta a cada byte del archivo y genera un número (de generalmente 16 ¢ 32 bytes) para cada archivo. Una vez obtenido este número las posibilidades de que una modificación del archivo del mismo número son pequeñísimas. De ahí que haya sido un método tradicionalmente muy utilizado por los antivirus para comprobar si el programa había sido modificado por un virus, guardando para cada directorio un archivo con los CRCs de cada archivo del mismo y comprobándolo periódicamente o al ejecutar cada archivo (en caso de un antivirus residente o uno que modifique directamente el ejecutable para que se auto chequee cada vez que se ejecute, lo cual ya no se usa porque daba muchos problemas y falsas alarmas).

Otro método de comprobar la integridad de un archivo son los checksums o sumas de control que son mucho más sencillas y rápidas pero de menos fiabilidad. De hecho el método de los CRCs es tan potente que muchos antivirus son capaces de reconstruir el archivo antes de ser modificado a partir de la informaci¢n de estos. Esta técnica a dejado de ser segura debido a la aparición de virus stealth (invisibles) que son capaces de hacer que un archivo infectado aparezca a los ojos del programa que calcula el CRC como estaba antes de infectarlo (ver más adelante).

¿Sabes en qu‚ se diferencia un COM de un EXE?

La diferencia principal es que un COM sólo puede ocupar un segmento 64 K y un EXE puede ocupar toda la memoria por debajo de 1 mega (sin contar que el programa esté hecho en modo protegido). Pero para nuestros fines la diferencia principal radica en la forma diferente que tiene el DOS de cargar y ejecutar estos programas. Veamos como carga el DOS un COM o un EXE.

Primero se crea un PSP (Program Segment Prefix) que ocupa los 100h primeros bytes del segmento que ocupa el programa. El programa en sí se carga a partir de 100h. El PSP guarda alguna información sobre el programa que se encuentra justo después de él. Además como vimos contiene a la DTA y/o a los par metros (por defecto). Si se trata de un archivo COM el programa comienza a ejecutarse a partir de 100h, si se trata de un EXE el programa se ejecuta a partir de los datos especificados en la cabecera del mismos que son los primeros bytes del archivo ejecutable. No debe confundirse el PSP con la cabecera de un EXE. La cabecera de un EXE son los primeros bytes del archivo y el PSP se crea para cualquier programa ejecutable en la memoria (COMs o EXEs).

En realidad existen otros programas ejecutables como son los controladores de dispositivos (Device Drivers) que se instalan en el config.sys o los cero code start, que son archivos que se ejecutan antes de que se haya cargado el dos (IO.SYS y MSDOS.SYS por ejemplo).

En un COM por tanto el primer byte del archivo corresponde con el primer byte que se ejecutará, en un EXE en cambio los primeros bytes corresponden a una cabecera que principalmente ofrece información sobre el punto de entrada al archivo, es decir, sobre el byte a partir del cual se ejecutar  dicho ejecutable. Además contiene la tabla de relocalización que sirve para cambiar los saltos absolutos (los no relativos) que contiene el EXE de modo que este pueda ejecutarse independientemente de la direcci¢n de memoria donde resida (para la distinción entre saltos absolutos y relativos consultar el curso de ASM de Pablo ;)

¿Sabes hacer un programa residente?

Un programa residente TSR (Terminate and Stay Resident) es un programa que al terminar su ejecución no libera la memoria que le había sido asignada por el DOS, pero si devuelve el control a este. Sirven generalmente para instalar rutinas en memoria, en la mayor parte de los casos gestores de interrupción. Para dejar un programa residente hay dos métodos, el primero es mediante la modificaci¢n de los MCBs y el segundo mediante una llamada al DOS:

mov ah,31h
mov al,error_level
mov dx,tamaño_de_la_porción_residente a partir del PSP)
xor dx,4 (para pasar dx a párrafos)
add dx,16 (para reservar espacio para los 100h bytes del PSP)
int 21h

Para conocer el tamaño de la porción residente lo más conveniente es poner una etiqueta donde comienza y otra donde acaba y hacer la resta de ambas.

¿Sabes programar un tracer (paso a paso)?

Un tracer es un rutina que pone la CPU en modo paso a paso es decir, que cada vez ejecute una instrucción llamará a la int 1h. Existen diversas técnicas usadas por los virus y otros programas para evitar que un tracer explore su código (armouring). Para evitar esto último hay que programar con mucho cuidado de modo que cada vez que se ejecuta una instrucción miremos a la siguiente para ver si se trata de una instrucción capciosa aunque es un proceso laborioso y difícil... en general el procedimiento consiste en instalar un gestor de la interrupción 1 y activar el flag de paso a paso:

pushf
pop ax
or ax,100h
push ax
popf

Un tracer es muy útil cuando queremos supervisar la ejecución de un programa de forma automática. Los virus usan esta técnica para labores de tunneling (ver más adelante).

¿Sabes usar algún debugger?

Un debugger es como un tracer pero con control en tiempo real por parte del usuario. Es muy recomendable tener uno a mano para pillar los bugs que derivan de la programación de antivirus ;)

¿Sabes la diferencia entre un virus y un troyano?

Un virus es una porción de código ejecutable que se añade a otra ya existente. Los virus se ejecutan sin intención por parte del usuario, que no sabe que el programa en cuestión contiene un virus.

Un troyano es un programa con entidad propia que generalmente se construye para labores destructivas. Es el usuario el que confiando en el programa lo ejecuta creyendo que se trata de un programa de algún otro tipo.

¿Sabes cómo se produce la infección de un archivo?

El virus modifica el programa a infectar de tal modo que se ejecute su código en vez del código del programa original. Salvo los virus de enlace todos los virus necesitan modificar el programa original.

¿ Sabes lo que es un virus 'stealth'?

Es un virus que mediante algunas técnicas consigue ocultar su existencia a los antivirus y en general al DOS. Para ello necesita estar residente antes que los antivirus. Modifica la información que los antivirus obtiene de modo que parezca que el archivo es normal.

Para ello existen diversos métodos, ya que son diversos los métodos que el DOS usa para manejar archivos. Principalmente son el trabajo físico con el disco (a base de leer sectores), los FCBs (método obsoleto), y la apertura del archivo mediante handles (método vigente).

¿Sabes lo que es un 'handle stealth'?

Es un virus que utiliza técnicas stealth de modo que cada vez que un programa abre un handle para leer/escribir un archivo, modifica los datos del handle para que parezca que el programa es normal. Es decir, aunque el programa sigue estando infectado no es posible ver el verdadero programa sino solo la copia sin infectar que nos muestra el virus.

¿Sabes lo que es un 'infector/disinfector'?

Es justo la técnica contraria, cuando el virus advierte que se está abriendo un programa infectado lo desinfecta y sólo vuelve a infectarlo cuando el archivo es cerrado. Es un método más sencillo de implementar que el 'handle stealth'.

¿Sabes lo que es un virus con 'tunneling?

Cuando un antivirus queda residente instala sus propios gestores de interrupción para interrupciones que puedan serle útiles a un virus. De ese modo puede dar la alarma cuando un virus efectúe una operación extraña a través de una de estas interrupciones. Un virus con tunneling intenta averiguar la dirección de los gestores de interrupción del DOS antes de que quedara residente el antivirus. Esto es posible porque como dijimos con anterioridad, el antivirus tiene que devolver el control a los gestores del DOS en algún momento para permitir que el DOS haga su trabajo.

Las técnicas principalmente son dos: hacer un tracing, o buscar saltos a lo largo del código del gestor del antivirus que salten al DOS. Para ello necesitan conocer el segmento del DOS, lo cual se hace a través de una interrupción indocumentada del DOS. En realidad son métodos poco fiables dado que son bastante evidentes y a veces condenados al fracaso. Muchos antivirus residentes averiguan que un virus les está haciendo un tunneling y lo detiene. Cuando desarrolle el tema expondré algunas técnicas que he descubierto hace poco, que subsanan la mayoría de los problemas de los tunneling tradicionales.

Aunque hasta la fecha ningún virus las incorpora, es bueno anticiparse a los fallos del DOS y taparlos antes de que esto ocurra, de ahí mi interés por esta técnica ;)

Otras técnicas se basan en el acceso al disco directamente a través de los puertos, es decir sin necesidad de llamar a ninguna interrupci¢n. Este método presenta el inconveniente de que no siempre funciona, por lo que es poco probable que un virus lo incorpore.

¿Sabes lo que es un virus polimórfico?

Es un virus que modifica su apariencia en cada infección. Esto lo consigue encriptándose con una clave diferente en cada copia que hace de si mismo. Esto dificulta mucho las labores de búsqueda de cadenas por parte de los antivirus, que sólo pueden fijarse en las rutinas de desencriptación o utilizar técnicas de otro tipo. Para dificultar aún más la búsqueda de cadenas un virus realmente polimórfico debe variar también la apariencia de su rutina de desencriptación, mediante la inserción de NOPs aleatorios (instrucci¢n ASM que no hace nada) y mediante la utilización de distintos registros y loops para realizar la desencriptación. Se ha popularizado para este fin la realización de motores de encriptación que son rutinas que desarrollan estas técnicas de un modo general y que se añaden a un virus ya completo que no incluía polimorfismo.

¿Sabes lo que es un virus con 'armouring'?

Es un virus que utiliza técnicas para dificultar ser desensamblado o traceado. No tienen otro fin que este, pero dado que generalmente cuesta muy poco realizarlas es bastante popular que un virus las incluya, aunque también pueden dar lugar a que un antivirus heurístico lo detecte. Ultimamente también se han popularizado técnicas de armouring que actúan contra un antivirus específico, evitando las combinaciones de bytes que se conoce que activan la alarma heurística o desactivando el antivirus residente en memoria (mal llamado tunneling).

¿Has hecho alguna vez un virus?

Hacer un virus es una cosa divertida, con la cual se aprende mucho, pero que está penada por la ley. Es mejor combatir esta lacra estudiando a fondo sus técnicas y evitándolas, intentando siempre ir un paso por delante de los desarrolladores de virus.

¿Sabes infectar COMs?

La infección de un COM se hace generalmente modificando los primeros bytes de modo que la ejecución comience por la rutina vírica que se añade al programa original a partir de su fin (virus appending). Después de la ejecución del virus se restaura en memoria los 3 primeros bytes del archivo original y se le ejecuta. De este modo el usuario no nota que el programa está infectado.

Otro método cada vez más en desuso es el de sobreescribir el código original del programa (virus overwritting). De este modo el programa original no puede ser ejecutado y el virus se delata con facilidad. Por supuesto puede insertarse el código del virus al principio, pero es una técnica que no se usa demasiado.

¿Sabes infectar EXEs?

La infección de un EXE por el contrario no precisa de la modificación del programa original. Se añade el código al final y se modifica la cabecera del EXE de tal modo que el punto de entrada cambie a la rutina vírica, que después cede el control al punto de entrada original.

También se usan técnicas como insertar el código del virus en el stack del EXE (zona 'hueca' que puede o no estar presente en el archivo).

¿Sabes lo que es un virus de enlace?

Es una modalidad de virus que no precisa modificar el archivo que infecta. Para ello lo que hace es modificar la FAT de modo que el comienzo del archivo siempre apunte a un sector que contiene el virus. Se ejecuta este y carga el programa original. No son muy populares dado que precisan de un mayor trabajo y no son en general fáciles de detectar.

¿Sabes cómo funciona una búsqueda heurística?

Ya la he mencionado numerosas veces en el texto. Es una técnica antivirus que evita la búsqueda de cadenas. Para ello lo que hace es desensamblar el programa y ejecutarlo paso a paso, a veces mediante la propia CPU, a veces mediante una emulación. De ese modo averigua qué hace exactamente el programa en estudio e informa al usuario.

Generalmente es difícil de implementar de un modo automático ya que se desconoce el conocimiento del usuario. Esto da lugar a un compromiso entre potencia del método y falsas alarmas. En general es una buena técnica si se implementa bien y el usuario tiene un alto conocimiento técnico. La mayoría de los virus nuevos evitan directamente la búsqueda heurística modificando los algoritmos hasta que el programa antivirus no es capaz de indentificarlos.

Bueno pues esto es todo por hoy. No es que vayáis a aprender nada nuevo pero quedan sentados unos conocimientos básicos y un lenguaje a utilizar en el resto del curso. Preguntas... ya sabéis las que queráis ;)

Existen muchos puntos que no están suficientemente detallados, cuando sea necesario desarrollar‚ cada uno, así que no me preguntéis sobre eso a raíz de esta introducción, esperad a que llegue a ese capitulo ;)

Patuel.
Manuel LLorens * Hermano PeReGRiNo de EDiSoN'S TeMPLe *



©eLectronic @ magaZine - 1997.
32 BITS VISUAL CREATIONS CROUP