Как я могу контролировать порядок поиска для DLL, чтобы избежать угона? - PullRequest
2 голосов
/ 20 января 2020

В качестве фона: моему приложению требуются:

  • права администратора
  • доступ к библиотекам WinAPI
  • , возможность работы на всех ОС: Win7-Win10

Обычно, чтобы использовать API, я могу просто связать необходимые * .lib файлы. Однако он использует порядок поиска по умолчанию, то есть (согласно https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order) сначала загружает библиотеки DLL из «каталога, из которого загружено приложение». В результате, если DLL находится в том же каталоге, запуск моего приложения двойным щелчком мыши также загружает эту DLL. Я хочу искать библиотеки DLL только в системных каталогах (аналогично { ссылка }).

Я знаю, что могу попытаться создать какой-то прокси, например

    BOOL WinAPIFunction(WinAPIType param) {
  return reinterpret_cast<decltype(&WinAPIFunction)>(
    reinterpret_cast<void*>(GetProcAddress(manually_loaded_module, "WinAPIFunction")))(param);
}

Но трудно поддерживать все эти функции. Есть ли лучший способ заставить windows смотреть только в system32? Я думал о файле манифеста, но он требует версию для каждой библиотеки DLL, которая может нарушить требование «возможности» (версии DLL для Win7 и Win10 имеют разные версии)

Ответы [ 2 ]

1 голос
/ 21 января 2020

Решение опубликовано @Eryk Sun в комментарии выше.

Достаточно добавить все библиотеки DLL, не перечисленные в известных библиотеках, к загруженным библиотекам с задержкой и вызвать SetDefaultDllDirectories (LOAD_LIBRARY_SEARCH_SYSTEM32); в начале WinMain. Спасибо

0 голосов
/ 20 января 2020

Вы можете попробовать использовать функцию "Известные DLL": если Windows "знает", что DLL, Windows не ищет файл dll. Известная функция описана в ссылке, которую вы написали в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...