Flux RSS - La vie du site - Nouveautés et mises à jour
Assiste.com - Sécurité informatique - Décontamination - Antivirus - Protection - Protection de la Vie Privée Assiste.com - Sécurité informatique préventive - Décontamination - Antivirus - Protection - Protection de la Vie Privée

DLL Hell - L'enfer des DLL

Dernière mise à jour : 2018-10-12T14:52 - 12.10.2018
10.01.2013 - 00h00 - Paris - (Assiste - Pierre Pinard) - Mise à jour de notre article antérieur (versions 1997-2007)

DLL Hell : L'enfer des DLL (Dynamic Link Library)

Que sont les DLLs ?Que sont les DLLs ?Que sont les DLLs ?

Que sont les ressources communes trouvées dans WinSxS, en particulier les « DLLs » (les « DLLs » ne sont pas les seules ressources communes (partagées) présentes dans WinSxS) ?

Les « DLLs » (Dynamic Link Library) (bibliothèque de liaisons dynamiques) sont des fonctionnalités standards se traduisant par des composants (bouts de programmes standards), exécutant une fonction spécifique courante que l'on va retrouver dans de nombreuses applications. La notion de composants logiciels (une brique logiciel) liés à une architecture logiciel de plus haut niveau (une application) existe depuis toujours, sous divers noms. C'est le concept du DRY ("Don’t Repeat Yourself" - "Ne vous répétez pas").

Les DLLs sont fournies par les éditeurs de logiciels, Microsoft bien entendu, et les grands éditeurs produisant de nombreuses applications (Adobe etc. ...).

  1. Premier avantage des DLLs :
    Lorsqu'un développeur écrit une application, il a intérêt à utiliser des briques de code (exemple : les « DLLs ») toutes faites pour accélérer son développement.

  2. Second avantage des DLL :
    Le programmeur est censé s'appuyer sur du code normalement déjà bien stable (débugué).

  3. Troisième avantage des DLLs :
    Le "poids" d'une l'application développée en utilisant des DLLs est plus petit. De nombreuses fonctions ne sont représentées que par un appel à une fonctionnalité standard, externe au programme, qui sera mise à disposition du programme ("montée en mémoire") par un mécanisme du système d'exploitation (techniquement, c'est une phase de post compilation (traduction du code écrit par le programmeur en un code exécutable par un ordinateur), appelée "Edition des liens" (Link Edit), qui introduit, dans le code de l'application, les appels aux bibliothèques externes).

  4. Quatrième avantage des DLLs :
    Le mécanisme du système d'exploitation vérifie si la ressource (la DLL) est déjà montée en mémoire, appelée par une autre application et, si ce n'est pas le cas, il la fait monter en mémoire et donne l'adresse RAM du point d'entrée de la ressource à l'application qui l'appelle. Ainsi, on comprend qu'une ressource disponible sous forme de DLL ne monte qu'une fois en RAM et est mise à disposition de plusieurs applications.

  5. Cinquième avantage des DLLs :
    Elles favorisent une technique de développement architectural des applications dites "modulaire", ce qui est, intellectuellement et pratiquement, très satisfaisant.

Donc, les DLLs, c'est génial... Cela ne présente que des avantages (lire : DRY ("Don’t Repeat Yourself" - "Ne vous répétez pas")) !

On peut voir quelles sont les DLLs utilisées par une application (et autres composants externes), et, éventuellement, rechercher quelles sont les DLLs et autres dépendances manquantes, avec Dependency Walker.

Les notions de " composants liés à l'architecture d'un programme principal ", au moment de sa " post compilation " (phase dite d' " édition des liens "), existe depuis la nuit des temps informatiques.

J'utilisais des éditeurs de liens sur IBM 360 au tout début des années 1970. La dixième édition de ce document d'IBM sur l'édition des liens sous l'OS des IBM 360 remonte à 1972 !

Dans Windows, la notion de composants remonte au tout début de Windows, dès sa version 1.0, en 1985. L'enfer des DLLs conduira Microsoft à réagir avec un magasin de composants contenant toutes les formes de composants utilisées, dont les DLLs. Ce magasin prend le nom de WinSxS, à partir de Windows Vista.

Ce magasin sera protégé, ne pouvant être manipulé que par des applications éligibles au compte utilisateur spécial "TrustedInstaller" et à travers une procédure particulière.


Le DLL HELL - L'enfer des DLL !Le DLL HELL - L'enfer des DLL !Le DLL HELL - L'enfer des DLL !

L'utilisateur descend dans l'enfer des DLL, le fameux " DLL Hell ", dès qu'une DLL est manquante ou ne répond plus à ce que l'on attend d'elle :
  • Effacée par un désinstalleur d'une application, sans tenir compte du fait que la DLL pouvait servir à d'autres applications. C'est la faute à d'innombrables désinstalleurs d'applications et à d'innombrables utilitaires inutiles et dangereux, prétendant nettoyer le Registre Windows pour accélérer votre ordinateur - Ne touchez jamais au Registre Windows.

  • Modifiée, en partant certainement d'une bonne intention, par un éditeur de logiciel qui a " amélioré " une DLL, faisant, par la même occasion, chutter toutes les autres applications qui utilisent cette DLL et qui ont absolument besoin de l'ancienne version.
DLL Hell est un nom désignant un ensemble de problèmes rencontrés avec le concept de DLL sous Windows dont les problèmes de conflits de versions, de DLL manquante, de DLLs dupliquées, de DLL pas, plus ou mal enregistrée dans le Registre Windows, etc. ... Pourquoi ?
  1. Parce qu'une application a été mise au point à un moment donné, avec une version précise de chaque DLL qu'elle utilise, mais que, depuis, les petits malins, fournisseurs de DLL, comme Microsoft, Adobe et compagnie, on ré-écrit leurs DLLs pour qu'elles fassent le job mieux et plus vite. Un jour, à l'occasion d'une installation ou d'une mise à jour d'un logiciel quelconque, l'ancienne DLL et remplacée par sa mise à jour et... plusieurs des applications qui utilisent cette DLL ne fonctionnent plus. Prenons un exemple : L'application 1 et l'application 2 se partageaient la même DLL. Un jour, l'application 1 est mise à jour et cette mise à jour comporte également la mise à jour de la DLL partagée avec l'application 2. Depuis ce jour, l'application 2, qui necessite l'ancienne version de la DLL, ne fonctionne plus ! C'est l'enfer (l'éditeur de l'application 2 n'existe plus ou se fiche complètement de cette vieille application qu'il n'a pas l'intention de mettre à jour, ou parle une langue que vous êtes incapable d'utiliser pour lui expliquer le problème, etc. ...) !

  2. Parce qu'un désinstalleur d'une application, ou une de ces innombrables applications imbéciles de nettoyage et accélération du Registre Windows (je promets, depuis des années, de mettre TOUTES ces applications, toutes menteuses, d'accélération de Windows par le nettoyage et la réorganisation du Registre Windows, dans la Crapthèque), a purement et simplement désinscrit la DLL, voire a carément détruit le fichier !
    Ne touchez jamais au Registre Windows !
    Ne touchez jamais au registre Windows.

    Le problème des "DLLs partagées" (Shared DLLs et compteur de partages)
    Lorsqu'une DLL est inscrite dans le Registre Windows avec une première application qui l'utilise, son inscription est affublée d'un compteur de partage mis à 1 (dans une valeur de type Dword dans le Registre Windows). Lorsqu'une nouvelle application est installée, utilisant la même DLL, celle-ci n'est pas ré-inscrite mais son compteur de partage augmente de +1. Lorsqu'une application est désinstallée, les compteurs des DLLs qu'elle partage avec d'autres applications sont diminués (-1). Lorsque ce compteur arrive à zéro, on estime que la DLL n'est plus utilisée par aucune application. En théorie, mais en théorie seulement, non seulement la DLL n'est plus partagée mais elle est devenue inutile. La DLL peut être désinscripte, et même détruite pour gagner de la place. Un de ces utilitaires inutiles (qui devraient être interdits), de nettoyage et prétendue accélération de Windows par la réorganisation du Registre Windows, va s'en apercevoir et va effectivement désinscrire la DLL et détruire son fichier, risquant d'anéantir le fonctionnement d'autres applications qui ne s'inscrivent pas dans le Registre Windows pour fonctionner ou n'inscrivent pas leurs utilisations de DLLs. En plus, pour une raison ou pour une autre (coupure de courant, plantage du système etc. ...), les compteurs de partage peuvent se retrouver à zéro de manière totalement erronée. Ne touchez pas aux DLLs et ne les détruisez jamais ! Ecoutez nos mises en garde et ne donnez pas raison au virus PEBCAK.
    Ne touchez jamais à votre Registre Windows !
    Ne touchez jamais à votre Registre Windows.

  3. Parce qu'une DLL peut exister sous plusieurs versions simultanées (et il n'y a pas que la notion de version 16 bits, 32 bits et 64 bits).

  4. Parce que l'éditeur du logiciel qui ne fonctionne plus a disparu et que le logiciel ne fonctionnera plus jamais. Si personne ne dispose des codes sources pour relancer une compilation et une édition des liens ("link edit"), avec les DLLs mises à jour, le logiciel est définitivement mort sauf à trouver les DLLs d'origine et à les copier dans le répertoire même où est installée l'application.

La protection de WinSxS – applications éligibles au compte TrustedInstallerLa protection de WinSxS – applications éligibles au compte TrustedInstallerLa protection de WinSxS – applications éligibles au compte TrustedInstaller

Un peu après WinSxS (à partir de Windows Server 2008) est apparu WRP (Windows Resource Protection) qui empêche tout remplacement des fichiers, répertoires et clés du Registre Windows essentiels au fonctionnement de Windows.

Les permissions totales d'accès pour modifier les ressources protégées par WRP (Windows Resource Protection) sont restreintes au compte utilisateur spécial appelé TrustedInstaller, qui a un contrôle total sur ces ressources
Les permissions totales d'accès pour modifier les ressources protégées par WRP (Windows Resource Protection)
sont restreintes au compte utilisateur spécial appelé TrustedInstaller, qui a un contrôle total sur ces ressources

Les permissions totales d'accès pour modifier les ressources protégées par WRP (Windows Resource Protection) sont restreintes au compte utilisateur spécial appelé TrustedInstaller, qui a un contrôle total sur ces ressources, et ces ressources ne peuvent être modifiées qu'en utilisant un mécanisme appelé " Supported Resource Replacement Mechanisms " applicable aux installations des :
  • Service packs Windows et Service Release installés sous le compte TrustedInstaller
  • HotFixex installés sous le compte TrustedInstaller
  • Upgrades installés sous le compte TrustedInstaller
  • Updates installés sous le compte TrustedInstaller
On remarquera que, aussi loin que l'on puisse chercher sur le site de Microsoft ou sur technet.com, il n'est jamais question de vider ou alléger WinSxS, ni d'effacer des DLLs ou des assemblages. C'est la contrepartie de toute la sécurité imposée autour des DLLs auxquelles, justement, il n'est pas question de toucher.