Что такое формат файла DLL?
Файлы с расширением .dll содержат динамически подключаемые библиотеки, используемые совместно в Microsoft Windows. Формат .dll использует ту же бинарную структуру, что и файлы .exe - формат Portable Executable (PE), идентифицируемый по магическим байтам MZ со смещением 0 и сигнатуре PE\0\0, на которую указывает заголовок DOS stub - но, в отличие от исполняемого файла, .dll нельзя запустить напрямую; он должен быть загружен хост-процессом.
Все данные в .dll могут быть загружены в память и использоваться несколькими программами одновременно. Библиотеки обычно содержат элементы управления ActiveX, апплеты панели управления, драйверы устройств или ресурсы значков и шрифтов - хотя файлы, выполняющие последние роли, часто имеют другие расширения, такие как .ocx для компонентов COM или .sys для драйверов режима ядра. Они также используются как модульные компоненты крупных приложений, предоставляя определенные функции в виде плагинов.
Библиотеки могут содержать:
- Код для подпрограмм, функций и плагинов
- Данные, включая графику и таблицы строк
- Связанные ресурсы, такие как меню, диалоги и информация о версии
Спецификация формата .dll такая же, как у файлов .exe - оба используют контейнер PE (или PE32+ в 64-битной Windows) - однако библиотека не является самостоятельной программой. В вызывающей программе ссылка на библиотеку и ее загрузка могут быть выполнены так поздно, как это необходимо (отложенная загрузка). Модель .dll поддерживает модульную архитектуру приложений, поощряет повторное использование фрагментов кода и снижает использование памяти и дискового пространства. Управляемые файлы .dll, скомпилированные для .NET, содержат заголовок CLR наряду со стандартной структурой PE, содержащий байт-код MSIL вместо нативного машинного кода.
Безопасность и защита
РИСК: HIGHDLL - это исполняемый код, и вредоносное ПО его обожает: вредоносные DLL запускаются внутри легитимных процессов (DLL hijacking/sideloading - подкладывание поддельной DLL туда, где приложение ищет в первую очередь), а сайты для скачивания «DLL-фиксеров» - классический канал распространения вирусов и мошенничества. Правила: никогда не скачивайте отдельные DLL со сторонних сайтов; исправляйте ошибки отсутствующих DLL переустановкой приложения, установкой официальных Visual C++ Redistributable / DirectX или запуском sfc /scannow; проверяйте цифровую подпись неизвестных DLL (Свойства → Цифровые подписи) и сканируйте их на VirusTotal. Удаление случайных DLL из System32 выводит Windows из строя.
Детали формата
в двух словахПрограммы, открывающие файлы DLL
Технические подробности
глубокая спецификация| Бинарный формат | PE (Portable Executable) в 32-битной Windows; PE32+ в 64-битной Windows - та же структура контейнера, что и у .exe |
| Магические байты | 4D 5A («MZ») со смещением 0; «PE\0\0» (50 45 00 00) по смещению, хранящемуся в поле DOS stub e_lfanew (0x3C) |
| Флаг идентификации DLL | Бит IMAGE_FILE_DLL (0x2000) в поле COFF Characteristics отличает DLL от EXE внутри одного и того же контейнера PE |
| MIME-тип | application/vnd.microsoft.portable-executable |
| Механизм экспорта | Export Directory Table перечисляет функции по имени и/или порядковому номеру; вызывающие стороны разрешают адреса во время выполнения через Export Address Table (EAT) |
| Механизм импорта | Import Directory Table объявляет необходимые DLL и имена функций или ординалы; загрузчик Windows исправляет Import Address Table (IAT) во время загрузки |
| Режимы связывания | Неявное связывание (во время загрузки) через библиотеку импорта .lib или явное связывание (во время выполнения) через LoadLibrary() и GetProcAddress() |
| ASLR и релокация | Секция .reloc содержит таблицу базовой релокации; Windows ASLR рандомизирует фактический адрес загрузки во время выполнения, переопределяя предпочтительный ImageBase в опциональном заголовке PE |
| Общие секции | .text (исполняемый код), .data (инициализированные данные), .rdata (данные только для чтения и импорт), .rsrc (ресурсы), .reloc (базовые релокации) |
| Встроенные ресурсы | Секция .rsrc хранит типизированные ресурсы - RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST - доступные для просмотра и редактирования такими инструментами, как Resource Hacker |
| Сборки под архитектуры | Для каждого целевого процессора (x86, x64, ARM, ARM64) требуется отдельный бинарный файл DLL; поддержка «толстых» бинарных файлов (fat-binary) отсутствует, в отличие от macOS dylib |
| Управляемые .NET DLL | DLL, скомпилированные в CLR, содержат заголовок IMAGE_COR20_HEADER, указывающий на байт-код MSIL/CIL, а не на нативный машинный код; декомпилируются с помощью ILSpy или dotPeek |
| Параллельные сборки (Side-by-side) | WinSxS в Windows XP+ позволяет нескольким версиям одной и той же DLL сосуществовать на одной машине под управлением файлов манифеста приложения |
| Точка входа | Необязательная функция DllMain(), вызываемая загрузчиком при четырех событиях: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH |
| Отложенная загрузка | Опция линкера /DELAYLOAD откладывает загрузку DLL до первого вызова одной из её экспортируемых функций, сокращая время запуска процесса |
| Выпущен | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| Открыть стандартное | Да · без роялти |
| Спецификация | learn.microsoft.com |