Introducción
En mi tutorial anterior, hablé sobre el uso de Detours para conectar la API de Windows dentro de una aplicación de destino. Si bien Detours es extremadamente poderoso y fácil de usar, se abstrae y oculta muchos de los detalles detrás de varias llamadas de biblioteca. También tiene otra desventaja, ya que es muy conocido y fácil de detectar para ciertas herramientas anti - enganche. Incluso el software Anti-Cheat puede recorrer fácilmente el proceso y determinar si ha sido manipulado.
Si bien nunca habrá una solución mágica para el enganche que sea a la vez fácil de usar y difícil de detectar, existe una pequeña esperanza de escribir sus propias herramientas de enganche por esta misma razón (cuanto menos conocido es algo, más difícil es). detectar). Aparte de la detección, otra razón para querer escribir su propia solución de enganche puede ser tan simple como querer saber cómo se hace y cómo se puede detectar.
Este será el primer tutorial de una serie sobre la vinculación de API sin depender de bibliotecas externas. En el próximo tutorial, cubriré cómo puede conectar el IAT de un proceso remoto sin cargarlo dentro de su espacio de direcciones.
"Nadie se acurruca con el enganche: ¡te abrochas y sientes las g!"
¿Qué es el IAT?
Dependiendo de cuánto haya examinado el formato Portable Executable (PE), es posible que tenga una familiaridad pasajera con la estructura básica. El encabezado PE contiene una serie de listas vinculadas que contienen información diferente sobre el ejecutable: la estructura que nos interesa es la tabla de direcciones de importación. Como sugiere el nombre, esta tabla contiene una lista de todas las funciones importadas por el ejecutable que reside en otras bibliotecas del sistema.
En tiempo de ejecución, el sistema operativo analizará la tabla de importación, intentará cargar los archivos DLL especificados y resolverá las direcciones de las funciones importadas. Si este proceso falla, la aplicación no podrá cargarse y mostrará un error en la pantalla:
En este caso, no pudo encontrar la biblioteca en tiempo de ejecución de Visual Studio.
Tenemos dos formas diferentes de atacar esto:
Inyección de código
Ya que vamos a comenzar con lo básico, comencemos conectando nuestros propios procesos IAT. ¡Sobrescribiremos la dirección de Kernel32! Sleep con nuestra propia función. Definamos el esqueleto de nuestro programa de la siguiente manera:
El PE Header
Afortunadamente para nosotros, el formato PE Header está muy bien
Comience obteniendo un puntero al inicio del encabezado PE.
Si compila y ejecuta ese código, debería volcar todos los módulos importados que usa su proceso (pueden diferir según su compilador):
Entonces, ahora que hemos ubicado nuestros módulos, procesemos las funciones importadas:
Ahora vamos a dar ese giro.
¡Lindo! Ahora que hemos descargado con éxito la función importada de la aplicación, ahora podemos pasar a parchear la tabla de importación.
Parcheando el IAT
Esto es bastante sencillo. Una vez que hemos localizado nuestra función deseada, llamamos a VirtualProtect para eliminar la protección de la memoria, escribimos nuestra nueva dirección y luego restauramos la protección de la memoria.
Aquí está la función HookIAT actualizada:
Bastante fácil, ¿verdad? Ahora podemos simplemente llamarlo desde nuestra función principal:
¡Y eso es! Ahora puede conectar cualquier WINAPI que desee. También puede empaquetar esto en una DLL e inyectarlo en cualquier aplicación que desee.
Creditos
timb3r
En mi tutorial anterior, hablé sobre el uso de Detours para conectar la API de Windows dentro de una aplicación de destino. Si bien Detours es extremadamente poderoso y fácil de usar, se abstrae y oculta muchos de los detalles detrás de varias llamadas de biblioteca. También tiene otra desventaja, ya que es muy conocido y fácil de detectar para ciertas herramientas anti - enganche. Incluso el software Anti-Cheat puede recorrer fácilmente el proceso y determinar si ha sido manipulado.
Si bien nunca habrá una solución mágica para el enganche que sea a la vez fácil de usar y difícil de detectar, existe una pequeña esperanza de escribir sus propias herramientas de enganche por esta misma razón (cuanto menos conocido es algo, más difícil es). detectar). Aparte de la detección, otra razón para querer escribir su propia solución de enganche puede ser tan simple como querer saber cómo se hace y cómo se puede detectar.
Este será el primer tutorial de una serie sobre la vinculación de API sin depender de bibliotecas externas. En el próximo tutorial, cubriré cómo puede conectar el IAT de un proceso remoto sin cargarlo dentro de su espacio de direcciones.

"Nadie se acurruca con el enganche: ¡te abrochas y sientes las g!"
¿Qué es el IAT?
Dependiendo de cuánto haya examinado el formato Portable Executable (PE), es posible que tenga una familiaridad pasajera con la estructura básica. El encabezado PE contiene una serie de listas vinculadas que contienen información diferente sobre el ejecutable: la estructura que nos interesa es la tabla de direcciones de importación. Como sugiere el nombre, esta tabla contiene una lista de todas las funciones importadas por el ejecutable que reside en otras bibliotecas del sistema.
En tiempo de ejecución, el sistema operativo analizará la tabla de importación, intentará cargar los archivos DLL especificados y resolverá las direcciones de las funciones importadas. Si este proceso falla, la aplicación no podrá cargarse y mostrará un error en la pantalla:

En este caso, no pudo encontrar la biblioteca en tiempo de ejecución de Visual Studio.
Tenemos dos formas diferentes de atacar esto:
- Modifique el ejecutable en el disco (no se recomienda ya que la mayoría de las aplicaciones están firmadas hoy en día y cualquier aplicación que modifique los archivos ejecutables será marcada por la mayoría de los programas antivirus).
- Inyecte código en tiempo de ejecución y actualice el IAT.
Inyección de código
Ya que vamos a comenzar con lo básico, comencemos conectando nuestros propios procesos IAT. ¡Sobrescribiremos la dirección de Kernel32! Sleep con nuestra propia función. Definamos el esqueleto de nuestro programa de la siguiente manera:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
El PE Header
Afortunadamente para nosotros, el formato PE Header está muy bien
Porfavor,
Acceder
o
Registrarse
para ver el contenido de las URL!
. Hay código en Internet para analizarlo y procesar la información. Vamos a analizar específicamente el IAT, por lo que necesitaremos ubicarlo dentro del encabezado.Comience obteniendo un puntero al inicio del encabezado PE.
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Si compila y ejecuta ese código, debería volcar todos los módulos importados que usa su proceso (pueden diferir según su compilador):
Código:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Entonces, ahora que hemos ubicado nuestros módulos, procesemos las funciones importadas:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Ahora vamos a dar ese giro.
Código:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
¡Lindo! Ahora que hemos descargado con éxito la función importada de la aplicación, ahora podemos pasar a parchear la tabla de importación.
Parcheando el IAT
Esto es bastante sencillo. Una vez que hemos localizado nuestra función deseada, llamamos a VirtualProtect para eliminar la protección de la memoria, escribimos nuestra nueva dirección y luego restauramos la protección de la memoria.
Aquí está la función HookIAT actualizada:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
Bastante fácil, ¿verdad? Ahora podemos simplemente llamarlo desde nuestra función principal:
C++:
Porfavor,
Acceder
o
Registrarse para ver el contenido de los códigos!
¡Y eso es! Ahora puede conectar cualquier WINAPI que desee. También puede empaquetar esto en una DLL e inyectarlo en cualquier aplicación que desee.
Creditos
timb3r