如果我使用以下方法加载相同的.dll两次或更多次会发生什么:
handle = ::LoadLibraryExW(dllpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH)
当ASLR(DYNAMICBASE)打开时,它是否返回相同的地址?
答案 0 :(得分:1)
没有ASLR没什么不同。第二个LoadLibraryEx调用将返回与第一个调用相同的句柄,并且DLL的使用计数递增。
因此DLL未加载“两次”。是在第一次通话时加载。
除了搜索路径的不同使用外,行为与LoadLibrary相同。
答案 1 :(得分:0)
来自MSDN,
部分:备注[第三段]
如果指定的模块是尚未加载的 在调用进程中,系统调用DLL的DllMain函数 DLL_PROCESS_ATTACH值。
[第11段]
系统维护所有已加载的每进程引用计数 模块。调用LoadLibrary会增加引用计数。调用 FreeLibrary或FreeLibraryAndExitThread函数递减 引用计数。系统在引用计数时卸载模块 达到零或过程终止时(无论如何) 参考计数)。
如果模块已经加载到进程内存中,它将返回相同的HMODULE
句柄,并增加引用计数。此外,它不会在后续调用中调用DLL_PROCESS_ATTACH
。