viernes, 4 de marzo de 2011

Localizar direcciones en la IAT a mano 1/2

En la anterior entrada una vez localizada la IAT(Import Address Table) nos ayudamos de OllyDbg para saber donde se almacena la dirección de la función MessageBoxW, para después usarla en nuestro código (CALL [Dir de MessageBoxW en la IAT]) y así no tener la dirección “hardcoded”.

image

Vamos hacer esta búsqueda a mano así nos familiarizamos con la estructura de la IT(Import Table) y la IAT. Aviso que el proceso que  sigo está resumido y da cosas por sabidas, recomiendo leer este documento Descabezando archivos ejecutables portables de nuMIT_or antes o durante se lee la entrada.

En el proceso usaré el notepad de la anterior entrada, aquí se puede descargar.

Lo primero es localizar la IT en disco. Para ello hago uso de 010 Editor, en la cabecera opcional dentro de la cabecera PE, está el directorio de datos, una de esos directorios es el directorio de Importaciones:

image

Como vemos podemos encontrar este directorio en la dirección virtual (de ahora en adelante VA) 7604h. Hay que tener en cuenta que está dirección es virtual y nosotros estamos buscando estos datos en el archivo en disco, así que necesitamos traducir de VA a dirección física. Primero necesitamos saber en que sección de todas ira a caer esta VA.

image

La sección text empieza en la VA 1000h y acaba en la 8748h. Así que la IT que está en la VA 7604h pertenece a la sección .text. Esto también nos lo muestra OllyDbg:

image

Ahora para pasar de la VA a la dirección física debemos restar a la VA la VA inicial de la sección text (1000h).
7604h-1000h=6604h
Y a este valor sumarle la dirección física donde comienza la sección, SizeOfRawData:
6604h+400h=6A04h

Vamos a esa dirección con el editor hexadecimal y vemos la IT, la he coloreado en rojo:

image

La IT es un vector de valores DW (Double word, 4 bytes) que sigue esta estructura:
dwRVAFunctionNameList DWORD ;
dwUseless1 DWORD ;
dwUseless2 DWORD ;
dwRVAModuleName DWORD ;
dwRVAFunctionAddressList DWORD ;

He coloreado en verde la primera de las estructuras:

image

Lo que nos interesa ahora es ver el campo dwRVAModuleName que es donde está el nombre de la DLL importada. En esta primera estructura tiene el valor 00007AACh. Este valor a su vez es una VA y debe ser traducida a dirección física. Aplicando el mismo procedimiento que antes tenemos que 7AACh->6EACh

image

Vemos entonces que la primera estructura de la IT se refiere a la DLL comdlg32.dll. Nosotros buscamos la función MessageBoxW que pertenece a la dll user32.dll, así que seguimos con las siguientes estructuras de la IT hasta encontrar justo al final la correspondiente a la DLL User32.dll:

image

Una vez localizada la entrada en la IT correspondiente a User32.dll nos falta recorrer el vector de funciones importadas para localizar MessageBoxW y buscar en el vector de direcciones la dirección de la función.

Eso en la siguiente entrada. (Que no podrá ser hasta el lunes ya que estaré alejado del ordenador).

3 comentarios:

  1. Muy bonito...

    y ahora también estás en "twittel" como diría Chema.

    ResponderEliminar
  2. Me están gustando estos posts, sobre todo por recordar algunas de las cosas que ya no hago. Además, en esa época recopilé algo de información sobre el formato PE, aquí te dejo unos cuantos enlaces (que quizá conozcas, pero por si las moscas) http://www.delicious.com/franchukelly/PE

    ResponderEliminar
  3. Gracias Eduardo!

    Y gracias Fran por los enlaces, alguno no lo tenía.

    ResponderEliminar