Hvad er DLL-filformatet?
Filer med filtypen .dll indeholder dynamisk linkede biblioteker, der deles i Microsoft Windows. Formatet .dll bruger den samme binære struktur som .exe-filer - Portable Executable (PE) formatet, identificeret ved MZ magic bytes ved offset 0 og en PE\0\0-signatur, som DOS-stub-headeren peger på - men i modsætning til en eksekverbar fil kan en .dll ikke startes direkte; den skal indlæses af en værts-proces.
Alle data i en .dll kan indlæses i hukommelsen og bruges af flere programmer samtidigt. Biblioteker indeholder typisk ActiveX-kontrolelementer, kontrolpanel-applets, enhedsdrivere eller ikon- og skrifttype-ressourcer - selvom filer, der tjener de sidstnævnte roller, ofte har andre filtyper såsom .ocx for COM-komponenter eller .sys for kernetilstand-drivere. De bruges også som modulære komponenter i større applikationer, hvor de leverer specifikke funktioner som plugins.
Biblioteker kan indeholde:
- Kode til underprogrammer, funktioner og plugins
- Data, herunder grafik og strengtabeller
- Tilknyttede ressourcer såsom menuer, dialogbokse og versionsinformation
Specifikationen for .dll-formatet er den samme som for .exe-filer - begge bruger PE-beholderen (eller PE32+ på 64-bit Windows) - biblioteket udgør dog ikke et selvstændigt program. Inden for det kaldende program kan en reference til et bibliotek og dets indlæsning udføres så sent som når der er brug for det (forsinket indlæsning). .dll-modellen understøtter modulær applikationsarkitektur, opfordrer til genbrug af kodefragmenter og reducerer både hukommelsesforbrug og diskplads. Administrerede .dll-filer kompileret til .NET bærer en CLR-header sammen med den standard PE-struktur, der indeholder MSIL-bytecode i stedet for indfødt maskinkode.
Sikkerhed og tryghed
RISIKO: HIGHDLL'er er eksekverbar kode, og malware elsker dem: ondsindede DLL'er kører inde i legitime processer (DLL-hijacking/sideloading - placering af en falsk DLL, hvor en app søger først), og «DLL fixer»-downloadwebsteder er en klassisk kanal for malware og svindel. Regler: download aldrig individuelle DLL'er fra tredjeparts «DLL download»-sider; løs fejl med manglende DLL'er ved at geninstallere appen, installere den officielle Visual C++ Redistributable / DirectX runtime, eller køre sfc /scannow; tjek ukendte DLL'ers digitale signatur (Egenskaber → Digitale signaturer) og scan dem på VirusTotal. Sletning af tilfældige DLL'er fra System32 ødelægger Windows.
Formatdetaljer
kort fortaltProgrammer der åbner DLL-filer
Tekniske detaljer
dyb specifikation| Binært format | PE (Portable Executable) på 32-bit Windows; PE32+ på 64-bit Windows - samme beholderstruktur som .exe |
| Magic bytes | 4D 5A («MZ») ved offset 0; «PE\0\0» (50 45 00 00) ved det offset, der er gemt i DOS-stub-feltet e_lfanew (0x3C) |
| DLL-identifikationsflag | IMAGE_FILE_DLL bit (0x2000) i COFF Characteristics-feltet skelner en DLL fra en EXE i den samme PE-beholder |
| MIME-type | application/vnd.microsoft.portable-executable |
| Eksportmekanisme | Export Directory Table viser funktioner efter navn og/eller ordinalnummer; kaldere løser køretidsadresser via Export Address Table (EAT) |
| Importmekanisme | Import Directory Table erklærer påkrævede DLL'er og funktionsnavne eller ordinaler; Windows-loaderen patcher Import Address Table (IAT) ved indlæsning |
| Link-tilstande | Implicit (load-time) linking via en import .lib-stub, eller eksplicit (run-time) linking via LoadLibrary() og GetProcAddress() |
| ASLR og relokering | .reloc-sektionen indeholder en base-relokeringstabel; Windows ASLR randomiserer den faktiske indlæsningsadresse ved køretid, hvilket tilsidesætter den foretrukne ImageBase i den valgfrie PE-header |
| Almindelige sektioner | .text (eksekverbar kode), .data (initialiserede data), .rdata (skrivebeskyttede data og importer), .rsrc (ressourcer), .reloc (base-relokeringer) |
| Indlejrede ressourcer | .rsrc-sektionen gemmer typiserede ressourcer - RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST - som kan ses og redigeres med værktøjer som Resource Hacker |
| Arkitektur-builds | Hver mål-CPU (x86, x64, ARM, ARM64) kræver en separat DLL-binærfil; ingen understøttelse af fat-binaries i modsætning til macOS dylib |
| Administrerede .NET DLL'er | CLR-kompilerede DLL'er indlejrer en IMAGE_COR20_HEADER, der peger på MSIL/CIL-bytecode frem for indfødt maskinkode; kan dekompileres med ILSpy eller dotPeek |
| Side-by-side assemblies | Windows XP+ WinSxS tillader flere versioner af den samme DLL at eksistere side om side på én maskine, styret af applikations-manifestfiler |
| Startpunkt | Valgfri DllMain()-funktion kaldet af loaderen ved fire hændelser: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH |
| Forsinket indlæsning | /DELAYLOAD linker-indstilling udskyder DLL-indlæsning indtil det første kald til en af dens eksporterede funktioner, hvilket reducerer processtarttiden |
| Udgivet | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| Åben standard | Ja · royaltyfri |
| Specifikation | learn.microsoft.com |