Jueves, 20 de Noviembre de 2008
Pusher.374: En memoria
· Generalidades
· Inicialización
· Residencia
· En memoria
· Infección
· Polimorfismo
· Conclusiones

Volver al indice de articulos
Una vez que el virus "Pusher" se ha instalado en memoria y que la ejecución de su "host" ha finalizado, todo está listo para empezar a buscar nuevas víctimas.

El virus ya ha enganchado la interrupción 21h, por lo que cualquier programa que haga llamadas a servicios del DOS estará expuesto a la infección. El código que los virus utilizan para procesar cualquier tipo de llamadas a las interrupciones que enganchan es conocido como "handler". El propósito del "handler" de un virus consiste en efectuar una serie de chequeos de ciertas condiciones del sistema, con la intención de dilucidar si debe emprender la ejecución de algunas de sus rutinas, como, por ejemplo, la de infección de ficheros.

En el caso del virus "Pusher", la misión del "handler" es tan simple como monitorizar dos tipos de llamadas a la interrupción enganchada, la 21h: las internas que el propio virus utiliza desde sus copias no residentes para saber si debe instalarse o no en memoria, y aquellas que efectúa el sistema para ejecutar programas.

Así las cosas, el primer chequeo efectuado en el "handler" del virus comprueba si el valor de AX con el que se está llamando a la interrupción 21h es B8CDh. En caso positivo, el "handler" vírico retorna el valor FFFFh. Esta operación se lleva a cabo, como ya hemos comentado, para que las generaciones no residentes del virus comprueben si deben instalarse en memoria o no. Como sucede con otros aspectos del "Pusher", el hecho de que el valor devuelto sea FFFFh y no cualquier otro, como podría ser alguno de los clásicos (DEADh, BABEh, CACAh...), responde a motivos de optimización, con el único propósito de ahorrar bytes. Utilizando este valor, la comparación que el virus ha de efectuar ocupa menos bytes que cualquier otra comparación habitual, como vemos en el siguiente ejemplo:

  3 bytes <-  mov    ax,B8CDh / mov    ax,B8CDh  ->  3 bytes
  2 bytes <-  int    21h      / int    21h       ->  2 bytes
  1 byte  <-  inc    ax       / cmp    ax,CAFEh  ->  3 bytes
  2 bytes <-  jz     go_out   / je     go_out    ->  2 bytes
 ----------------------------   ----------------------------
  8 bytes <-  Método "Pusher" / Método clásico   -> 10 bytes

Obviamente, en caso de que las copias no residentes del virus obtengan como retorno de su llamada un valor diferente a FFFFh, deberán proceder a instalarse en memoria, al no haber obtenido ningún indicio vírico.

Cerrando este paréntesis, en caso de que el valor de AX con el que se llama a la interrupción 21h no sea B8CDh, el "handler" del virus pasará a comprobar si el sistema está intentando ejecutar un programa (operación que se efectúa con el valor 4B00h en AX). En caso afirmativo, nuestro protagonista saltará directamente a su rutina de infección, mediante la cual procesará a su víctima, comprobará si puede infectarla, y actuará en consecuencia, abortando el proceso de infección en caso de producirse alguna anomalía o incompatibilidad con su formato.