2017-02-14 13 views
1

Что произойдет, если я загружаю же .dll дважды или несколько раз с помощью:Что произойдет, если я использую LoadLibraryExW() для загрузки того же .dll twitce, когда включена ASLR?

handle = ::LoadLibraryExW(dllpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH) 

он вернется ли тот же адрес, когда ASLR (DYNAMICBASE) находится?

+0

Вы не можете загрузить DLL с тем же именем в память более одного раза. Таким образом, очевидная вещь случается, она просто увеличивает счетчик ссылок, и теперь для его разгрузки требуется два вызова FreeLibrary(). И вы получите тот же HMODULE. Который является базовым адресом DLL на win32 и win64, деталью реализации. –

ответ

1

Ничего иного, чем без ASLR. Второй вызов LoadLibraryEx возвращает тот же дескриптор, что и первый вызов, и количество использования DLL увеличивается.

Так что DLL не загружается «дважды». Загружается при первом вызове.

За исключением различного использования пути поиска поведение идентично LoadLibrary.

0

От MSDN,

Раздел: Замечания [третий пункт]

Если указанный модуль представляет собой DLL , который не загружен для процесса вызова, система вызывает DllMain в DLL, с значением DLL_PROCESS_ATTACH.

[11 Para]

Система поддерживает каждый процесс счетчик ссылок на все загруженные модули. Вызов LoadLibrary увеличивает счетчик ссылок. Вызов Функция FreeLibrary или FreeLibraryAndExitThread уменьшает счетчик ссылок . Система выгружает модуль, когда его счетчик ссылок достигает нуля или когда процесс завершается (независимо от номера ссылки ).

Если модуль уже загружен в память процесса, он просто вернет вам тот же дескриптор HMODULE с увеличенным счетчиком ссылок. Кроме того, он не будет вызывать DLL_PROCESS_ATTACH в последующих вызовах.