Lunes, 8 de Septiembre de 2008
Win32.Girigat: Residencia por proceso
· Generalidades
· Inicialización
· Automutación
· Activaciones gráficas
· Residencia por proceso
· Búsqueda por acción directa
· Infección del formato PE
· Nombre del virus
· Conclusión
· Girigat1.jpg
· Girigat3.jpg
· Presentación

Volver al indice de articulos
Éste es el nombre con el que Jacky Qwerty, el conocido escritor de virus peruano (principalmente a raíz de su virus de macro CAP -el más extendido del mundo hasta hace unos meses- y por sus virus Jacky y Cabanas, los primeros del mundo compatibles con Win9x/NT/CE), bautizó el modo de residencia inventado por él mismo y puesto en práctica en su virus Cabanas.

La residencia por proceso ha ido adquiriendo adeptos de manera paulatina (Win32.Maya, Win32.Niko...), y ha dado pie a la aparición de nuevas variantes, como la empleada en aquellos virus que enganchan APIs de la tabla de exportaciones de KERNEL32, con el fin de permanecer residentes en memoria de manera global. Probablemente la propia residencia por proceso y la variante que acabamos de explicar sean las dos vías más ortodoxas de permanecer en la memoria de Win32, así como las mejor adaptadas al sistema de multihilo de esta plataforma, además de ser las más estables.

Girigat es uno de los virus que se han subido al carro de la residencia por proceso, que consiste en enganchar ciertas APIs (las que el autor del virus decida) por medio de parcheos en la IT del programa huésped, de manera que cuando éste llame a una de las APIs enganchadas por el virus, el control pasará a un handler o rutina encargada de procesar ese tipo de llamadas, que se encargará de infectar las víctimas que haya al alcance y de saltar entonces a la dirección original de la API solicitada por el host del virus.

Como apuntamos con anterioridad, no todas las generaciones de Girigat tienen activada la capacidad de emplear API hooking (el nombre alternativo de la residencia por proceso, empleado por primera vez por Matt Pietrek), por lo que el virus comienza por comprobar si esta característica está disponible. Este tipo de chequeos los efectúa por medio de una serie de flags, que, mediante unos o ceros, le indican a Girigat la disponibilidad de la función que busca. En el caso de la residencia por proceso, si el flag correspondiente está activado, nuestro virus llama a una subrutina en la cual, mediante un bucle, procede iterativamente a buscar las APIs deseadas en la tabla de importaciones de su host, y, en caso de que estén presentes, a "engancharlas", sustituyendo su dirección original por la del handler vírico correspondiente en memoria.

Las APIs que el virus trata de enganchar son las correspondientes a la apertura y a la búsqueda de ficheros, en sus versiones ANSI y Unicode, para total compatibilidad con WindowsNT: CreateFileA, CreateFileW, FindFirstFileA, FindFirstFileW, FindNextFileA y FindNextFileW. El flujo de ejecución, tras haber completado la tarea de parcheo de la IT del host, alcanza el punto en el que Girigat determina si debe completar su proceso de ejecución añadiendo una búsqueda e infección de ficheros por medio de acción directa o runtime, o si simplemente bastará con devolver el control de ejecución al punto de entrada real del host, por medio de la instrucción ret, ya que, durante el proceso de inicialización, el virus había almacenado esta dirección (obtenida en forma de RVA previamente, durante la infección del fichero) en la pila.

En cualquiera de los dos casos, la actividad de los handlers de las APIs supuestamente enganchadas no entra en acción hasta el momento en el que el host, en plena ejecución, requiere el empleo de alguna de las APIs parcheadas. Es ahí cuando la instrucción call salta a un jmp que, en lugar de conducirnos hasta la API a la que se ha llamado, nos lleva hasta el handler que Girigat dispuso para dicha API. Aquí hay que decir que el virus dispone en realidad de tres handlers: uno para CreateFile (-A y -W), otro para FindFirstFile (-A y -W), y un último, para FindNextFile (también -A y -W). A diferencia de otros virus que, o bien no dan soporte a Unicode, o bien lo tratan de forma separada, Girigat procesa con un mismo handler ambos tipos de versiones, las cuales distingue por medio de la activación de un flag que le indica si debe proceder a convertir a ANSI los parámetros que emplea de cada una de las APIs, por medio de la función WideCharToMultiByte.

El funcionamiento de los handlers es estándar, y sigue en todos los casos la misma línea: obtención del nombre del fichero que el host pretende procesar por medio de la API en teórica actividad, chequeo del flag de Unicode y, en caso de estar activado, conversión del nombre del futuro fichero víctima a formato ANSI, comprobación del formato de dicho fichero (por medio de su extensión), salto a la runtina de setup de la infección (con el fin de efectuar otro tipo de chequeos), infección en caso de que no haya ningún problema, y finalmente devolución del control a la API original, para que el host funcione correctamente y no levante sospechas en el usuario.

A pesar de seguir unas mismas pautas, cada uno de los handlers tiene su peculiaridad, ya que, por ejemplo, el nombre del fichero a procesar cuando se trata de llamadas a las APIs CreateFile(A/W) y FindFirstFile(A/W) está almacenado en la dirección [esp+24h], mientras que cuando se llama a la API FindNextFile(A/W) éste se encuentra en [esp+28h]. Además existe el agravante de que, al estar las dos últimas APIs en estrecha relación (FindNextFileA sólo se puede llamar tras haber empleado con anterioridad a su "hermana", FindFirstFileA, y para el correcto funcionamiento de la primera es preciso especificar un handle -número único con el que el sistema identifica a cada fichero abierto- obtenido con la última), los handlers de cada una de ellas deben llevar a cabo una serie de acciones extra que implican cierta complejidad como para haber escrito un handler único para todas las APIs que engancha Girigat, lo cual habría sido algo así como rizar el rizo, aunque, eso sí, habría dificultado en cierta medida el análisis del virus, debido a lo intrincado de esta hipotética estructura.