
DLL en C++ que realiza hooking de la Import Address Table analizando las cabeceras PE y redirigiendo las direcciones de funciones importadas a un hook personalizado dentro de un proceso objetivo.
El hooking es una técnica que permite a un usuario redirigir el flujo de ejecución de un programa. La mayoría de las veces utilizamos el hooking de funciones. Reemplazamos o redirigimos una función hacia la nuestra propia; esto es muy útil y tiene múltiples casos de uso. Existen múltiples formas de hacer hooking; aquí vamos a ver el IAT Hooking, que significa Import Address Table. Consiste en reemplazar la dirección de una función por la nuestra propia en una gran tabla que se rellena en tiempo de ejecución. Como ya indiqué antes en otro repositorio, recomiendo leer más sobre el PE Format para entender la parte de parseo de la IAT de este código.
Aquí hay un diagrama básico de cómo funciona el IAT Hooking. En este ejemplo, se llama a la función original después de que se haya ejecutado el código malicioso. En este ejemplo simplemente llamaremos a otra función en lugar de la original. La ventaja de esa técnica es que no requiere modificar el cuerpo de una función, a diferencia de un hook regular de parcheo de .text con detours, que tiene que cambiar las instrucciones al principio de una función para colocar un jmp, por ejemplo.
En realidad es mucho más simple de lo que suena; procederemos internamente para facilitar las cosas, lo que significa que este repositorio compilará a una DLL que puede inyectarse en el proceso objetivo usando mis inyectores LoadLibraryA o Manual Mapping para inyectarla en el proceso objetivo.
Primero parseamos las PE Headers del proceso objetivo para localizar el Import Descriptor así:
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
Luego podemos recorrer cada módulo importado, recorrer cada función de este módulo (razón de los bucles anidados) y encontrar la dirección de esa función que se ha rellenado en tiempo de ejecución. En este ejemplo haremos hooking de TranslateMessage, que es usada por Windows para procesar eventos en las gui's. Así que una vez que encontramos la dirección de esa función, la reemplazamos por la dirección de nuestra propia función que definimos previamente y que existe en el contexto del proceso remoto, ya que somos internos. No olvides usar VirtualProtect para asegurarte de tener permiso para escribir en esa ubicación.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
Como puedes ver, cuando notepad llama a TranslateMessage (prácticamente todo el tiempo) ejecutará nuestra función hook, ¡que termina mostrando un cuadro de mensaje!
image