Избегайте уязвимости предварительной загрузки DLL путем перезагрузки DLL, есть ли лучший способ?
Чтобы избежать предварительной загрузки dll, я попытался использовать SetDllDirectory (""), как это упоминается в MSDN, чтобы удалить текущий каталог из пути поиска.
Каталог, который будет добавлен в путь поиска. Если этот параметр является пустой строкой ( "" ), вызов удаляет текущий каталог из порядка поиска DLL по умолчанию. Если этот параметр равен нулю, функция восстанавливает порядок поиска по умолчанию.
Удивительно, но это не сработало. Я вижу, что библиотеки DLL все еще загружаются из текущего каталога, если там присутствует dll. Я также устал устанавливать путь к каталогу dll как путь к системе 32, но все равно он выбирает dll из текущего каталога. Наконец я решаю загрузить все модули в свое приложение и перезагрузить их снова. Мой код выглядит так,
if(wcsstr(szModName,L"TestLibrary.dll")) { FreeLibrary(hMods[i]); LoadLibrary("SomeRelavantPath\TestLibrary.dll"); }
Видите ли вы какие-либо проблемы с моим кодом?
Что я уже пробовал:
Мой полный код КЦ ,
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; }
Jochen Arndt
"Я вижу, что библиотеки DLL все еще загружаются из текущего каталога, если там присутствует dll."
Возможно, текущий каталог - это один из каталогов из порядка поиска (например, каталог, из которого загружается приложение).