【问题标题】:What would happen if I use LoadLibraryExW() to load same .dll twitce when ASLR is on?如果我在 ASLR 开启时使用 LoadLibraryExW() 加载相同的 .dll 会发生什么?
【发布时间】:2017-07-02 08:42:50
【问题描述】:

如果我使用以下方法加载相同的 .dll 两次或更多次会发生什么:

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

ASLR(DYNAMICBASE) 开启时是否返回相同的地址?

【问题讨论】:

  • 您不能多次将同名的 DLL 加载到内存中。所以很明显的事情发生了,它只是增加了引用计数,现在需要两次调用 FreeLibrary() 才能再次卸载它。你会得到相同的 HMODULE。恰好是win32和win64上DLL的基地址,实现细节。

标签: visual-studio winapi visual-c++ dll


【解决方案1】:

与没有 ASLR 没有什么不同。第二次 LoadLibraryEx 调用将返回与第一次调用相同的句柄,并且 DLL 的使用计数增加。

因此,DLL 不会“两次”加载。 Is 在第一次调用时加载。

除了搜索路径的不同用途外,其他行为与 LoadLibrary 相同。

【讨论】:

    【解决方案2】:

    来自MSDN,

    部分:备注 [第 3 段]

    如果指定的模块是一个尚未加载的 DLL 调用进程,系统调用DLL的DllMain函数 DLL_PROCESS_ATTACH 值。

    [第 11 段]

    系统对所有加载的进程维护一个每个进程的引用计数 模块。调用 LoadLibrary 会增加引用计数。 调用 FreeLibrary 或 FreeLibraryAndExitThread 函数递减 参考计数。系统在其引用计数时卸载模块 达到零或进程终止时(无论 引用计数)。

    如果模块已经加载到进程内存中,它只会返回相同的HMODULE句柄,并增加引用计数。此外,它不会在后续调用中调用DLL_PROCESS_ATTACH。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2018-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      相关资源
      最近更新 更多