Co to jest format pliku DLL?
Pliki z rozszerzeniem .dll zawierają biblioteki łączone dynamicznie, udostępniane w ramach systemu Microsoft Windows. Format .dll wykorzystuje tę samą strukturę binarną co pliki .exe - format Portable Executable (PE), identyfikowany przez magiczne bajty MZ na offsecie 0 oraz sygnaturę PE\0\0 wskazywaną przez nagłówek DOS stub - ale w przeciwieństwie do pliku wykonywalnego, .dll nie może być uruchomiony bezpośrednio; musi zostać załadowany przez proces macierzysty.
Wszystkie dane w .dll mogą być ładowane do pamięci i używane przez kilka programów jednocześnie. Biblioteki zazwyczaj przechowują kontrolki ActiveX, aplety panelu sterowania, sterowniki urządzeń lub zasoby ikon i czcionek - choć pliki pełniące te ostatnie role często mają inne rozszerzenia, takie jak .ocx dla komponentów COM lub .sys dla sterowników trybu jądra. Są one również używane jako modułowe komponenty większych aplikacji, dostarczając określone funkcje jako wtyczki.
Biblioteki mogą zawierać:
- Kod podprogramów, funkcji i wtyczek
- Dane, w tym grafikę i tabele ciągów znaków
- Powiązane zasoby, takie jak menu, okna dialogowe i informacje o wersji
Specyfikacja formatu .dll jest taka sama jak plików .exe - oba używają kontenera PE (lub PE32+ w 64-bitowym systemie Windows) - jednak biblioteka nie stanowi samodzielnego programu. W programie wywołującym odniesienie do biblioteki i jej ładowanie może nastąpić tak późno, jak jest to potrzebne (ładowanie opóźnione). Model .dll wspiera modułową architekturę aplikacji, zachęca do ponownego wykorzystania fragmentów kodu oraz zmniejsza zużycie pamięci i miejsca na dysku. Zarządzane pliki .dll skompilowane dla .NET posiadają nagłówek CLR obok standardowej struktury PE, zawierający kod bajtowy MSIL zamiast natywnego kodu maszynowego.
Bezpieczeństwo
RYZYKO: HIGHPliki DLL to kod wykonywalny, a złośliwe oprogramowanie go uwielbia: zainfekowane pliki DLL działają wewnątrz legalnych procesów (DLL hijacking/sideloading - podrzucanie fałszywego pliku DLL tam, gdzie aplikacja szuka go w pierwszej kolejności), a strony z „naprawiaczami DLL” to klasyczny kanał dystrybucji malware i oszustw. Zasady: nigdy nie pobieraj pojedynczych plików DLL z witryn trzecich; naprawiaj błędy brakujących plików DLL poprzez ponowną instalację aplikacji, instalację oficjalnego Visual C++ Redistributable / DirectX runtime lub uruchomienie sfc /scannow; sprawdzaj podpis cyfrowy nieznanych plików DLL (Właściwości → Podpisy cyfrowe) i skanuj je w VirusTotal. Usuwanie przypadkowych plików DLL z System32 uszkadza system Windows.
Szczegóły formatu
w pigułceProgramy otwierające pliki DLL
Szczegóły techniczne
specyfikacja| Format binarny | PE (Portable Executable) w 32-bitowym Windows; PE32+ w 64-bitowym Windows - ta sama struktura kontenera co .exe |
| Magiczne bajty | 4D 5A („MZ”) na offsecie 0; „PE\0\0” (50 45 00 00) na offsecie zapisanym w polu nagłówka DOS stub e_lfanew (0x3C) |
| Flaga identyfikacji DLL | Bit IMAGE_FILE_DLL (0x2000) w polu COFF Characteristics odróżnia DLL od EXE w tym samym kontenerze PE |
| Typ MIME | application/vnd.microsoft.portable-executable |
| Mechanizm eksportu | Export Directory Table listuje funkcje według nazwy i/lub numeru porządkowego; wywołujący rozwiązują adresy w czasie wykonywania za pomocą Export Address Table (EAT) |
| Mechanizm importu | Import Directory Table deklaruje wymagane pliki DLL oraz nazwy funkcji lub numery porządkowe; loader Windows patchuje Import Address Table (IAT) w momencie ładowania |
| Tryby łączenia | Niejawne (w czasie ładowania) poprzez stub importu .lib lub jawne (w czasie wykonywania) poprzez LoadLibrary() i GetProcAddress() |
| ASLR i relokacja | Sekcja .reloc zawiera tabelę relokacji bazowej; Windows ASLR losuje rzeczywisty adres ładowania w czasie wykonywania, nadpisując preferowany ImageBase w nagłówku opcjonalnym PE |
| Typowe sekcje | .text (kod wykonywalny), .data (dane zainicjowane), .rdata (dane tylko do odczytu i importy), .rsrc (zasoby), .reloc (relokacje bazowe) |
| Wbudowane zasoby | Sekcja .rsrc przechowuje typowane zasoby - RT_ICON, RT_DIALOG, RT_STRING, RT_VERSION, RT_MANIFEST - możliwe do przeglądania i edycji narzędziami takimi jak Resource Hacker |
| Kompilacje pod architekturę | Każdy docelowy procesor (x86, x64, ARM, ARM64) wymaga oddzielnego pliku binarnego DLL; brak wsparcia dla fat-binary, inaczej niż w macOS dylib |
| Zarządzane pliki DLL .NET | Pliki DLL skompilowane przez CLR zawierają nagłówek IMAGE_COR20_HEADER wskazujący na kod bajtowy MSIL/CIL zamiast natywnego kodu maszynowego; dekompilowalne za pomocą ILSpy lub dotPeek |
| Zestawy Side-by-side | WinSxS w Windows XP+ pozwala na współistnienie wielu wersji tego samego pliku DLL na jednej maszynie, zarządzane przez pliki manifestu aplikacji |
| Punkt wejścia | Opcjonalna funkcja DllMain() wywoływana przez loader przy czterech zdarzeniach: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_DETACH |
| Ładowanie opóźnione | Opcja linkera /DELAYLOAD odracza ładowanie DLL do momentu pierwszego wywołania jednej z jego wyeksportowanych funkcji, co skraca czas uruchamiania procesu |
| Wydano | 1985 (Windows 1.0, NE format); current PE format since Windows NT 3.1, 1993 |
| Otwarty standard | Tak · bezpłatny (royalty-free) |
| Specyfikacja | learn.microsoft.com |