Wat is het DLL-bestandsformaat?
Bestanden met de extensie .dll bevatten dynamisch gekoppelde bibliotheken die worden gedeeld binnen Microsoft Windows. Het .dll-formaat gebruikt dezelfde binaire structuur als .exe-bestanden - het Portable Executable (PE) formaat, herkenbaar aan de MZ magic bytes op offset 0 en een PE\0\0-handtekening waarnaar wordt verwezen door de DOS stub header - maar in tegenstelling tot een uitvoerbaar bestand kan een .dll niet rechtstreeks worden gestart; het moet worden geladen door een hostproces.
Alle gegevens in een .dll kunnen tegelijkertijd in het geheugen worden geladen en door verschillende programma's worden gebruikt. Bibliotheken bevatten doorgaans ActiveX-besturingselementen, configuratiescherm-applets, apparaatstuurprogramma's of pictogram- en lettertypebronnen - hoewel bestanden die deze laatste rollen vervullen vaak andere extensies dragen, zoals .ocx voor COM-componenten of .sys voor drivers in kernelmodus. Ze worden ook gebruikt als modulaire componenten van grotere applicaties, waarbij specifieke functies als plug-ins worden geleverd.
Bibliotheken kunnen het volgende bevatten:
- Code voor subprogramma's, functies en plug-ins
- Gegevens, inclusief afbeeldingen en overzichtstabellen (string tables)
- Bijbehorende bronnen zoals menu's, dialoogvensters en versie-informatie
De specificatie van het .dll-formaat is hetzelfde als die van .exe-bestanden - beide gebruiken de PE-container (of PE32+ op 64-bits Windows) - de bibliotheek vormt echter geen zelfstandig programma. Binnen het aanroepende programma kan een verwijzing naar een bibliotheek en het laden ervan zo laat gebeuren als wanneer het nodig is (delay-loading). Het .dll-model ondersteunt modulaire applicatie-architectuur, stimuleert hergebruik van codefragmenten en vermindert zowel het geheugengebruik als de schijfruimte. Beheerde .dll-bestanden die zijn gecompileerd voor .NET dragen een CLR-header naast de standaard PE-structuur, die MSIL-bytecode bevat in plaats van native machinecode.
Beveiliging & veiligheid
RISICO: HIGHDLL's zijn uitvoerbare code en malware is er dol op: kwaadaardige DLL's draaien binnen legitieme processen (DLL-hijacking/sideloading - het plaatsen van een malafide DLL waar een app als eerste zoekt), en „DLL fixer”-downloadsites zijn een klassiek kanaal voor malware en oplichting. Regels: download nooit individuele DLL's van externe „DLL download”-sites; herstel ontbrekende DLL-fouten door de app opnieuw te installeren, de officiële Visual C++ Redistributable / DirectX runtime te installeren, of sfc /scannow uit te voeren; controleer de digitale handtekening van onbekende DLL's (Eigenschappen → Digitale handtekeningen) en scan ze op VirusTotal. Het verwijderen van willekeurige DLL's uit System32 maakt Windows defect.
Formaatdetails
in een notendopProgramma's die DLL-bestanden openen
Technische details
diepe specificaties| Binair formaat | PE (Portable Executable) op 32-bits Windows; PE32+ op 64-bits Windows - dezelfde containerstructuur als .exe |
| Magic bytes | 4D 5A („MZ”) op offset 0; „PE\0\0” (50 45 00 00) op de offset opgeslagen in het DOS stub-veld e_lfanew (0x3C) |
| DLL-identificatievlag | IMAGE_FILE_DLL bit (0x2000) in het COFF Characteristics-veld onderscheidt een DLL van een EXE binnen dezelfde PE-container |
| MIME-type | application/vnd.microsoft.portable-executable |
| Exportmechanisme | Export Directory Table somt functies op naam en/of ordinaal nummer op; aanroepers lossen runtime-adressen op via de Export Address Table (EAT) |
| Importmechanisme | Import Directory Table declareert vereiste DLL's en functienamen of ordinalen; de Windows-loader patcht de Import Address Table (IAT) tijdens het laden |
| Koppelingsmodi | Impliciete koppeling (tijdens laden) via een import .lib stub, of expliciete koppeling (tijdens runtime) via LoadLibrary() en GetProcAddress() |
| ASLR en relocatie | De .reloc-sectie bevat een basisrelocatietabel; Windows ASLR randomiseert het werkelijke laadadres tijdens runtime, waarbij de ImageBase in de optionele PE-header wordt overschreven |
| Veelvoorkomende secties | .text (uitvoerbare code), .data (geïnitialiseerde gegevens), .rdata (alleen-lezen gegevens en imports), .rsrc (bronnen), .reloc (basisrelocaties) |
| Ingebedde bronnen | De .rsrc-sectie slaat getypeerde bronnen op - RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST - bekijkbaar en bewerkbaar met tools zoals Resource Hacker |
| Architectuurbuilds | Elke doel-CPU (x86, x64, ARM, ARM64) vereist een apart DLL-binair bestand; geen ondersteuning voor fat-binaries in tegenstelling tot macOS dylib |
| Beheerde .NET DLL's | Door CLR gecompileerde DLL's bevatten een IMAGE_COR20_HEADER die verwijst naar MSIL/CIL-bytecode in plaats van native machinecode; decompileerbaar met ILSpy of dotPeek |
| Side-by-side assemblies | Windows XP+ WinSxS staat toe dat meerdere versies van dezelfde DLL naast elkaar op één machine bestaan, beheerd door applicatie-manifestbestanden |
| Ingangspunt | Optionele DllMain()-functie aangeroepen door de loader bij vier gebeurtenissen: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH |
| Delay-load | /DELAYLOAD linker-optie stelt het laden van de DLL uit tot de eerste aanroep van een van de geëxporteerde functies, wat de opstarttijd van processen verkort |
| Uitgebracht | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| Open standaard | Ja · royaltyvrij |
| Specificatie | learn.microsoft.com |