lunes, 7 de marzo de 2011

Localizar direcciones en la IAT a mano 2/2


Localizar direcciones en la IAT a mano 1/2

En la anterior entrada localizamos la estructura “Directorio de Datos Importados” correspondiente a la DLL User32.dll que contenía los siguientes valores:

image

dwRVAFunctionNameList: 0x00007854 dwUseless1: 0xFFFFFFFF dwUseless2: 0xFFFFFFFF dwRVAModuleName: 0x0000873C dwRVAFunctionAddressList: 0x00001188

Lo primero es recorrer el vector de nombres de las funciones importadas, dwRVAFunctionNameList, hasta encontrar la de MessageBoxW. Está en la dirección RVA 0x7854, que traducida a FileOffset como hicimos en el anterior entrada nos da: 0x7854-0x1000+0x400= 0x6C54

En esa dirección vemos una lista muy larga de punteros:

image

74 punteros, cada uno de ellos es una RVA donde encontrar el nombre de la función importada de la DLL User32.dll. Así que ahora toca un poco de trabajo sucio e ir uno a uno buscando a que nombre llevan. Por ejemplo el primero 0x00008524 que traducido a FileOffset es 0x7924 donde encontramos esto:

image

Los primeros 2 bytes corresponden al ordinal con el que se exporta la funcionen este caso 0xFF, los siguiente bytes corresponden al nombre de la función importada “GetClientRect”. Siguiente este proceso con el resto de punteros llegamos al que está en la posición 0xE0, en el FileOffset 0x6D34 (0x6C54+0x4*0xE0).

image

0x00839A, traducido a FileOffset: 0x779A (0x839A-0x1000+0x400), ahí es donde encontramos lo siguiente:

image

Que es la función buscada.

Sabemos que está en al posición 0xE0 de la lista de funciones importadas de user32.dll. Ahora tenemos que ir a esa posición de la lista de dirección de las funciones, dwRVAFunctionAddressList, y podremos saber en que dirección de memoria dentro de la IAT se encontrará una vez cargado el programa en memoria la dirección en nuestra versión de Windows de la funcion MesageBoxW.

La lista de direcciones se encuentra en al dirección RVA 0x00001188: dwRVAFunctionAddressList: 0x00001188

Sabiendo que la dirección de nuestra función (MessageBoxW) se encontraba en la posición 0xE0 deberemos sumar este valor al comienzo de la lista para obtener su dirección RVA exacta: 0x1188+0xE0=0x1268

Esta recordemos que es la dirección RVA, para obtener la dirección real en memoria debemos de sumarla la “ImageBase”, es un valor de la cabecera PE que en el ejecutable que estamos usando(Notepad de XP SP2 en español) es 0x01000000: 0x01000000+0x1268=0x01001268

Y efectivamente una vez cargado el programa en memoria en esa dirección podemos encontrar la dirección en nuestro sistema de MessageBoxW. Veámoslo en OllyDbg:

image

En esa dirección vemos el código en ensamblador de la función MessageBoxW, que a su vez llama a la función MessageBoxExW pasándole algún parámetro nulo:

image

Y esto es todo. Como decía en la primera entrada el proceso está resumido aconsejo leer el documento que puse inicialmente para mas detalles. Se puede hacer todo esto de una manera mucho mas sencilla utilizado programas que te facilitan la tarea. Pero mi objetivo es saberlo hacer todo a mano para algún día poder programar algo relacionado con todo esto.

Nos vemos pronto!

1 comentario:

  1. El link http://www.multiupload.nl/EBEI9UPRE2 donde se encuentra el Manual de nuMIT or ya no está, lo puedes resubir? Saludos.

    ResponderEliminar