Hay espacio para inyectar código entre una aplicación y sus bibliotecas externas. Si lo hace, no es inherentemente malo, pero es una gran manera de hacer daño.
Cuando los desarrolladores necesitan ampliar la funcionalidad de un programa para el que no tienen el código fuente, a menudo recurren al enganche de DLL. Esta es una forma poco ortodoxa de hacer que un programa haga algo para lo que no está destinado.
La cuestión es que los piratas informáticos también usan esta técnica por razones equivocadas, como armar aplicaciones inofensivas o descifrar software. Entonces, ¿qué es el enganche de DLL y cómo funciona realmente?
¿Qué es una DLL?
Cada aplicación depende de algunos archivos fuera de su código base para ejecutarse. Estos archivos externos contienen código y datos que un programa necesita para funcionar correctamente. Cuando alguno de estos archivos externos desaparece, el programa puede tener problemas de estabilidad o negarse a ejecutarse.
En el sistema operativo Windows, estos archivos externos se denominan DLL o bibliotecas de vínculos dinámicos. Las bibliotecas de vínculos dinámicos son componentes esenciales del sistema operativo Windows y proporcionan código y recursos reutilizables que se pueden compartir entre varias aplicaciones.
Los archivos externos en Windows se conocen como bibliotecas. Hay dos tipos de bibliotecas: dinámicas y estáticas. Las bibliotecas dinámicas se cargan en tiempo de ejecución y las bibliotecas estáticas se cargan en tiempo de compilación. DLL es una biblioteca dinámica.
¿Qué es el enganche de DLL?
El enganche de DLL es una técnica que incluye interceptar y alterar las llamadas a funciones que los programas o procesos realizan en una DLL. Esencialmente una configuración de hombre en el medio se establece donde se encuentra un gancho entre un programa y las DLL a las que llama. A continuación, se rastrean y modifican todas las llamadas a funciones o las dirigidas.
Aquí hay un ejemplo de un flujo de trabajo de ataque de enganche de DLL:
- El atacante analiza las llamadas a funciones realizadas por el programa y los archivos DLL de los que depende.
- El atacante crea un enlace utilizando una de las muchas técnicas de implementación como enlace IAT, enlace en línea, enlace COM, etc.
- Ocurre la ejecución de código arbitrario.
- La ejecución de la llamada a la función original puede ocurrir o no.
- El atacante cubre sus huellas borrando el gancho y revirtiendo todas las alteraciones realizadas.
El enganche de DLL es una técnica sofisticada que se puede emplear para bien (como ampliar la funcionalidad del programa, depurar y registro) o para mal (como eludir las medidas de seguridad, robar datos confidenciales, ejecutar código arbitrario y escribir videojuegos hackeos).
¿Cómo funciona el enganche de DLL?
Antes de sumergirse en la implementación del enlace de DLL, es importante aclarar los conceptos básicos. Demos un paso atrás y entendamos qué sucede cuando un programa realiza una llamada de función a una DLL.
Cuando un programa llama a una función en una DLL, el sistema operativo primero busca el nombre de la función en la tabla de direcciones de importación del programa y obtiene la dirección de la función de la dirección de exportación de la DLL Mesa.
Una vez que se resuelve la dirección de la función, el programa puede saltar a la dirección de la función para acceder y ejecutarla. El enganche de DLL gira en torno a interceptar este proceso y redirigir la llamada de función a una función diferente. Hay varias formas de implementar el enganche de DLL. Veamos las técnicas más utilizadas para implementarlo.
Esto puede volverse bastante técnico, por lo que puede ser útil si es un usuario avanzado de Windows o tener una sólida comprensión de las partes internas de Windows.
Enganche IAT
El enganche IAT es una técnica eficaz ampliamente empleada por los autores de malware para eludir las medidas de seguridad y evadir la detección. La tabla de direcciones de importación (IAT) es una estructura de datos que se carga en la memoria cada vez que se crea un nuevo proceso. IAT contiene los nombres de todas las llamadas a funciones importadas y sus direcciones de memoria.
Cuando un programa llama a una función en la DLL, primero se busca el nombre de la función en el IAT y si el la dirección de memoria de dicha función no se encuentra en el IAT, entonces se establece a partir de la dirección de exportación de la DLL Mesa.
Es una estructura de datos donde todas las funciones exportadas por la DLL se asignan a sus direcciones de memoria. En el enganche de IAT, un adversario puede modificar el IAT de un proceso y reemplazar las asignaciones de funciones legítimas con los maliciosos, lo que interrumpe la operación prevista y hace que el programa se ejecute de forma arbitraria código.
Así es como se ve el flujo de ataque general en el enganche IAT:
- Un programa hace una llamada de función.
- La dirección de la función se encuentra en el IAT.
- Ya que el IAT se ha enganchado; la dirección de la función ha sido alterada y la ubicación de la memoria de una función maliciosa está cargada.
- El programa salta a la ubicación de la función maliciosa y se ejecuta un código arbitrario.
- Finalmente, se ejecuta la llamada de función original.
Enganche en línea
El enganche en línea es una técnica de enganche de DLL que consiste en alterar el código fuente de una función de destino para dirigir su ejecución a una función especial. El enganche en línea, a diferencia del enganche IAT, altera el código de la función de destino directamente, lo que le da al atacante un control más preciso sobre cómo se comporta la función de destino.
En el diagrama anterior, observe cómo se ha manipulado la función legítima para apuntar a una función maliciosa. Una vez que se ejecutan todas las instrucciones de la función maliciosa, se realiza una instrucción de salto para volver a la función legítima para que termine de ejecutarse.
Los adversarios emplean el enganche en línea para realizar cambios duraderos en un programa, como cambiar los parámetros o el valor de retorno de una función.
Desvíos de Microsoft
Microsoft Research ha desarrollado un paquete interno de enganche de DLL, Detours. Permite a los programadores realizar un seguimiento y alterar las llamadas a funciones realizadas por un programa. Los desvíos se pueden usar para una variedad de tareas, que incluyen, entre otras: instrumentación, pruebas y corrección de errores.
Los adversarios utilizan Detours para llevar a cabo ataques de inyección y enganche de DLL, y los desarrolladores lo utilizan con frecuencia para ampliar la funcionalidad de sus aplicaciones. Puede obtener más información sobre el paquete Desvíos en el repositorio oficial de GitHub.
Ahora ya sabe cómo funciona el enganche de DLL
El enganche de DLL es una técnica sofisticada que, cuando se usa por los motivos correctos, puede aumentar las capacidades de su aplicación o ayudarlo a depurar y optimizar el software. Desafortunadamente, el enganche se considera más comúnmente como una técnica adversaria que como una técnica de desarrollo. Por lo tanto, es importante que adopte y se adhiera a las mejores prácticas de seguridad para garantizar que sus aplicaciones estén seguras y libres de ataques como el enganche y la inyección.