Je voudrais empêcher le chargement de DLL malveillantes pouvant être possible grâce à l'accès du répertoire de travail actuel comme décrit dans http://msdn.microsoft.com/en-us/library/ff919712 (vs.85) .aspx p>
La solution implémentée dans nos applications C ++ consistait à effectuer un appel WinapI à SetDllDirectory (""), ce qui supprimerait effectivement le répertoire de travail actuel du chemin de recherche de téléchargement Windows DLL. Cependant, il semble que cette solution ne soit pas disponible pour nos applications Delphes, car la fonction SETDLLLDIRECTORY () n'existe pas. P>
Y a-t-il un appel équivalent à Delphi qui fait la même chose que SetdllDirectory ("")? Merci! P>
3 Réponses :
appeler SetdllDirectory ('') ne fonctionne pas? Je vois que cela est déclaré correctement dans les dernières versions de Windows.Pas. Si vous avez une version de Delphi dans laquelle il n'est pas déclaré, vous pouvez passer à la dernière version de DELPHI, ou déclarez-la vous-même. P>
Cela devrait faire l'astuce:
N'oubliez pas que vous êtes statique à la fonction, l'application nécessitera donc au moins XP SP1. Si vous devez exécuter des versions plus anciennes, vous devez également charger de manière dynamique la fonction via GetProcAddress ().
Dans une fonction de version Delphi pré-unicode Setdllldrectory (LPPathName: Pansichal): Bool; stdcall; Nom 'kernel32.dll externe' setdllldrectorya '; peut être utilisé aussi bien.
@Remy: Techniquement correct, mais s'ils utilisaient SetdlllDirectory dans leurs applications C ++ avant, je suppose que ce ne serait pas un problème.
@Brian Votre édition est fausse, Boolean n'est pas la même chose qu'un bool. Vous pouvez également utiliser Bool à Tokyo, votre problème est autre chose.
Bool ne compile que si vous avez inclus l'unité Windows. Boolean compile si vous avez inclus Windows ou non. Peut-être éditer l'extrait de code fourni ci-dessus pour ajouter les utilisations requises de l'unité Windows ou rétablir la modification qui a Booléen au lieu de Bool.
@Brian - Non, vous ne pouvez pas rétablir le changement qui a booléen parce que c'est faux. De plus, "utilise Windows" est trop trivial pour faire dans une édition. De plus, vous pouvez utiliser Longbool ou déclarer BOOL comme alias, si vous ne voulez pas utiliser "Windows".
S'il vous plaît expliquer pourquoi i> est-il faux plutôt que de simplement dire "c'est faux". Vous ne pouvez pas nier que l'extrait de code tel que fourni ne compilera pas i>
@Brian, pour un appel d'API, vous devez utiliser la signature exacte car la fonction est exportée, mais les tailles des deux types de données (Boolean vs. Bool) sont différentes, veuillez consulter la documentation pour plus de détails. De plus, des valeurs ordinales qui représentent VRAI / FAUX ne sont pas non plus identiques, mais la plupart des temps qui ne posent pas de problème.
Merci pour votre patience et votre réponse détaillée.
uses DSiWin32;
if not DSiSetDllDirectory('path') then
....
DSiSetDllDirectory will also take care of dynamic linking and will fail gracefully on pre-XP SP1 systems.DSiWin32 is released as a freeware.
Si vous souhaitez utiliser une fonction dans l'API Windows (c'est-à-dire une fonction dans Windows B>, qui ressemble au même dans n'importe quelle langue) qui n'est pas déclarée dans
windows.pas code> , il est généralement vraiment facile de le déclarer vous-même. Tout ce dont vous avez besoin est l'information du MSDN, où les types de données de l'argument et le résultat sont spécifiés, de même que la DLL à regarder dans. Dans la plupart des cas, les types utilisés là-bas peuvent également être utilisés même dans Delphi (tels que Hbrush , HWND, etc.), ou vous pouvez utiliser un type équivalent (tel quecardinal code> outhwnd code>). N'oubliez pas de définir la convention d'appel surstdcall code>.