我有一个依赖于B.DLL的A.DLL,适用于应用程序的DLL搜索顺序也适用于DLL,我的意思是当加载A.DLL时它是如何搜索B.DLL的?如果DLL搜索顺序不适用于DLL,我应该在哪里保留B.DLL?我应该将它保存在A.DLL所在的当前目录中,还是应该使用表单环境路径
注意:我不能把B.DLL放到System32
任何建议都表示赞赏。
答案 0 :(得分:0)
同时适用于exe和dll的搜索顺序:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#standard-search-order-for-desktop-applications。无论安全模式如何,第一个始终是“应用程序加载目录”。在dll方面,根据我通过Process Monitor的发现,这取决于是通过LoadLibrary
静态链接还是动态加载dll。对于静态链接,这是dll的目录,而对于动态加载,这是exe的目录。
例如,当C:\App.exe
加载D:\A.dll
时(如您的示例所示,取决于B.dll
时,如果静态链接,Windows将在B.dll
中搜索D:\
,或者C:\
(如果已加载LoadLibrary
)。如果在此处找不到B.dll
,则它将继续搜索其他目录,例如System32。
搜索顺序的下一行是“当前目录”。许多加载外部模块的应用程序可能有SetDllDirectory("")
会在搜索中删除当前目录以便avoid dll preloading vulnerability。