DLL

Dynamic-Link Library

Tanto el tipo de archivo .exe como el .dll se consideran formatos ejecutables portátiles (PE), pero existen diferencias entre ambos. En esta entrada, se explica la diferencia entre los dos tipos de archivo.

¿Qué es una DLL?

Las DLL son bibliotecas compartidas que contienen funciones ejecutables o datos que pueden ser utilizados por múltiples aplicaciones simultáneamente. Se utilizan para exportar funciones que pueden ser utilizadas por un proceso. A diferencia de los archivos EXE, los archivos DLL no pueden ejecutar código por sí mismos. En cambio, las bibliotecas DLL necesitan ser invocadas por otros programas para ejecutar el código. Como se mencionó anteriormente, la función CreateFileW se exporta desde kernel32.dll, por lo tanto, si un proceso desea llamar a esa función, primero debe cargar kernel32.dll en su espacio de direcciones.

Algunas DLL se cargan automáticamente en cada proceso de manera predeterminada, ya que estas DLL exportan funciones que son necesarias para que el proceso se ejecute correctamente. Algunos ejemplos de estas DLL son ntdll.dll, kernel32.dll y kernelbase.dll. La imagen a continuación muestra varias DLL que están actualmente cargadas por el proceso explorer.exe.

Dirección base de una DLL (System-Wide DLL Base Address)

El sistema operativo Windows utiliza una dirección base de DLL para todo el sistema para cargar algunas DLL en la misma dirección base en el espacio de direcciones virtual de todos los procesos de una máquina determinada para optimizar el uso de la memoria y mejorar el rendimiento del sistema. La siguiente imagen muestra kernel32.dll siendo cargado en la misma dirección (0x7fff9fad0000) entre múltiples procesos en ejecución.

¿Por qué usar una DLL?

Hay varias razones por las que las DLL se utilizan muy a menudo en Windows:

  1. Modularización del código - En lugar de tener un ejecutable masivo que contenga toda la funcionalidad, el código se divide en varias bibliotecas independientes y cada biblioteca se centra en una funcionalidad específica. La modularización facilita el trabajo de los desarrolladores durante el desarrollo y la depuración.

  2. Reutilización del Código - Las DLLs promueven la reutilización del código ya que una librería puede ser invocada por múltiples procesos.

  3. Uso eficiente de la memoria - Cuando varios procesos necesitan la misma DLL, pueden ahorrar memoria compartiendo esa DLL en lugar de cargarla en la memoria del proceso.

Entry Point de una DLL

Las DLL pueden especificar opcionalmente una función de punto de entrada que ejecuta código cuando ocurre una tarea específica, como cuando un proceso carga la biblioteca DLL. Existen 4 posibilidades para que se llame al punto de entrada:

  • DLL_PROCESS_ATTACHED: Un proceso está cargando la DLL.

  • DLL_THREAD_ATTACHED: Un proceso está creando un nuevo hilo.

  • DLL_THREAD_DETACH: Un hilo sale de manera normal.

  • DLL_PROCESS_DETACH: Un proceso descarga la DLL.

DLL Código de ejemplo

BOOL APIENTRY DllMain(
    HANDLE hModule,             // Handle to DLL module
    DWORD ul_reason_for_call,   // Reason for calling function
    LPVOID lpReserved           // Reserved
) {

    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACHED: // A process is loading the DLL.
        // Do something here
        break;
        case DLL_THREAD_ATTACHED: // A process is creating a new thread.
        // Do something here
        break;
        case DLL_THREAD_DETACH: // A thread exits normally.
        // Do something here
        break;
        case DLL_PROCESS_DETACH: // A process unloads the DLL.
        // Do something here
        break;
    }
    return TRUE;
}

Última actualización