Monday, February 11, 2019

Dynamic-Link-Bibliothek - Wikipedia


Dynamic Link Library (oder DLL ) ist die Implementierung des Shared Library-Konzepts von Microsoft in den Betriebssystemen Microsoft Windows und OS / 2 . Diese Bibliotheken haben normalerweise die Dateierweiterung DLL OCX (für Bibliotheken, die ActiveX-Steuerelemente enthalten) oder DRV (für Legacy-Systemtreiber). Die Dateiformate für DLLs sind die gleichen wie für Windows-EXE-Dateien - also Portable Executable (PE) für 32-Bit- und 64-Bit-Windows und New Executable (NE) für 16-Bit-Windows. Wie bei EXEs können DLLs Code, Daten und Ressourcen in beliebiger Kombination enthalten.

Datendateien mit dem gleichen Dateiformat wie eine DLL, jedoch mit unterschiedlichen Dateierweiterungen und möglicherweise nur Ressourcenteilen enthalten, können als -Ressourcen-DLLs bezeichnet werden. Beispiele für solche DLLs umfassen Symbolbibliotheken manchmal mit der Erweiterung ICL und Fontdateien mit den Erweiterungen FON und FOT . 19659004] Hintergrund für DLL [ edit ]

Die ersten Versionen von Microsoft Windows liefen Programme in einem einzigen Adressraum. Jedes Programm sollte zusammenarbeiten, indem die CPU anderen Programmen zur Verfügung gestellt wurde, so dass die grafische Benutzeroberfläche (GUI) multitaskingfähig und maximal reaktionsfähig sein konnte. Alle Operationen auf Betriebssystemebene wurden vom zugrunde liegenden Betriebssystem bereitgestellt: MS-DOS. Alle übergeordneten Dienste wurden von Windows-Bibliotheken "Dynamic Link Library" bereitgestellt. Die Zeichnungs-API, Graphics Device Interface (GDI), wurde in einer DLL GDI.EXE der Benutzeroberfläche in USER.EXE implementiert. Diese zusätzlichen Schichten über DOS mussten in allen laufenden Windows-Programmen gemeinsam genutzt werden, nicht nur, um Windows in einer Maschine mit weniger als einem Megabyte RAM zu betreiben, sondern um die Zusammenarbeit der Programme untereinander zu ermöglichen. Der Code in GDI musste Zeichnungsbefehle in Vorgänge auf bestimmten Geräten übersetzen. Auf dem Display musste er die Pixel im Bildspeicher bearbeiten. Beim Zeichnen auf einen Drucker mussten die API-Aufrufe in Anforderungen an einen Drucker umgewandelt werden. Obwohl es möglich war, eine begrenzte Anzahl von Geräten (z. B. die Anzeige des Color Graphics Adapter, die HP LaserJet Printer Command Language) hardcodiert zu unterstützen, wählte Microsoft einen anderen Ansatz. GDI würde funktionieren, indem verschiedene Codeteile ("Gerätetreiber") geladen werden, um mit unterschiedlichen Ausgabegeräten zu arbeiten.

Das gleiche Architekturkonzept, mit dem GDI verschiedene Gerätetreiber laden konnte, ist das, mit dem die Windows-Shell verschiedene Windows-Programme laden konnte und API-Aufrufe von diesen gemeinsam genutzten USER- und GDI-Bibliotheken aufruft. Dieses Konzept war "dynamisches Verknüpfen".

In einer herkömmlichen nicht gemeinsam genutzten "statischen" Bibliothek werden dem aufrufenden Programm Codeabschnitte einfach hinzugefügt, wenn seine ausführbare Datei in der "Verknüpfungsphase" erstellt wird. Wenn zwei Programme dieselbe Routine aufrufen, ist die Routine in beiden Programmen während der Verbindungsphase der beiden enthalten. Bei der dynamischen Verknüpfung wird gemeinsam genutzter Code in einer einzelnen separaten Datei abgelegt. Die Programme, die diese Datei aufrufen, werden zur Laufzeit damit verbunden, wobei das Betriebssystem (oder bei früheren Windows-Versionen die Betriebssystemerweiterung) die Bindung durchführt.

Für diese frühen Windows-Versionen (1.0 bis 3.11) bildeten die DLLs die Grundlage für die gesamte GUI. Daher waren Anzeigetreiber lediglich DLLs mit der Erweiterung .DRV, die benutzerdefinierte Implementierungen derselben Zeichnungs-API über eine einheitliche Gerätetreiberschnittstelle (DDI) bereitstellten, und die APIs von Drawing (GDI) und GUI (USER) waren lediglich die exportierten Funktionsaufrufe von GDI und USER, System-DLLs mit der Erweiterung .EXE.

Diese Vorstellung des Aufbaus des Betriebssystems aus einer Sammlung dynamisch geladener Bibliotheken ist ein Kernkonzept von Windows, das ab 2015 fortbesteht . DLLs bieten die Standardvorteile von gemeinsam genutzten Bibliotheken, wie beispielsweise die Modularität. Durch die Modularität können Änderungen an Code und Daten in einer einzelnen, von mehreren Anwendungen gemeinsam genutzten DLL vorgenommen werden, ohne dass Änderungen an den Anwendungen selbst vorgenommen werden.

Ein weiterer Vorteil der Modularität ist die Verwendung generischer Schnittstellen für Plug-Ins. Es kann eine einzige Schnittstelle entwickelt werden, mit der alte sowie neue Module zur Laufzeit nahtlos in bereits vorhandene Anwendungen integriert werden können, ohne die Anwendung selbst zu modifizieren. Dieses Konzept der dynamischen Erweiterbarkeit wird mit dem Component Object Model, der Grundlage von ActiveX, extrem zum Ausdruck gebracht.

In Windows 1.x, 2.x und 3.x haben alle Windows-Anwendungen denselben Adressraum und denselben Speicher gemeinsam. Eine DLL wurde nur einmal in diesen Adressraum geladen. Von da an haben alle Programme, die die Bibliothek verwenden, darauf zugegriffen. Die Daten der Bibliothek wurden von allen Programmen gemeinsam genutzt. Dies kann als indirekte Form der Kommunikation zwischen Prozessen verwendet werden oder die verschiedenen Programme versehentlich beschädigen. Mit der Einführung von 32-Bit-Bibliotheken in Windows 95 wird jeder Prozess in einem eigenen Adressraum ausgeführt. Während der DLL-Code möglicherweise gemeinsam genutzt wird, sind die Daten privat, es sei denn, gemeinsam genutzte Daten werden explizit von der Bibliothek angefordert. Allerdings wurden große Teile von Windows 95, Windows 98 und Windows Me aus 16-Bit-Bibliotheken aufgebaut, die die Leistungsfähigkeit des Pentium Pro-Mikroprozessors beim Start einschränkten und letztendlich die Stabilität und Skalierbarkeit der DOS-basierten Windows-Versionen einschränkten.

Obwohl DLLs den Kern der Windows-Architektur bilden, haben sie mehrere Nachteile, zusammenfassend als "DLL-Hölle" bezeichnet. [2] Ab 2015 Microsoft fördert .NET Framework als eine Lösung für die Probleme der DLL-Hölle, obwohl Sie fördern jetzt virtualisierungsbasierte Lösungen wie Microsoft Virtual PC und Microsoft Application Virtualization, da sie eine überragende Isolation zwischen Anwendungen bieten. Eine alternative Lösung zur Minderung von DLL-Lösungen besteht in der Implementierung von Side-by-Side-Assembly.

Features von DLL [ edit ]

Da DLLs im Wesentlichen die gleichen sind wie EXEs, ist die Auswahl, welche als Teil des Verknüpfungsvorgangs erzeugt werden soll, der Klarheit halber, da dies möglich ist Funktionen und Daten aus beiden exportieren.

Es ist nicht möglich, eine DLL direkt auszuführen, da für das Betriebssystem eine EXE erforderlich ist, um sie über einen Einstiegspunkt zu laden. Daher gibt es Dienstprogramme wie RUNDLL.EXE oder RUNDLL32.EXE, die den Einstiegspunkt minimal bereitstellen Framework für DLLs, die ausreichend Funktionalität enthalten, um ohne viel Unterstützung ausgeführt zu werden.

DLLs bieten einen Mechanismus für gemeinsam genutzten Code und Daten, der es einem Entwickler von gemeinsamem Code / Daten ermöglicht, die Funktionalität zu aktualisieren, ohne dass Anwendungen neu verknüpft oder neu kompiliert werden müssen. Aus Sicht der Anwendungsentwicklung kann man sich Windows und OS / 2 als eine Sammlung von DLLs vorstellen, die aktualisiert werden, wodurch Anwendungen für eine Version des Betriebssystems in einer späteren Version funktionieren können, vorausgesetzt, der Hersteller des Betriebssystems hat die Schnittstellen sichergestellt und Funktionalität sind kompatibel.

DLLs werden im Speicherbereich des aufrufenden Prozesses und mit den gleichen Zugriffsberechtigungen ausgeführt, was bedeutet, dass nur wenig Aufwand anfällt, aber es auch keinen Schutz für die aufrufende EXE-Datei gibt, wenn die DLL einen Fehler aufweist.

Speicherverwaltung [ edit ]

In der Windows-API sind die DLL-Dateien in -Abschnitte organisiert. Jeder Abschnitt verfügt über einen eigenen Satz von Attributen, z. B. schreibbar oder schreibgeschützt, ausführbar (für Code) oder nicht ausführbar (für Daten) usw.

Der Code in einer DLL wird normalerweise von allen Prozessen gemeinsam genutzt, die die DLL verwenden. Das heißt, sie nehmen einen einzigen Platz im physischen Speicher ein und beanspruchen keinen Platz in der Auslagerungsdatei. Wenn der physische Speicher, der von einem Codeabschnitt belegt wird, wiederhergestellt werden soll, wird sein Inhalt verworfen und später bei Bedarf direkt aus der DLL-Datei neu geladen.

Im Gegensatz zu Codeabschnitten sind die Datenabschnitte einer DLL normalerweise privat. Das heißt, jeder Prozess, der die DLL verwendet, hat eine eigene Kopie aller DLL-Daten. Optional können Datenabschnitte gemeinsam genutzt werden, um die Kommunikation zwischen den Prozessen über diesen gemeinsam genutzten Speicherbereich zu ermöglichen. Da Benutzereinschränkungen jedoch nicht für die Verwendung von gemeinsam genutzten DLL-Speicher gelten, entsteht eine Sicherheitslücke. Ein Prozess kann nämlich die gemeinsam genutzten Daten beschädigen, was wahrscheinlich dazu führt, dass sich alle anderen Freigabeprozesse unerwünscht verhalten. Beispielsweise kann ein Prozess, der unter einem Gastkonto ausgeführt wird, auf diese Weise einen anderen Prozess beschädigen, der unter einem privilegierten Konto ausgeführt wird. Dies ist ein wichtiger Grund, um die Verwendung von gemeinsam genutzten Abschnitten in DLLs zu vermeiden.

Wenn eine DLL durch bestimmte ausführbare Packer (z. B. UPX) komprimiert wird, werden alle ihre Codeabschnitte als Lese- und Schreibzugriffe markiert und werden nicht freigegeben. Lese- und Schreibcodeabschnitte sind, ähnlich wie private Datenabschnitte, für jeden Prozess privat. Daher sollten DLLs mit gemeinsam genutzten Datenabschnitten nicht komprimiert werden, wenn sie gleichzeitig von mehreren Programmen verwendet werden sollen, da jede Programminstanz eine eigene Kopie der DLL mit sich führen müsste, was zu einem erhöhten Speicherbedarf führt.

Importbibliotheken [ edit ]

Wie statische Bibliotheken werden Importbibliotheken für DLLs durch die Dateierweiterung .lib angegeben. Beispielsweise ist kernel32.dll, die primäre dynamische Bibliothek für Windows-Basisfunktionen wie Dateierstellung und Speicherverwaltung, über kernel32.lib verknüpft.

Das Verknüpfen mit dynamischen Bibliotheken wird normalerweise durch Verknüpfen mit einer Importbibliothek beim Erstellen oder Verknüpfen zum Erstellen einer ausführbaren Datei behandelt. Die erstellte ausführbare Datei enthält dann eine Importadresstabelle (Import Address Table, IAT), über die alle DLL-Funktionsaufrufe referenziert werden (jede referenzierte DLL-Funktion enthält einen eigenen Eintrag in der IAT). Zur Laufzeit wird der IAT mit entsprechenden Adressen gefüllt, die direkt auf eine Funktion in der separat geladenen DLL verweisen.

Symbolauflösung und -bindung [ edit ]

Jede von einer DLL exportierte Funktion wird durch eine numerische Ordnungszahl und optional einen Namen identifiziert. Ebenso können Funktionen aus einer DLL entweder nach Ordinalzahl oder nach Namen importiert werden. Die Ordnungszahl gibt die Position des Adresszeigers der Funktion in der DLL-Exportadressentabelle an. Es ist üblich, dass interne Funktionen nur über die Ordinalzahl exportiert werden. Bei den meisten Windows-API-Funktionen werden nur die Namen in verschiedenen Windows-Versionen beibehalten. die ordinale können sich ändern. Daher können Sie Windows-API-Funktionen anhand ihrer Ordinalzahlen nicht zuverlässig importieren.

Das Importieren von Funktionen nach Ordinal führt nur geringfügig zu einer besseren Leistung als das Importieren nach Namen: Exporttabellen von DLLs sind nach Namen geordnet. Daher kann eine binäre Suche zum Suchen einer Funktion verwendet werden. Der Index des gefundenen Namens wird dann zum Nachschlagen der Ordinalzahl in der Export Ordinal-Tabelle verwendet. In 16-Bit-Windows wurde die Namenstabelle nicht sortiert, so dass der Overhead für die Namenssuche viel auffälliger war.

Es ist auch möglich, eine ausführbare Datei an eine bestimmte Version einer DLL zu binden, dh, die Adressen importierter Funktionen zur Kompilierzeit aufzulösen. Bei gebundenen Importen speichert der Linker den Zeitstempel und die Prüfsumme der DLL, an die der Import gebunden ist. Zur Laufzeit prüft Windows, ob dieselbe Version der Bibliothek verwendet wird. Wenn dies der Fall ist, umgeht Windows die Verarbeitung der Importe. Andernfalls, wenn die Bibliothek sich von der Bibliothek unterscheidet, an die gebunden wurde, verarbeitet Windows die Importe auf normale Weise.

Bound-ausführbare Dateien werden etwas schneller geladen, wenn sie in derselben Umgebung ausgeführt werden, für die sie kompiliert wurden, und genau zu derselben Zeit, wenn sie in einer anderen Umgebung ausgeführt werden, sodass die Importe nicht gebunden werden müssen. Beispielsweise sind alle Standard-Windows-Anwendungen an die System-DLLs der jeweiligen Windows-Version gebunden. Eine gute Gelegenheit, um die Importe einer Anwendung an ihre Zielumgebung zu binden, ist die Installation der Anwendung. Dadurch bleiben die Bibliotheken bis zur nächsten Aktualisierung des Betriebssystems gebunden. Es ändert jedoch die Prüfsumme der ausführbaren Datei, so dass dies nicht mit signierten Programmen oder Programmen möglich ist, die von einem Konfigurationsverwaltungstool verwaltet werden, das Prüfsummen (z. B. MD5-Prüfsummen) zum Verwalten von Dateiversionen verwendet. Da neuere Windows-Versionen keine festen Adressen für jede geladene Bibliothek haben (aus Sicherheitsgründen), nehmen die Möglichkeiten und der Wert des Bindens einer ausführbaren Datei ab.

Explizite Laufzeitverknüpfung [ edit ]

DLL-Dateien können zur Laufzeit explizit geladen werden. Dies wird einfach als -Dynamikverknüpfung bezeichnet ] von Microsoft mithilfe der API-Funktion LoadLibrary (oder LoadLibraryEx ). Die API-Funktion GetProcAddress wird verwendet, um exportierte Symbole anhand des Namens nachzuschlagen, und FreeLibrary um die DLL zu entladen. Diese Funktionen sind analog zu dlopen dlsym und dlclose in der POSIX-Standard-API.

Die Prozedur für explizite Laufzeitverknüpfungen ist in jeder Sprache, die Zeiger auf Funktionen unterstützt, gleich, da sie von der Windows-API und nicht von Sprachkonstrukten abhängt.

Verzögertes Laden [ edit ]

Normalerweise wird eine Anwendung, die mit der Importbibliothek einer DLL verknüpft wurde, nicht gestartet, wenn die DLL nicht gefunden wird, da Windows die Anwendung nicht ausführt Es sei denn, es kann alle DLLs finden, die die Anwendung möglicherweise benötigt. Eine Anwendung kann jedoch mit einer Importbibliothek verknüpft sein, um ein verzögertes Laden der dynamischen Bibliothek zu ermöglichen. [3] In diesem Fall versucht das Betriebssystem nicht, die DLL zu finden oder zu laden, wenn die Anwendung gestartet wird. Der Linker enthält stattdessen einen Stub in der Anwendung, der versucht, die DLL über LoadLibrary und GetProcAddress zu finden und zu laden, wenn eine seiner Funktionen aufgerufen wird. Wenn die DLL nicht gefunden oder geladen werden kann oder die aufgerufene Funktion nicht vorhanden ist, generiert die Anwendung eine Ausnahme, die möglicherweise abgefangen und entsprechend behandelt wird. Wenn die Anwendung die Ausnahme nicht behandelt, wird sie vom Betriebssystem abgefangen, wodurch das Programm mit einer Fehlermeldung beendet wird.

Der Verzögerungslademechanismus bietet auch Benachrichtigungs-Hooks, die es der Anwendung ermöglichen, zusätzliche Verarbeitung oder Fehlerbehandlung auszuführen, wenn die DLL geladen wird und / oder eine DLL-Funktion aufgerufen wird.

Compiler- und Spracherwägungen [ edit ]

Delphi [ edit ]

In einer Quelldatei das Schlüsselwort library wird anstelle des Programms verwendet. Am Ende der Datei sind die zu exportierenden Funktionen in der Klausel export aufgeführt.

Delphi benötigt keine LIB -Dateien, um Funktionen aus DLLs zu importieren. Zur Verknüpfung mit einer DLL wird das Schlüsselwort external in der Funktionsdeklaration zum Signalisieren des DLL-Namens verwendet, gefolgt von name zum Benennen des Symbols (falls abweichend) oder des Index zur Identifizierung des Index.

Microsoft Visual Basic [ edit ]

In Visual Basic (VB) wird nur Laufzeitverknüpfung unterstützt. Zusätzlich zu den LoadLibrary und GetProcAddress API-Funktionen sind Deklarationen der importierten Funktionen zulässig.

Beim Importieren von DLL-Funktionen durch Deklarationen generiert VB einen Laufzeitfehler, wenn die -DLL -Datei nicht gefunden werden kann. Der Entwickler kann den Fehler abfangen und entsprechend behandeln.

Beim Erstellen von DLLs in VB können Sie in der IDE nur ActiveX-DLLs erstellen. Es wurden jedoch Methoden erstellt [4] mit denen der Benutzer dem Linker explizit mitteilen kann, dass er eine .DEF-Datei enthält, die die Ordnungsposition und den Namen definiert von jeder exportierten Funktion. Auf diese Weise kann der Benutzer eine Standard-Windows-DLL mit Visual Basic (Version 6 oder niedriger) erstellen, auf die mit einer "Declare" -Anweisung verwiesen werden kann.

C und C ++ [ edit ]

Microsoft Visual C ++ (MSVC) bietet verschiedene Erweiterungen des Standard-C ++, mit denen Funktionen als importiert oder direkt im C ++ - Code angegeben werden können. Diese wurden von anderen Windows C- und C ++ - Compilern einschließlich Windows-Versionen von GCC übernommen. Diese Erweiterungen verwenden vor einer Funktionsdeklaration das Attribut __ declspec . Wenn auf C-Funktionen von C ++ aus zugegriffen wird, müssen sie im C ++ - Code auch als extern "C" deklariert werden, um den Compiler darüber zu informieren, dass die C-Verknüpfung verwendet werden soll. [5]

Neben der Angabe von importierten oder exportierten Funktionen mit den Attributen __ declspec können sie im Abschnitt IMPORT oder EXPORTS der vom Projekt verwendeten Datei DEF aufgeführt werden. Die Datei DEF wird vom Linker und nicht vom Compiler verarbeitet. Daher ist sie nicht spezifisch für C ++.

Durch die DLL-Kompilierung werden sowohl DLL als auch LIB -Dateien erzeugt. Die -LIB -Datei wird verwendet, um zur Kompilierzeit eine Verknüpfung mit einer DLL herzustellen. Es ist nicht für die Laufzeitverknüpfung erforderlich. Wenn es sich bei Ihrer DLL nicht um einen COM-Server (Component Object Model) handelt, muss die Datei DLL in einem der Verzeichnisse abgelegt werden, die in der Umgebungsvariablen PATH, im Standardsystemverzeichnis oder im selben Verzeichnis wie das Verzeichnis angegeben sind Programm verwenden. COM-Server-DLLs werden mit regsvr32.exe registriert, wodurch der Speicherort der DLL und ihre global eindeutige ID (GUID) in der Registrierung gespeichert wird. Programme können dann die DLL verwenden, indem sie ihre GUID in der Registry nach ihrem Speicherort suchen oder indirekt eine Instanz des COM-Objekts mithilfe ihrer Klassen- und Schnittstellen-ID erstellen.

Programmierbeispiele [ edit ]

Verwenden von DLL-Importen [ edit ]

Die folgenden Beispiele zeigen, wie sprachspezifische Bindungen verwendet werden Importieren Sie Symbole zum Verknüpfen mit einer DLL zur Kompilierzeit.

Delphi

 {$ APPTYPE CONSOLE}    program   Beispiel ;    // Importfunktion, die zwei Zahlen addiert   AddNumbers   AddNumbers   (  a   b  :   Double ] :   Double ;   StdCall  außerhalb ; ] 'Example.dll' ;    // Hauptprogramm   var      R :   Double ;    begin     R  : =   AddNumbers  ( 1   2 ) ;     Writeln  () Das Ergebnis war:  [19659073] R ) ;   Ende .  

C

Stellen Sie sicher, dass Sie die Datei Example.lib (vorausgesetzt, dass Example.dll generiert wird) in das Projekt einschließen (Option Vorhandenes Element hinzufügen für Projekt!), Bevor Sie statisch verknüpfen. Die Datei Example.lib wird beim Compilieren der DLL automatisch vom Compiler generiert. Wenn Sie die obige Anweisung nicht ausführen, wird ein Verbindungsfehler verursacht, da der Linker nicht weiß, wo er die Definition von AddNumbers finden kann. Sie müssen die DLL Example.dll auch an den Speicherort kopieren, an dem die EXE-Datei mit dem folgenden Code generiert wird.

 #include    #include     // Importfunktion, die zwei Zahlen addiert   extern   "C"   __ declspec  (19659079] dllimport )  double   AddNumbers  ( double   a   double   b  b)  int   int  int   argc   char   *  argv  [])   {      doppelt   Ergebnis   =   AddNumbers   ( 1   2 );       printf  (19659111) Das Ergebnis war:% f    19659073] result );       return   0 ;  }  

Verwenden der expliziten Laufzeitverknüpfung [ edit [19599025] Beispiele zeigen, wie die Lade- und Verknüpfungsfunktionen für die Laufzeit mit sprachspezifischen Windows-API-Bindungen verwendet werden.

Microsoft Visual Basic [ edit ]

Warnung: Der folgende Code ist anfällig, er entspricht nicht den Anweisungen von Microsoft für sicheres Laden von Bibliotheken!

 Option   Explizit   Deklarieren   Funktion   AddNumbers   Lib   "Example.dll"  _  ( ByVal   a   As   Double   ByVal   B   As   Double [196590787] [196590787] [196590787] ] Double    Sub   Main  ()  	 Dim   Ergebnis   als   Double  	 Ergebnis   =   AddNumbers [196590784] 1   2 )  	 Debug .  Druck   "Das Ergebnis war:"   &   Ergebnis   Sub  

Delphi [ edit ]

Warnung: Der folgende Code ist anfällig, er entspricht nicht den Anweisungen von Microsoft für sicheres Laden von Bibliotheken!

 Programm   Beispiel ;     {$ APPTYPE CONSOLE}     verwendet   Windows ;     var     AddNumbers : : ; ] ( a   b :   Integer ] :   Double ;  Standard ; :  HMODULE ;   begin     LibHandle  : =   LoadLibrary [19659781]  "beispiel.dll" ] ; 19659227] wenn   LibHandle   <>   0  dann       AddNumbers  : =   GetProcAddress  (1965907990) ) ;     if   Zugewiesen  ( AddNumbers )   dann       Writeln  (  '1 + 2 ='   AddNumbers  (  1   2  )  ) ;     Ende  Ende [1] 9659074].  

C [ edit ]

Warnung: Der folgende Code ist anfällig; Es entspricht nicht den Anweisungen von Microsoft für das sichere Laden von Bibliotheken.

 #include    #include     // DLL-Funktionssignatur   typedef   double   ( *  importFunction [19659784]; double [196590138]   doppelt );  int   main  ( int   argc   char   **  arg  )   { 	 importFunction   addNumbers ;  	 doppelt   Ergebnis ;  	 HINSTANCE   hinstLib  // 19659204] hinstLib   =   LoadLibrary  ( TEXT  (19659111) "Example.dll" ))      19659082] ==   NULL )   { 		 printf  ( "FEHLER: DLL kann nicht geladen werden   [19659781]); ] return   1 ;  	}   	 // Get Funktionszeiger  	 addNumbers   =   (19659079] importFunction ) [1965] 9073] GetProcAddress  ( hinstLib   "AddNumbers" ));  	    AddNumbers   = 905907909090 )   { 		 printf  ( "FEHLER: DLL-Funktion konnte nicht gefunden werden   n " ]; [19659786] FreeLibrary  (1) );  		 return   1 ;  	}   	 // Aufruf-Funktion  	 Ergebnis   =   addNumbers  [19659078]  2 );   	 // DLL-Datei entladen  	 FreeLibrary  ( hinstLib );  printf  	  (Das Ergebnis war:% f   n    Ergebnis );   	 return   0 ;  

Python [ edit ]

Warnung: Der folgende Code ist anfällig; es entspricht nicht den Anweisungen von Microsoft für das sichere Laden von Bibliotheken!

 import   ctypes    my_dll   =   ctypes .  cdll .  LoadLibrary  [19659789] ])    # Die folgende "Restype" -Methodenspezifikation ist erforderlich, um   # Python zu verstehen, welcher Typ von der Funktion zurückgegeben wird.   my_dll .  AddNumbers .  restype   =   ctypes .  c_double    p   =   my_dll .  AddNumbers   . 19659079] c_double  ( 1.0 ),   ctypes .  c_double  2.0 ] ] ] Ergebnis war: "  p  

Component Object Model [ edit ]

Das Component Object Model (COM) definiert einen binären Standard, der die Implementierung von Objekten hostet in DLL- und EXE-Dateien. Es bietet Mechanismen zum Auffinden und Versionieren dieser Dateien sowie eine sprachunabhängige und maschinenlesbare Beschreibung der Schnittstelle. Das Hosting von COM-Objekten in einer DLL ist einfacher und ermöglicht es ihnen, Ressourcen für den Clientprozess gemeinsam zu nutzen. Dadurch können COM-Objekte leistungsfähige Backends für einfache GUI-Frontends wie Visual Basic und ASP implementieren. Sie können auch von Skriptsprachen aus programmiert werden. [6]

DLL-Hijacking [ edit ]

Aufgrund einer Sicherheitsanfälligkeit, die allgemein als DLL-Hijacking, DLL-Spoofing, DLL-Vorladen oder Binärpflanzen bezeichnet wird, viele Programme wird eine schädliche DLL laden und ausführen, die sich im selben Ordner befindet wie eine von diesen Programmen geöffnete Datendatei. [7][8][9][10] Die Schwachstelle wurde von Georgi Guninski im Jahr 2000 entdeckt. [11] Im August 2010 gewann sie nach Bekanntwerden der ACROS-Sicherheit wieder weltweite Bekanntheit und viele Hunderte von Programmen wurden als verwundbar befunden. [12] Programme, die von unsicheren Speicherorten ausgeführt werden, dh vom Benutzer schreibbare Ordner wie die Downloads oder das Temp -Verzeichnis, sind fast immer anfällig diese Schwachstelle. [13][14][15][16][17][18][19]

Siehe auch [ edit ]

Referenzen [ edit ]

  • Hart, Johnson. Windows System Programming Third Edition . Addison-Wesley, 2005. ISBN 0-321-25619-0.
  • Rector, Brent et al. Win32-Programmierung . Addison-Wesley Developers Press, 1997. ISBN 0-201-63492-9.

Externe Links [ edit ]

No comments:

Post a Comment