martes, 1 de marzo de 2011

Añadir código portable a un ejecutable 2/2


Añadir código portable a un ejecutable 1/2

Continuando…

Debemos buscar la función MessageBoxA en la IAT de modo que podamos usar la dirección que haya puesto allí el cargador de Windows. La dirección de memoria donde está la IAT se puede saber mirando en la cabecera PE:

Sin título_thumb[1]

La dirección RVA es 1000h, la dirección en memoria, Virtual Address, será ese valor + ImageBase es decir 0x01001000 justo donde empieza la sección text de código. Podemos abrirlo en OllyDbg y en esa dirección veremos una serie de offsets, al lado nos muestra a la dirección de que función corresponde.

Sin título

Ahora debemos buscar la función MessageBoxA. En msdn podemos ver que es una función que está definida en User32.dll. Así que buscamos esa función y encontramos una parecido MessageBoxW, que es la versión Unicode, nos sirve Guiño.

Sin título

Pero debemos cambiar la cadena que teníamos a una cadena unicode, para que sea compatible con la función.

Sin título

Una vez con todo esto tenemos que adaptar el código ensamblador que pusimos al inicio de la sección para que lea la dirección de la función MessageBoxW desde la IAT, de la dirección 0x010001268.

image

01014017 E8 00000000 CALL 0101401C 0101401C 58 POP EAX 0101401D 6A 00 PUSH 0 0101401F 83E8 1C SUB EAX,1C 01014022 50 PUSH EAX 01014023 50 PUSH EAX 01014024 6A 00 PUSH 0 01014026 A1 68120001 MOV EAX,DWORD PTR DS:[01001268] 0101402B FFD0 CALL EAX 0101402D B8 9D730001 MOV EAX,0100739D 01014032 FFE0 JMP EAX

Y de este modo conseguimos un notepad “infectado”, que muestra un MessageBox al iniciarse y que funcionará correctamente en todos los Windows. Lo subo aquí por si alguien quiere ojearlo.

Pero hemos hecho un poco trampas, porque hemos usado la función MessageBoxW en vez de MessageBoxA, el problema es que notepad no usa MesasgeBoxA así que no Importa dicha función y no podemos obtener su dirección leyendo la IAT. Esto es un problema ya que solo podremos usar las APIs que ya utilice el programa y no todas las de Windows. Se puede solucionar utilizando las funciones GetProcAddress y GetModuleHandle, pero eso ya para otra entrada.

Saludos!

2 comentarios:

  1. ¡Hola Oca, crack!, oye, no seria posible cargar las DLLs que queramos y así hacer cualquier llamada a la API cargando las dlls necesarias con la API LoadLibrary() que está en kernel32.dll?

    ResponderEliminar
  2. Si, con LoadLibrary cargas la dll si no la tiene ya cargada el programa (en el caso del notepad ya tiene cargada user32.dll), después necesitas saber cual es la dirección de la función MessageBoxA dentro de la dll con GetProcAddress. Otra función necesaria es GetModuleHandle para pasarle un handle a GetProcAddress.
    Un saludo TheSur :)

    ResponderEliminar