En programación informática , la inyección de DLL es una técnica utilizada para ejecutar código dentro del espacio de direcciones de otro proceso al forzarlo a cargar una biblioteca de vínculos dinámicos . [ 1 ] La inyección de DLL es utilizada frecuentemente por programas externos para influir en el comportamiento de otro programa de una manera que sus autores no anticiparon ni pretendieron. [ 1 ] [ 2 ] [ 3 ] Por ejemplo, el código inyectado podría interceptar llamadas a funciones del sistema, [ 4 ] [ 5 ] o leer el contenido de los cuadros de texto de contraseñas , lo cual no se puede hacer de la manera habitual. [ 6 ] Un programa utilizado para inyectar código arbitrario en procesos arbitrarios se denomina inyector de DLL .
Enfoques en Microsoft Windows
En Microsoft Windows existen varias maneras de forzar a un proceso a cargar y ejecutar código en una DLL que los autores no pretendían:
- Las DLL listadas en la entrada del registro
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLsse cargan en cada proceso que carga User32.dll durante la llamada inicial de esa DLL. [ 7 ] [ 8 ] [ 9 ] A partir de Windows Vista , las AppInit_DLL están deshabilitadas de forma predeterminada. [ 10 ] A partir de Windows 7 , la infraestructura de AppInit_DLL admite la firma de código . A partir de Windows 8 , toda la funcionalidad de AppInit_DLL se deshabilita cuando se habilita el Arranque seguro , independientemente de la firma de código o la configuración del registro. [ 11 ] - Las DLL listadas en la clave del registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\AppCertDLLsse cargan en cada proceso que llama a las funciones de la API de Win32CreateProcess,CreateProcessAsUser,CreateProcessWithLogonW,CreateProcessWithTokenWyWinExec. Esa es la forma correcta de usar la inyección de DLL legal en la versión actual de Windows (Windows 10). La DLL debe estar firmada con un certificado válido. - Las funciones de manipulación de procesos, como las técnicas de inyección de código
CreateRemoteThreadcomo AtomBombing, [ 12 ] pueden usarse para inyectar una DLL en un programa después de que se haya iniciado. [ 5 ] [ 6 ] [ 13 ] [ 14 ] [ 15 ] [ 16 ]- Abrir un identificador para el proceso objetivo. Esto se puede hacer generando el proceso [ 17 ] [ 18 ] o utilizando como clave algo creado por ese proceso que se sabe que existe, por ejemplo, una ventana con un título predecible, [ 19 ] u obteniendo una lista de procesos en ejecución [ 20 ] y buscando el nombre de archivo del ejecutable objetivo. [ 21 ]
- Asigna algo de memoria en el proceso objetivo, [ 22 ] y el nombre de la DLL que se inyectará se escribe en ella. [ 13 ] [ 23 ]
- Este paso puede omitirse si ya existe un nombre de DLL adecuado en el proceso de destino. Por ejemplo, si un proceso se enlaza con User32.dll , GDI32.dll , Kernel32.dll o cualquier otra biblioteca cuyo nombre termine en
32.dll, sería posible cargar una biblioteca llamada [ 24 ] . Esta técnica ha demostrado ser eficaz contra un método para proteger los procesos contra la inyección de DLL. [ 25 ]32.dll
- Este paso puede omitirse si ya existe un nombre de DLL adecuado en el proceso de destino. Por ejemplo, si un proceso se enlaza con User32.dll , GDI32.dll , Kernel32.dll o cualquier otra biblioteca cuyo nombre termine en
- Crea un nuevo hilo en el proceso de destino [ 26 ] con la dirección de inicio del hilo establecida como la dirección de
LoadLibraryy el argumento establecido como la dirección de la cadena que se acaba de cargar en el destino. [ 13 ] [ 27 ]- En lugar de escribir el nombre de una DLL a cargar en el destino e iniciar el nuevo hilo en
LoadLibrary, se puede escribir el código a ejecutar en el destino e iniciar el hilo en ese código. [ 6 ]
- En lugar de escribir el nombre de una DLL a cargar en el destino e iniciar el nuevo hilo en
- El sistema operativo llama entonces a la rutina de inicialización de la DLL inyectada. [ 13 ] [ 28 ]
- Tenga en cuenta que, sin precauciones, este enfoque puede ser detectado por el proceso objetivo debido a las
DLL_THREAD_ATTACHnotificaciones enviadas a cada módulo cargado cuando se inicia un hilo. [ 28 ]
- Llamadas de interceptación de Windows como
SetWindowsHookEx. [ 2 ] [ 5 ] [ 6 ] [ 29 ] [ 30 ] [ 31 ] - Utilice la función
SuspendThreadoNtSuspendThreadpara suspender todos los subprocesos y, a continuación, utilice la funciónSetThreadContextoNtSetContextThreadpara modificar el contexto de un subproceso existente en la aplicación para ejecutar código inyectado, que a su vez podría cargar una DLL. [ 4 ] [ 32 ] [ 33 ] - Explotar las limitaciones de diseño en Windows y las aplicaciones que llaman a la función
LoadLibraryoLoadLibraryExsin especificar una ruta completa a la DLL que se está cargando. [ 34 ] [ 35 ] [ 36 ] - Enmascarillas a nivel del sistema operativo .
- Sustituir una DLL específica de la aplicación por un reemplazo no autorizado que implementa las mismas exportaciones de funciones que la original. [ 37 ]
- DLL reflectivas o DLL que pueden cargarse a sí mismas. La DLL reflectiva se copia en el espacio de memoria del proceso objetivo y la ejecución se transfiere al punto de entrada de la DLL, que luego se carga desde la memoria. [ 38 ]
Enfoques en sistemas tipo Unix
En sistemas operativos tipo Unix con el enlazador dinámico basado en ld.so (en BSD ) y ld-linux.so (en Linux ), se pueden enlazar bibliotecas arbitrarias a un nuevo proceso proporcionando la ruta de acceso de la biblioteca en la variable de entorno LD_PRELOAD , que se puede configurar globalmente o individualmente para un solo proceso. [ 39 ]
Por ejemplo, en un sistema Linux, este comando ejecuta el comando "prog" con la biblioteca compartida del archivo "test.so" vinculada a él en el momento de la ejecución:
LD_PRELOAD = "./test.so" prog Dicha biblioteca se puede crear de la misma manera que otros objetos compartidos . Con GCC , esto implica compilar el archivo fuente que contiene las nuevas variables globales que se van a enlazar, con la opción -fpic o -fPIC , [ 40 ] y enlazar con la opción -shared . [ 41 ] La biblioteca tiene acceso a los símbolos externos declarados en el programa como cualquier otra biblioteca.
En macOS , el siguiente comando inicia el comando "prog" con la biblioteca compartida del archivo "test.dylib" vinculada a él en el momento del inicio: [ 42 ]
DYLD_INSERT_LIBRARIES = "./test.dylib" DYLD_FORCE_FLAT_NAMESPACE = 1 prog También es posible utilizar técnicas basadas en depuradores en sistemas tipo Unix. [ 43 ]
Referencias
- 1 2 James Shewmaker (2006). "Análisis de la inyección de DLL" (PDF) . Presentación GSM . Bluenotch. Archivado del original (PDF) el 3 de diciembre de 2008. Recuperado el 31 de agosto de 2008 .
- 1 2 Iczelion (agosto de 2002). "Tutorial 24: Windows Hooks" . Página principal de ensambladores Win32 de Iczelion . Archivado del original el 1 de agosto de 2008. Recuperado el 31 de agosto de 2008 .
- ↑ Rocky Pulley (19 de mayo de 2005). "Extendiendo el Administrador de tareas con inyección de DLL" . CodeProject . Archivado del original el 6 de febrero de 2009. Recuperado el 1 de septiembre de 2008 .
- 1 2 Nasser R. Rowhani (23 de octubre de 2003). "Tutorial de inyección de DLL e intercepción de funciones" . CodeProject . Archivado del original el 15 de abril de 2018. Recuperado el 31 de agosto de 2008 .
- 1 2 3 Ivo Ivanov (2 de diciembre de 2002). "Se revela el enganche de API" . CodeProject . Archivado del original el 14 de octubre de 2008. Recuperado el 31 de agosto de 2008 .
- 1 2 3 4 Robert Kuster (20 de agosto de 2003). "Tres maneras de inyectar tu código en otro proceso" . CodeProject . Archivado del original el 20 de julio de 2008. Recuperado el 31 de agosto de 2008 .
- ↑ "Trabajar con el valor de registro AppInit_DLLs" . Ayuda y soporte técnico de Microsoft . Microsoft. 21 de noviembre de 2006. Consultado el 31 de agosto de 2008 .
- ↑ Raymond Chen (13 de diciembre de 2007). "Las DLL de AppInit deberían renombrarse como DLL de Interbloqueo o Fallo Aleatorio" . The Old New Thing . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "dllmain.c" . ReactOS . Fundación ReactOS. 8 de julio de 2008. Consultado el 31 de agosto de 2008 .
- ↑ AppInit_DLLs en Windows 7 y Windows Server 2008 R2
- ↑ "DLLs de AppInit y arranque seguro" . MSDN . Consultado el 29 de marzo de 2016 .
- ↑ ""Ataque con bombas atómicas" a Microsoft Windows mediante inyección de código . Dark Reading . Consultado el 20 de abril de 2017 .
- 1 2 3 4 Trent Waddington. "InjectDLL" . Archivado del original el 30 de diciembre de 2019. Recuperado el 31 de agosto de 2008 .
- ↑ "Inyección de Dll" . DreamInCode.net . MediaGroup1. 4 de mayo de 2006. Archivado del original el 2 de septiembre de 2008. Consultado el 31 de agosto de 2008 .
- ↑ Greg Jenkins (noviembre de 2007). "DLL Injection Framework" . Ring3 Circus . WordPress. Archivado del original el 28 de junio de 2020. Recuperado el 31 de agosto de 2008 .
- ↑ Drew Benton (17 de agosto de 2007). "Una solución más completa para la inyección de DLL mediante CreateRemoteThread" . CodeProject . Consultado el 1 de septiembre de 2008 .
- ↑ "CreateProcess" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "INFORMACIÓN_DEL_PROCESO" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "Función GetWindowThreadProcessId" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "EnumProcesses" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "GetModuleBaseName" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "VirtualAllocEx" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "WriteProcessMemory" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "Inyección de DLL con CreateRemoteThread" . Stack Overflow . Consultado el 5 de julio de 2026 .
- ↑ "Vulnerabilidad de robo de identificadores que elude la autoprotección de los puestos de avanzada mediante inyección avanzada de DLL" . Matousec . 1 de diciembre de 2006. Archivado del original el 6 de febrero de 2009. Consultado el 31 de agosto de 2008 .
- ↑ "CreateRemoteThread" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "LoadLibrary" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- 1 2 "DllMain" . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ «Función SetWindowsHookEx» . SDK de plataforma para Windows XP SP2 . Microsoft . Consultado el 31 de agosto de 2008 .
- ↑ "Valor del registro AppInit_DLLs y Windows 95" . Ayuda y soporte técnico de Microsoft . Microsoft. 1 de marzo de 2005. Consultado el 31 de agosto de 2008 .
- ↑ "Inyección de DLL mediante el método SetWindowsHookEx()" . Game Reversal . 3 de abril de 2008. Archivado del original el 4 de abril de 2016. Consultado el 1 de septiembre de 2008 .
- ↑ "Inyección de DLL SetThreadContext" . 16 de enero de 2007. Archivado del original el 23 de agosto de 2011. Consultado el 1 de septiembre de 2008 .
- ↑ Ben Botto (6 de septiembre de 2008). "Inyector de DLL" . Archivado del original el 7 de febrero de 2009. Consultado el 1 de septiembre de 2008 .
- ↑ "La carga insegura de bibliotecas podría permitir la ejecución remota de código" . Microsoft . 10 de junio de 2011. Consultado el 20 de abril de 2016 .
- ↑ "Carga segura de bibliotecas para prevenir ataques de precarga de DLL" . Microsoft . 10 de junio de 2011. Consultado el 8 de agosto de 2012 .
- ↑ "Aviso de seguridad de Microsoft: la carga insegura de bibliotecas podría permitir la ejecución remota de código" . Microsoft . 10 de junio de 2011. Consultado el 20 de abril de 2016 .
- ↑ Nicolas Falliere (26 de septiembre de 2010). "Infección de Stuxnet en proyectos de Step 7" . Symantec.
- ↑ Equipo de investigación de seguridad de Microsoft Defender (13 de noviembre de 2017). "Detección de la carga reflectiva de DLL con Windows Defender ATP" . Blog de seguridad de Microsoft . Consultado el 26 de marzo de 2025 .
- ↑ Linus Torvalds ; David Engel; Eric Youngdale; Peter MacDonald; Hongjiu Lu; Lars Wirzenius; Mitch D'Souza (14 de marzo de 1998). "ld.so/ld-linux.so – enlazador/cargador dinámico" . Páginas man de UNIX . Archivado del original el 6 de febrero de 2009. Recuperado el 31 de agosto de 2008 .
- ↑ "Opciones de generación de código" . Uso de la colección de compiladores GNU (GCC) . Fundación del Software Libre . Consultado el 31 de agosto de 2008.
Genera código independiente de la posición (PIC) adecuado para su uso en una biblioteca compartida, si es compatible con la máquina de destino.
sqq
.-fpic - ↑ "Opciones de enlace" . Uso de la colección de compiladores GNU (GCC) . Fundación del Software Libre . Consultado el 31 de agosto de 2008. Produce
un objeto compartido que luego se puede enlazar con otros objetos para formar un ejecutable.
sqq.
-shared - ↑ "El truco LD_PRELOAD" . Peter Goldsborough . Consultado el 17 de mayo de 2017 .
- ↑ Gregory Shpitalnik (12 de febrero de 2009). "Inyección de código en una aplicación Linux en ejecución" . Code Project . Archivado del original el 12 de junio de 2010. Consultado el 18 de noviembre de 2010 .
- Inyección de DLL
- Bibliotecas informáticas
- Administración de Windows
- Hilos (informática)