为了避免dll预加载,我尝试使用MSDN中提到的SetDllDirectory("")
来从搜索路径中删除当前目录。
要添加到搜索路径的目录。如果此参数是 空字符串(“”),该调用从中删除当前目录 默认的DLL搜索顺序。如果此参数为NULL,则为该函数 恢复默认搜索顺序。
令人惊讶的是它没有用。如果dll存在,我可以看到dll仍然从当前目录加载。我也厌倦了将dll目录路径设置为系统32路径,但它仍然从当前目录中选择dll。最后,我决定在我的应用程序中加载所有模块并重新加载它们。我的代码看起来像这样,
if(wcsstr(szModName,L"TestLibrary.dll"))
{
FreeLibrary(hMods[i]);
LoadLibrary("SomeRelavantPath\TestLibrary.dll");
}
您认为我的代码有任何问题吗?
@Edit: 我的完整POC代码,
int main( void )
{
SetDllDirectory(L"");
LPWSTR s = new WCHAR[100];
GetDllDirectory(100,s);
HINSTANCE myDLL = LoadLibrary(L"TestLibrary.dll");
//myDLL returns non-null, there is file in current dir and not at any other location, it should have return null.
return 0;
}
答案 0 :(得分:0)
从安全角度来看,从新路径再次卸载和加载是没有意义的,已经太晚了,因为邪恶的.dll可以在其DllMain中执行代码!
best solution将直接链接到尽可能少的DLL,并在WinMain函数中的其他任何内容之前调用SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)
。
答案 1 :(得分:0)
如果字符串指定了完整路径,则该函数仅搜索该模块的路径。
如果字符串指定了相对路径或没有路径的模块名称,则该函数使用标准搜索策略来查找模块;有关更多信息,请参阅备注。
来自LoadLibrary function @ MSDN。
拨打SetDllDirectory
对完整路径无效。