Member 13209861 Ответов: 1

Избегайте уязвимости предварительной загрузки 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."

Возможно, текущий каталог - это один из каталогов из порядка поиска (например, каталог, из которого загружается приложение).

1 Ответов

Рейтинг:
2

KarstenK

Вы можете использовать функцию задержки загрузки Microsoft. Вот статья об этом Задержка загрузки DLL.

И вы не измените это поведение Windows, но вы можете переместить dll в другой каталог или подкаталог, чтобы избежать предварительной загрузки. Это требует, чем на самом деле некоторая загрузка dll.

Но что такое реальная проблема с вашей библиотекой dll. Может быть, какая-то реализация в вашей библиотеке dll пропущена.