9
votes

La DLL aura-t-elle toujours la même adresse de base?

J'étudie des choses sur Windows et DLL et j'ai une question à ce sujet. :)

J'ai fait un programme simple qui charge ma propre dll. Cette DLL n'a que des fonctions simples, plus, moins.

C'est la question: si je charge une DLL (par exemple, text.dll ), est-ce que cette DLL a toujours la même adresse de base? ou ça change quand je le redémarre? et puis-je tenir l'adresse de base de la DLL?

Lorsque je le teste, il a toujours la même adresse de base, mais je pense que lorsque je dois faire à ce sujet, je dois faire une exception à propos de l'adresse de base DLL.


0 commentaires

3 Réponses :


12
votes

Le système d'exploitation chargera votre DLL dans une adresse de base qu'elle plaît. Vous pouvez spécifier une adresse de base «préférée», mais si cela ne peut pas être disponible, (pour une raison quelconque, ce qui pourrait bien être complètement hors de votre contrôle), votre DLL sera déplacée par le système d'exploitation à l'adresse de l'exploitation. système voit l'ajustement.


3 commentaires

ASLR tentera activement de mettre des DLL à différents endroits.


De plus, les versions modernes de Windows utilisent un schéma (ASLR) où des DLL sont mappées sur des adresses «aléatoires» dans un effort pour effectuer des défauts de sécurité exploitant les attaques basées sur «retour aux Libc».


Bukes, c'est opt-in, cependant. Et beaucoup de gens oublient de l'activer.



5
votes

i chargez une dll (par exemple, texte.dll), cette DLL a-t-elle toujours la même adresse de base?

Non. C'est une adresse de base préférée . Si quelque chose est déjà chargé à cette adresse, le chargeur la rebaissez et fixez toutes les adresses.

Autres choses, comme Adresse Space Disposition Randomisation pourrait le faire différer chaque fois le processus commence.


1 commentaires

+1 - Il est impossible de garantir une adresse fixe, mais vous pouvez en demander une via la technique sur blogs.msdn.com/b/winsdk/archive/2009/11/30/...



0
votes

C'est un problème courant avec les DLL que nous avons rencontrés lors de la tentative de décodage des structures de pile émises par GNAT Runtime (ADA).

Lorsque vous avez présenté une liste d'adresses (Traceback) lorsque nos exécutables se bloquent, nous sommes en mesure d'exécuter addr2line sur les adresses données et de reconstruire l'arborescence d'appel sans problèmes.

sur les DLL, ce n'est pas le cas (c'est pourquoi je doute fort que ce problème soit associé à ASLR, sinon les exécutables auraient le même changement aléatoire), VCSJONES Réponse explique le" pourquoi ".

Maintenant pour contourner ce problème, vous pouvez écrire l'adresse d'un symbole donné (exemple: le programme principal ) sur le disque. Lors de l'analyse d'un crash, effectuez simplement une différence entre l'adresse du symbole dans la carte MapFile et l'adresse écrite sur le disque. Appliquez cette différence à vos adresses et vous pourrez calculer les adresses théoriques, donc la pile d'appels.


0 commentaires