Articulo de referencia

Biblioteca de vínculos dinámicos

Las bibliotecas de vínculos dinámicos ( DLL ) son la implementación de Microsoft del concepto de biblioteca compartida en los sistemas operativos Microsoft Windows y OS/2 . Esta...

Las bibliotecas de vínculos dinámicos ( DLL ) son la implementación de Microsoft del concepto de biblioteca compartida en los sistemas operativos Microsoft Windows y OS/2 . Estas bibliotecas suelen tener la extensión de archivo .dll (para bibliotecas que contienen controles ActiveX ) o .exe (para controladores de sistema heredados ). Los formatos de archivo para las DLL son los mismos que para los archivos EXE de Windows : Portable Executable (PE) para Windows de 32 y 64 bits , y New Executable (NE) para Windows de 16 bits . Al igual que los EXE, las DLL pueden contener código , datos y recursos , en cualquier combinación.DLLOCXDRV

Los archivos de datos con el mismo formato que una DLL, pero con extensiones diferentes y que posiblemente contengan solo secciones de recursos, pueden denominarse DLL de recursos . Ejemplos de estas DLL incluyen bibliotecas de iconos , que a veces tienen la extensión ICL, y archivos de fuentes , que tienen las extensiones FONy FOT. [ 1 ]

Fondo

Las primeras versiones de Microsoft Windows ejecutaban programas juntos en un único espacio de direcciones . Cada programa estaba diseñado para cooperar cediendo la CPU a otros programas para que la interfaz gráfica de usuario (GUI) pudiera realizar múltiples tareas y ser lo más receptiva posible. Todas las operaciones a nivel del sistema operativo eran proporcionadas por el sistema operativo subyacente: MS-DOS . Todos los servicios de nivel superior eran proporcionados por las bibliotecas de Windows "Dynamic Link Library". La API de dibujo , Graphics Device Interface (GDI), estaba implementada en una DLL llamada GDI.EXE, la interfaz de usuario en USER.EXE. Estas capas adicionales sobre DOS debían ser compartidas entre todos los programas de Windows en ejecución, no solo para permitir que Windows funcionara en una máquina con menos de un megabyte de RAM, sino también para permitir que los programas cooperaran entre sí. El código en GDI necesitaba traducir los comandos de dibujo a operaciones en dispositivos específicos. En la pantalla, tenía que manipular los píxeles en el búfer de fotogramas. Al dibujar en una impresora, las llamadas a la API debían transformarse en solicitudes a la impresora. Aunque hubiera sido posible ofrecer compatibilidad integrada para un conjunto limitado de dispositivos (como la pantalla del adaptador de gráficos a color o el lenguaje de comandos de la impresora HP LaserJet ), Microsoft optó por un enfoque diferente. GDI funcionaría cargando diferentes fragmentos de código, denominados " controladores de dispositivo ", para interactuar con distintos dispositivos de salida.

El mismo concepto arquitectónico que permitía a GDI cargar diferentes controladores de dispositivos también permitía al intérprete de Windows cargar diferentes programas de Windows, y que estos programas invocaran llamadas a la API desde las bibliotecas compartidas USER y GDI. Ese concepto era el "enlace dinámico".

En una biblioteca estática convencional no compartida , las secciones de código se añaden al programa que realiza la llamada cuando se compila su ejecutable durante la fase de enlace; si dos programas llaman a la misma rutina, esta se incluye en ambos programas durante la fase de enlace. Con el enlace dinámico, el código compartido se coloca en un único archivo independiente. Los programas que llaman a este archivo se conectan a él en tiempo de ejecución, y el sistema operativo (o, en el caso de las primeras versiones de Windows, la extensión del sistema operativo) realiza la vinculación.

En las primeras versiones de Windows (de la 1.0 a la 3.11), las DLL constituían la base de toda la interfaz gráfica de usuario (GUI). Por lo tanto, los controladores de pantalla eran simplemente DLL con la extensión .DRV que proporcionaban implementaciones personalizadas de la misma API de dibujo a través de una interfaz unificada de controlador de dispositivo (DDI), y las API de dibujo (GDI) e interfaz gráfica de usuario (USER) eran simplemente las llamadas a funciones exportadas por las DLL del sistema GDI y USER, con extensión .EXE.

Esta idea de construir el sistema operativo a partir de una colección de bibliotecas cargadas dinámicamente es un concepto fundamental de Windows que persiste hasta 2015.Las DLL ofrecen las ventajas habituales de las bibliotecas compartidas , como la modularidad . La modularidad permite realizar cambios en el código y los datos de una única DLL autocontenida, compartida por varias aplicaciones, sin necesidad de modificar las aplicaciones en sí.

Otra ventaja de la modularidad es el uso de interfaces genéricas para los complementos. Se puede desarrollar una única interfaz que permita integrar módulos, tanto antiguos como nuevos, sin problemas en tiempo de ejecución en aplicaciones preexistentes, sin necesidad de modificar la aplicación en sí. Este concepto de extensibilidad dinámica se lleva al extremo con el Modelo de Objetos Componentes (COM) , la base de ActiveX .

En Windows 1.x, 2.x y 3.x, todas las aplicaciones de Windows compartían el mismo espacio de direcciones y la misma memoria. Una DLL se cargaba solo una vez en este espacio de direcciones; a partir de entonces, todos los programas que utilizaban la biblioteca accedían a ella. Los datos de la biblioteca se compartían entre todos los programas. Esto podía utilizarse como una forma indirecta de comunicación entre procesos o podía corromper accidentalmente los diferentes programas. Con la introducción de las bibliotecas de 32 bits en Windows 95 , cada proceso se ejecutaba en su propio espacio de direcciones. Si bien el código de la DLL puede ser compartido, los datos son privados, excepto cuando la biblioteca solicita explícitamente datos compartidos. Dicho esto, gran parte de Windows 95 , Windows 98 y Windows Me se compilaron a partir de bibliotecas de 16 bits, lo que limitó el rendimiento del microprocesador Pentium Pro al iniciarse y, en última instancia, limitó la estabilidad y la escalabilidad de las versiones de Windows basadas en DOS.

Aunque las DLL son el núcleo de la arquitectura de Windows, tienen varios inconvenientes, conocidos colectivamente como el " infierno de las DLL ". [ 2 ] A partir de 2015Microsoft promueve .NET Framework como una solución a los problemas del infierno de las DLL, aunque ahora promueve soluciones basadas en virtualización como Microsoft Virtual PC y Microsoft Application Virtualization , porque ofrecen un aislamiento superior entre aplicaciones. Una solución alternativa para mitigar el infierno de las DLL ha sido implementar el ensamblaje en paralelo .

Características

Dado que las DLL son esencialmente lo mismo que los EXE, la elección de cuál generar como parte del proceso de vinculación se basa en la claridad, ya que es posible exportar funciones y datos desde cualquiera de ellos.

No es posible ejecutar directamente una DLL, ya que requiere un archivo EXE para que el sistema operativo la cargue a través de un punto de entrada ; de ahí la existencia de utilidades como RUNDLL.EXE o RUNDLL32.EXE, que proporcionan el punto de entrada y el marco mínimo para las DLL que contienen la funcionalidad suficiente para ejecutarse sin mucho soporte.

Las DLL proporcionan un mecanismo para compartir código y datos, lo que permite a un desarrollador actualizar la funcionalidad sin necesidad de volver a enlazar o recompilar las aplicaciones. Desde el punto de vista del desarrollo de aplicaciones, Windows y OS/2 pueden considerarse como una colección de DLL que se actualizan, lo que permite que las aplicaciones de una versión del sistema operativo funcionen en una posterior, siempre que el proveedor del sistema operativo haya garantizado la compatibilidad de las interfaces y la funcionalidad.

Las DLL se ejecutan en el espacio de memoria del proceso que las llama y con los mismos permisos de acceso, lo que significa que su uso genera poca sobrecarga, pero también que el programa que las llama no cuenta con ninguna protección si la DLL tiene algún tipo de error.

Gestión de la memoria

En la API de Windows , los archivos DLL se organizan en secciones . Cada sección tiene su propio conjunto de atributos, como ser editable o de solo lectura, ejecutable (para código) o no ejecutable (para datos), etc.

El código de una DLL suele ser compartido entre todos los procesos que la utilizan; es decir, ocupa un único lugar en la memoria física y no ocupa espacio en el archivo de paginación . Windows no utiliza código independiente de la posición para sus DLL; en su lugar, el código se reubica al cargarse, fijando las direcciones de todos sus puntos de entrada en ubicaciones libres en el espacio de memoria del primer proceso que carga la DLL. En versiones anteriores de Windows, en las que todos los procesos en ejecución ocupaban un único espacio de direcciones común, una sola copia del código de la DLL siempre era suficiente para todos los procesos. Sin embargo, en versiones más recientes de Windows, que utilizan espacios de direcciones separados para cada programa, solo es posible usar la misma copia reubicada de la DLL en varios programas si cada programa tiene las mismas direcciones virtuales libres para alojar el código de la DLL. Si algunos programas (o su combinación de DLL ya cargadas) no tienen esas direcciones libres, será necesario crear una copia física adicional del código de la DLL, utilizando un conjunto diferente de puntos de entrada reubicados. Si se necesita recuperar la memoria física ocupada por una sección de código, su contenido se descarta y posteriormente se vuelve a cargar directamente desde el archivo DLL según sea necesario.

A diferencia de las secciones de código, las secciones de datos de una DLL suelen ser privadas; es decir, cada proceso que utiliza la DLL tiene su propia copia de todos sus datos. Opcionalmente, las secciones de datos pueden ser compartidas, lo que permite la comunicación entre procesos a través de esta área de memoria compartida. Sin embargo, dado que las restricciones de usuario no se aplican al uso de la memoria compartida de la DLL, esto crea una vulnerabilidad de seguridad : un proceso puede corromper los datos compartidos, lo que probablemente provocará que todos los demás procesos que la comparten se comporten de forma anómala. Por ejemplo, un proceso que se ejecuta con una cuenta de invitado puede corromper de esta manera a otro proceso que se ejecuta con una cuenta privilegiada. Esta es una razón importante para evitar el uso de secciones compartidas en las DLL.

Si una DLL se comprime con ciertos empaquetadores de ejecutables (por ejemplo , UPX ), todas sus secciones de código se marcan como de lectura y escritura, y no se comparten. Las secciones de código de lectura y escritura, al igual que las secciones de datos privados, son privadas para cada proceso. Por lo tanto, las DLL con secciones de datos compartidas no deben comprimirse si se pretende que las utilicen simultáneamente varios programas, ya que cada instancia del programa tendría que tener su propia copia de la DLL, lo que aumentaría el consumo de memoria.

Importar bibliotecas

Al igual que las bibliotecas estáticas, las bibliotecas de importación para DLL se identifican por la .libextensión del archivo. Por ejemplo, kernel32.dll , la biblioteca dinámica principal para las funciones básicas de Windows, como la creación de archivos y la gestión de memoria, se enlaza mediante kernel32.lib. La forma habitual de distinguir una biblioteca de importación de una biblioteca estática propiamente dicha es por su tamaño: la biblioteca de importación es mucho más pequeña, ya que solo contiene símbolos que hacen referencia a la DLL real, que se procesa en tiempo de enlace. Sin embargo, ambas son archivos en formato Unix ar .

La vinculación con bibliotecas dinámicas generalmente se realiza mediante la vinculación a una biblioteca de importación al compilar o vincular para crear un archivo ejecutable. El ejecutable resultante contiene una tabla de direcciones de importación (IAT) que referencia todas las llamadas a funciones de la DLL (cada función de la DLL referenciada contiene su propia entrada en la IAT). En tiempo de ejecución, la IAT se completa con las direcciones apropiadas que apuntan directamente a una función en la DLL cargada por separado. [ 3 ]

En Cygwin/MSYS y MinGW, las bibliotecas de importación reciben convencionalmente el sufijo .dll.a, que combina el sufijo DLL de Windows y el sufijo ar de Unix. El formato de archivo es similar, pero los símbolos utilizados para marcar las importaciones son diferentes ( _head_foo_dllvs __IMPORT_DESCRIPTOR_foo). [ 4 ] Aunque su conjunto de herramientas GNU Binutils puede generar bibliotecas de importación y enlazarlas, es más rápido enlazar directamente con la DLL. [ 5 ] Una herramienta experimental en MinGW llamada genlib puede utilizarse para generar bibliotecas de importación con símbolos al estilo MSVC.

Resolución y vinculación de símbolos

Cada función exportada por una DLL se identifica mediante un ordinal numérico y, opcionalmente, un nombre. Del mismo modo, las funciones pueden importarse desde una DLL mediante su ordinal o su nombre. El ordinal representa la posición del puntero de dirección de la función en la tabla de direcciones de exportación de la DLL. Es común que las funciones internas se exporten únicamente mediante su ordinal. Para la mayoría de las funciones de la API de Windows, solo se conservan los nombres entre las distintas versiones de Windows; los ordinales pueden cambiar. Por lo tanto, no es fiable importar funciones de la API de Windows mediante sus ordinales.

La importación de funciones por ordinal ofrece un rendimiento solo ligeramente superior al de importarlas por nombre: las tablas de exportación de las DLL están ordenadas por nombre, por lo que se puede usar una búsqueda binaria para encontrar una función. El índice del nombre encontrado se utiliza para consultar el ordinal en la tabla de ordinales de exportación. En Windows de 16 bits, la tabla de nombres no estaba ordenada, por lo que la sobrecarga de la búsqueda de nombres era mucho más notable.

También es posible vincular un ejecutable a una versión específica de una DLL, es decir, resolver las direcciones de las funciones importadas en tiempo de compilación. Para las importaciones vinculadas, el enlazador guarda la marca de tiempo y la suma de comprobación de la DLL a la que está vinculada la importación. En tiempo de ejecución, Windows comprueba si se está utilizando la misma versión de la biblioteca y, de ser así, omite el procesamiento de las importaciones. De lo contrario, si la biblioteca es diferente de la vinculada, Windows procesa las importaciones de forma normal.

Los ejecutables vinculados se cargan algo más rápido si se ejecutan en el mismo entorno para el que se compilaron, y exactamente al mismo tiempo si se ejecutan en un entorno diferente, por lo que no hay inconveniente en vincular las importaciones. Por ejemplo, todas las aplicaciones estándar de Windows están vinculadas a las DLL del sistema de su respectiva versión de Windows. Una buena oportunidad para vincular las importaciones de una aplicación a su entorno de destino es durante la instalación de la aplicación. Esto mantiene las bibliotecas "vinculadas" hasta la siguiente actualización del sistema operativo. Sin embargo, cambia la suma de comprobación del ejecutable, por lo que no es algo que se pueda hacer con programas firmados o programas administrados por una herramienta de administración de configuración que utiliza sumas de comprobación (como las sumas de comprobación MD5 ) para administrar las versiones de los archivos. A medida que las versiones más recientes de Windows han dejado de tener direcciones fijas para cada biblioteca cargada (por razones de seguridad), la oportunidad y el valor de vincular un ejecutable están disminuyendo.

Enlace explícito en tiempo de ejecución

Los archivos DLL se pueden cargar explícitamente en tiempo de ejecución, un proceso que Microsoft denomina simplemente enlace dinámico en tiempo de ejecuciónLoadLibrary , mediante la función API (o LoadLibraryEx). La GetProcAddressfunción API se utiliza para buscar símbolos exportados por nombre, y FreeLibrary– para descargar la DLL. Estas funciones son análogas a dlopen, dlsym, y dlcloseen la API estándar POSIX .

El procedimiento para la vinculación explícita en tiempo de ejecución es el mismo en cualquier lenguaje que admita punteros a funciones , ya que depende de la API de Windows y no de las construcciones del lenguaje.

Carga retrasada

Normalmente, una aplicación vinculada a la biblioteca de importación de una DLL no se iniciará si no encuentra la DLL, ya que Windows no la ejecutará a menos que encuentre todas las DLL que pueda necesitar. Sin embargo, una aplicación puede vincularse a una biblioteca de importación para permitir la carga diferida de la biblioteca dinámica. [ 6 ] En este caso, el sistema operativo no intentará encontrar ni cargar la DLL al iniciar la aplicación; en su lugar, el enlazador incluye un fragmento de código en la aplicación que intentará encontrar y cargar la DLL LoadLibrarycuando GetProcAddressse llame a una de sus funciones. Si no se encuentra o no se carga la DLL, o si la función llamada no existe, la aplicación generará una excepción , que puede ser capturada y gestionada adecuadamente. Si la aplicación no gestiona la excepción, el sistema operativo la capturará y finalizará el programa con un mensaje de error.

El mecanismo de carga diferida también proporciona puntos de notificación , lo que permite a la aplicación realizar un procesamiento adicional o gestionar errores cuando se carga la DLL o se llama a cualquier función de la DLL.

Consideraciones sobre el compilador y el lenguaje

Delfos

En un archivo fuente, libraryse utiliza la palabra clave en lugar de program. Al final del archivo, las funciones que se exportarán se enumeran en exportsla cláusula.

Delphi no necesita LIBarchivos para importar funciones de DLL; para vincularse a una DLL, externalse utiliza la palabra clave en la declaración de la función para indicar el nombre de la DLL, seguido de namepara nombrar el símbolo (si es diferente) o indexpara identificar el índice.

Microsoft Visual Basic

En Visual Basic (VB), solo se admite la vinculación en tiempo de ejecución; pero además de usar funciones LoadLibraryAPI GetProcAddress, se permiten declaraciones de funciones importadas.

Al importar funciones DLL mediante declaraciones, VB generará un error en tiempo de ejecución si DLLno se encuentra el archivo. El desarrollador puede capturar el error y gestionarlo adecuadamente.

Al crear DLL en VB, el IDE solo permite la creación de DLL ActiveX; sin embargo, se han creado métodos [ 7 ] para que el usuario pueda indicarle explícitamente al enlazador que incluya un archivo .DEF que define la posición ordinal y el nombre de cada función exportada. Esto permite al usuario crear una DLL estándar de Windows usando Visual Basic (versión 6 o inferior) a la que se puede hacer referencia mediante una instrucción "Declare".

C y C++

Microsoft Visual C++ (MSVC) proporciona varias extensiones al estándar C++ que permiten especificar funciones como importadas o exportadas directamente en el código C++; estas han sido adoptadas por otros compiladores de C y C++ para Windows, incluidas las versiones de GCC para Windows . Estas extensiones utilizan el atributo __declspecantes de la declaración de una función. Cabe destacar que, cuando se accede a funciones C desde C++, también deben declararse como extern "C"en el código C++, para informar al compilador de que debe utilizarse el enlace C. [ 8 ]

Además de especificar las funciones importadas o exportadas mediante __declspecatributos, estas pueden aparecer en la sección IMPORT o EXPORTS del DEFarchivo utilizado por el proyecto. DEFEl enlazador, en lugar del compilador, procesa este archivo, por lo que no es específico de C++.

La compilación de la DLL generará archivos de importación DLL. LIBEl LIBarchivo (biblioteca de importación) se utiliza para enlazar con una DLL en tiempo de compilación; no es necesario para el enlace en tiempo de ejecución. A menos que la DLL sea un servidor del Modelo de Objetos Componentes (COM), el DLLarchivo debe ubicarse en uno de los directorios listados en la variable de entorno PATH, en el directorio predeterminado del sistema o en el mismo directorio que el programa que lo utiliza. Las DLL de servidor COM se registran mediante regsvr32.exe, que coloca la ubicación de la DLL y su identificador único global ( GUID ) en el registro. Los programas pueden entonces usar la DLL buscando su GUID en el registro para encontrar su ubicación o crear una instancia del objeto COM indirectamente utilizando su identificador de clase e identificador de interfaz.

Ejemplos de programación

Uso de importaciones de DLL

Los siguientes ejemplos muestran cómo usar enlaces específicos del lenguaje para importar símbolos para la vinculación con una DLL en tiempo de compilación.

Delfos

{$APPTYPE CONSOLE}Ejemplo de programa ;// Importar función que suma dos números function AddNumbers ( a , b : Double ) : Double ; StdCall ; external 'Example.dll' ;// programa principal var R : Double ;begin R := AddNumbers ( 1 , 2 ) ; Writeln ( 'El resultado fue: ' , R ) ; end .

do

El archivo 'Example.lib' debe incluirse (suponiendo que se genere Example.dll) en el proyecto antes del enlace estático. El compilador genera automáticamente el archivo 'Example.lib' al compilar la DLL. Si no se ejecuta la instrucción anterior, se producirá un error de enlace, ya que el enlazador no sabrá dónde encontrar la definición AddNumbers. También es posible que sea necesario copiar el archivo DLL 'Example.dll' a la ubicación donde se generará el archivo .exe mediante el siguiente código:

#include <windows.h> #include <stdio.h>// Importa la función que suma dos números extern "C" __declspec ( dllimport ) double AddNumbers ( double a , double b );int main ( int argc , char * argv []) { double result = AddNumbers ( 1 , 2 ); printf ( "El resultado fue: %f \n " , result ); return 0 ; }

Utilizando la vinculación explícita en tiempo de ejecución

Los siguientes ejemplos muestran cómo utilizar las funciones de carga y vinculación en tiempo de ejecución mediante enlaces de API de Windows específicos del lenguaje.

Tenga en cuenta que las cuatro muestras son vulnerables a ataques de precarga de DLL , ya que example.dll puede resolverse en una ubicación no prevista por el autor (el directorio de trabajo actual precede a las ubicaciones de las bibliotecas del sistema) y, por lo tanto, en una versión maliciosa de la biblioteca. Consulte la referencia para obtener la guía de Microsoft sobre la carga segura de bibliotecas: se debe usar SetDllDirectoryWpara kernel32eliminar la búsqueda del directorio actual antes de que se carguen las bibliotecas. [ 9 ]

Microsoft Visual Basic

Option Explicit Declare Function AddNumbers Lib "Example.dll" _ ( ByVal a As Double , ByVal b As Double ) As DoubleSub Main () Dim Resultado As Double Resultado = AgregarNúmeros ( 1 , 2 ) Debug.Print "El resultado fue : " & Resultado End Sub

Delfos

programa Ejemplo ; {$APPTYPE CONSOLE} usa Windows ; var AddNumbers : function ( a , b : integer ) : Double ; StdCall ; LibHandle : HMODULE ; begin LibHandle := LoadLibrary ( 'example.dll' ) ; if LibHandle <> 0 then AddNumbers := GetProcAddress ( LibHandle , 'AddNumbers' ) ; if Assigned ( AddNumbers ) then Writeln ( '1 + 2 = ' , AddNumbers ( 1 , 2 ) ) ; Readln ; end .

do

#include <windows.h> #include <stdio.h>// Firma de la función DLL typedef double ( * importFunction )( double , double );int main ( int argc , char ** argv ) { importFunction addNumbers ; double result ; HINSTANCE hinstLib ;// Cargar archivo DLL hinstLib = LoadLibrary ( TEXT ( "Example.dll" )); if ( hinstLib == NULL ) { printf ( "ERROR: no se pudo cargar la DLL \n " ); return 1 ; }// Obtener puntero a función addNumbers = ( importFunction ) GetProcAddress ( hinstLib , "AddNumbers" ); if ( addNumbers == NULL ) { printf ( "ERROR: no se pudo encontrar la función DLL \n " ); FreeLibrary ( hinstLib ); return 1 ; }// Llamar a la función. resultado = agregarNúmeros ( 1 , 3 );// Descargar el archivo DLL FreeLibrary ( hinstLib );// Mostrar resultado printf ( "El resultado fue: %f \n " , resultado );devolver 0 ; }

Pitón

La interfaz ctypes de Python utilizará la API POSIX en sistemas POSIX.

importar ctypesmy_dll = ctipos . cdll . LoadLibrary ( "Ejemplo.dll" )# La siguiente especificación del método "restype" es necesaria para que # Python entienda qué tipo devuelve la función. my_dll . AddNumbers . restype = ctypes . c_doublep = my_dll.AddNumbers ( ctypes.c_double ( 1.0 ) , ctypes.c_double ( 2.0 ) )imprimir ( "El resultado fue:" , p )

Modelo de objetos de componentes

El Modelo de Objetos Componentes (COM) define un estándar binario para alojar la implementación de objetos en archivos DLL y EXE. Proporciona mecanismos para localizar y versionar dichos archivos, así como una descripción de la interfaz independiente del lenguaje y legible por máquina. Alojar objetos COM en una DLL es más ligero y permite que compartan recursos con el proceso cliente. Esto permite que los objetos COM implementen potentes backends para interfaces gráficas de usuario sencillas, como Visual Basic y ASP. También se pueden programar desde lenguajes de scripting. [ 10 ]

Secuestro de DLL

Debido a una vulnerabilidad comúnmente conocida como secuestro de DLL, suplantación de DLL, precarga de DLL o implantación de binarios, muchos programas cargan y ejecutan una DLL maliciosa contenida en la misma carpeta que un archivo de datos abierto por estos programas. [ 11 ] [ 12 ] [ 13 ] [ 14 ] La vulnerabilidad fue descubierta por Georgi Guninski en 2000. [ 15 ] En agosto de 2010 ganó publicidad mundial después de que ACROS Security la redescubriera nuevamente y se encontraran cientos de programas vulnerables. [ 16 ] Los programas que se ejecutan desde ubicaciones no seguras, es decir, carpetas con permisos de escritura del usuario como Descargas o el directorio Temp , son casi siempre susceptibles a esta vulnerabilidad. [ 17 ] [ 18 ] [ 19 ] [ 20 ] [ 21 ] [ 22 ] [ 23 ]

Véase también

Referencias

  1. Microsoft Corporation. "Creación de una DLL de solo recursos" . Biblioteca de la red de desarrolladores de Microsoft .
  2. "El fin del infierno de las DLL" . Microsoft Corporation. Archivado del original el 6 de mayo de 2008. Consultado el 11 de julio de 2009 .
  3. "Comprensión de la tabla de direcciones de importación" .
  4. "Creación y uso de DLL" . La biblioteca de importación es una biblioteca .a estándar, similar a las de UNIX, pero solo contiene la información mínima necesaria para indicarle al sistema operativo cómo el programa interactúa ("importa") la DLL. Esta información se enlaza al archivo .exe.
  5. "ld y WIN32" . Documentación de ld .
  6. "Compatibilidad del enlazador con DLL de carga diferida" . Microsoft Corporation . Consultado el 11 de julio de 2009 .
  7. Petrusha, Ron (26 de abril de 2005). "Creación de una DLL de Windows con Visual Basic" . O'Reilly Media . Recuperado el 11 de julio de 2009 .
  8. MSDN , Uso de extern para especificar enlaces
  9. "Carga segura de bibliotecas para prevenir ataques de precarga de DLL" . Soporte técnico de Microsoft . Consultado el 28 de octubre de 2019 .
  10. Satran, Michael. "Modelo de objetos componentes (COM)" . msdn.microsoft.com .
  11. Suplantación de DLL en Windows
  12. "Ataques de precarga de DLL" . msdn.com . Consultado el 25 de marzo de 2018 .
  13. "Más información sobre el vector de ataque remoto de precarga de DLL" . technet.com . Consultado el 25 de marzo de 2018 .
  14. "Actualización sobre el vector de ataque remoto de precarga de DLL" . technet.com . Consultado el 25 de marzo de 2018 .
  15. "Hacer doble clic en documentos de MS Office desde el Explorador de Windows puede ejecutar programas arbitrarios en algunos casos" . www.guninski.com . Consultado el 25 de marzo de 2018 .
  16. "Inserción binaria: el sitio web oficial de una vulnerabilidad olvidada. ACROS Security" . www.binaryplanting.com . Consultado el 25 de marzo de 2018 .
  17. Bombardeo masivo y envenenamiento de directorios
  18. "Desarrollador a Mozilla: Por favor, eliminen los antiguos procesos de instalación de Windows" . theregister.co.uk . Consultado el 25 de marzo de 2018 .
  19. "Gpg4win - Aviso de seguridad Gpg4win 2015-11-25" . www.gpg4win.org . Consultado el 25 de marzo de 2018 .
  20. "McAfee KB - Boletín de seguridad de McAfee: Parche de seguridad para varios instaladores y desinstaladores de McAfee (CVE-2015-8991, CVE-2015-8992 y CVE-2015-8993) (TS102462)" . service.mcafee.com . Consultado el 25 de marzo de 2018 .
  21. "fsc-2015-4 - F-Secure Labs" . www.f-secure.com . Archivado del original el 31 de julio de 2017. Consultado el 25 de marzo de 2018 .
  22. "Vulnerabilidad y desuso del secuestro del orden de búsqueda de la DLL ScanNow" . rapid7.com . 21 de diciembre de 2015. Consultado el 25 de marzo de 2018 .
  23. Equipo de VeraCrypt. "oss-sec: CVE-2016-1281: Los instaladores de TrueCrypt y VeraCrypt para Windows permiten la ejecución de código arbitrario con elevación de privilegios" . seclists.org . Consultado el 25 de marzo de 2018 .
  • Hart, Johnson. Programación de sistemas Windows, tercera edición . Addison-Wesley, 2005. ISBN 0-321-25619-0.
  • Rector, Brent et al. Programación Win32 . Addison-Wesley Developers Press, 1997. ISBN 0-201-63492-9.
  • dllexport, dllimport en MSDN
  • Bibliotecas de vínculos dinámicos en MSDN
  • Seguridad de bibliotecas de vínculos dinámicos en MSDN
  • Orden de búsqueda de bibliotecas de vínculos dinámicos en MSDN
  • Aviso de seguridad de Microsoft: La carga insegura de bibliotecas podría permitir la ejecución remota de código.
  • ¿Qué es una DLL? (en el sitio de soporte de Microsoft)
  • Funciones de bibliotecas de vínculos dinámicos en MSDN
  • Especificación de formato de archivo ejecutable portátil y de objeto común de Microsoft
  • Especificación de Microsoft para archivos dll
  • Bombardeo masivo y envenenamiento de directorios
  • MS09-014: Abordar la vulnerabilidad de la bomba de alfombra Safari
  • Más información sobre el vector de ataque remoto de precarga de DLL
  • Actualización sobre el vector de ataque remoto de precarga de DLL
  • Cargar la biblioteca de forma segura
  • ¿Qué es una DLL y cómo solucionarlo?