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