Wie können wir uns vor anderen Dritten schützen, die DLLs mit den gleichen Namen wie einige von uns in C: \ WINDOWS installieren?

8

Unser Produkt enthält mehrere DLLs, die aus Open Source in Dateien mit Standardnamen wie von den Open-Source-Entwicklern erstellt wurden. Wir achten darauf, die Dateien in unseren eigenen Verzeichnissen zu installieren und den Suchpfad (nur für unsere Prozesse) sorgfältig zu verwalten, um den Loader glücklich zu machen.

Ein anderer Entwickler - ein hoch aufragender Intellekt - entschied, dass es einfacher wäre, einen eigenen Build von ein und derselben Open Source in C: \ WINDOWS unter denselben Standard-DLL-Dateinamen zu installieren. Wenn wir einen Prozess starten, der von diesen Open-Source-DLLs abhängt, durchsucht das System C: \ WINDOWS vor unseren Verzeichnissen und findet die DLLs, die vom anderen Entwickler installiert wurden. Und sie sind natürlich unvereinbar.

Ideen, die mir bisher eingefallen sind:

  • Benenne alle unsere DLLs um, um die Standardnamen zu vermeiden, die nur erstellt werden Es weniger wahrscheinlich würden wir Kollisionen begegnen
  • Laden Sie alle unsere DLLs über den vollständigen Pfad, damit der Loader ihre Namen erfasst RAM und sucht bei der nächsten Anfrage nicht woanders nach

Aus verschiedenen Gründen ist keine dieser Optionen im Moment schmackhaft.

Was können wir noch tun, um uns gegen die hoch aufragenden Intellekts der Welt zu verteidigen?

    
Integer Poet 11.03.2010, 21:51
quelle

4 Antworten

3

Um zu den bereits ausgezeichneten Antworten hinzuzufügen, haben Sie ein paar weitere Möglichkeiten:

Die bevorzugte Lösung für dieses seit Windows XP unterstützte Problem besteht darin, Ihre DLLs in eine win32-Assembly umzuwandeln (Sie müssen nicht .NET sein, aber die Dokumentation zum Erstellen von win32-Assemblys mit starken Namen ist entsetzlich leicht) so ist es leicht zu verwirren und denke, das ist eine .NET-Technologie).

Eine Assembly erkennt komplizierter als einen Ordner (mit dem Namen der Assembly), der die DLLs und ein Manifest (mit dem Namen der Assembly) enthält, das ein assemblyIdentiy-Element und eine Anzahl von Dateiknoten für jede DLL enthält in der Versammlung.

Die assembly-basierte Suche funktioniert auch, wenn dlls statisch verknüpft sind!

  • Die einfachste Option besteht darin, nicht versionierte Assemblys zu erstellen und sie im selben Ordner wie Ihre EXE-Dateien zu speichern (vorausgesetzt, alle Exe befinden sich in einem einzigen Ordner).

Wenn sich die EXEs in verschiedenen Ordnern befinden, gibt es zwei Möglichkeiten, auf freigegebene Assemblys zuzugreifen:

  • Sie können Ihre Assemblys an einem privaten alternativen Speicherort speichern, wenn Sie erwarten, dass Ihre Anwendung unter Windows 7 und höher verwendet wird. Erstellen Sie eine Datei "app.exe.config" für jede exe-Datei und zeigen Sie auf probing privatePath -Element in einem allgemeinen Ordner, in dem Sie die Assemblys speichern.

  • Wenn Sie in Ordnung sind, administrativen Zugriff auf Installationen zu verlangen (über MSI), dann können Sie mit der entsetzlich schlechten Dokumentation (gut, fehlende Dokumentation) fertig werden, die Ihren Baugruppen einen starken Namen gibt, und dann speichern die Assembly in WinSxS.

Wenn Sie Ihre DLLs nicht als Assembly bündeln können oder wollen, Diese Seite behandelt die Dll-Suchreihenfolge

Die Verwendung von Funktionen wie SetDllDirectory hilft nur bei geladenen DLLs dynamisch zur Laufzeit (über LoadLibrary).

Dll Suchreihenfolge verwendet zu sein:

  1. Verzeichnis, das den Prozess exe
  2. enthält
  3. Aktuelles Verzeichnis
  4. verschiedene Windows-Ordner
  5. PFAD

Was Sie zu Ihrem Vorteil hätten nutzen können: Starten Sie jede exe, indem Sie das "current" -Verzeichnis auf den Ordner mit den OSS-DLLs setzen.

Mit dem Erscheinen von SafeDllSearchMode lautet die Suchreihenfolge nun:

  1. Verzeichnis, das den Prozess exe
  2. enthält
  3. verschiedene Windows-Ordner
  4. Aktuelles Verzeichnis
  5. PFAD

Bedeutung theres jetzt weniger Kontrolle als je :( - Es geht noch schneller zu den "nicht vertrauenswürdigen" c: \ windows & amp; System32 Ordner.

Auch hier wird LoadLibraryEx mit dem Flag LOAD_WITH_ALTERED_SEARCH_PATH die folgende Suchreihenfolge verursachen (vorausgesetzt, Sie übergeben einen vollständigen Pfad an LoadLibraryEx), wenn die erste DLL über LoadLibrary geladen wird und die abhängigen DLLs das Problem darstellen. p>

  1. Verzeichnisteil des Dll-Pfads, der an LoadLibraryEx
  2. übergeben wurde
  3. verschiedene Windows-Ordner
  4. Aktuelles Verzeichnis
  5. PFAD
Chris Becke 12.03.2010, 08:19
quelle
5

Sie haben nur zwei Optionen: Stellen Sie die DLL im selben Verzeichnis wie die EXE (hier wird Windows zuerst angezeigt) oder mithilfe von Manifesten, und stellen Sie die DLL im Side-by-Side-Cache von Windows bereit. Ich denke nicht, dass die letztere Option in der Open-Source-Welt üblich ist, aber es ist die einzige wirkliche Lösung, wenn Sie DLLs zwischen verschiedenen Apps teilen wollen.

    
Hans Passant 11.03.2010 21:58
quelle
1

Das Verzeichnis, von dem aus die Anwendung geladen wurde, ist normalerweise das erste Verzeichnis, das beim Laden einer DLL gesucht wird. Sie können jedoch SetDllDirectory verwenden, um die "alternative Suchreihenfolge" zu erhalten. In diesem Fall wird das Verzeichnis, das Sie für SetDllDirectory angeben, zuerst gesucht.

Es gibt auch eine SafeDllSearchMode , die das zu einem gewissen Grad beeinflusst. Wenn Sie es einschalten, wird das aktuelle Verzeichnis von der Suche ausgeschlossen.

    
Jerry Coffin 11.03.2010 22:14
quelle
0

Vielleicht nur zu einer statischen Bibliothek kompilieren?

Warum nicht?

Außerdem wird das aktuelle Verzeichnis, in dem die exe aktiviert ist, vor c: \ windows.

gesucht     
shoosh 11.03.2010 22:12
quelle

Tags und Links