代码之家  ›  专栏  ›  技术社区  ›  Martin Ba

在Windows上放置不安全DLL清理代码的安全位置?

  •  1
  • Martin Ba  · 技术社区  · 7 年前

    我们遇到了这样一个情况,即对我们来说 FreeLibrary DllMain / DLL_PROCESS_DETACH .

    must not do that :

    从DllMain调用FreeLibrary是不安全的。

    (unknown client dll or exe) links dynamically or statically to -> 
          -> DLL_1, loads dynamically -> DLL_x
    

    DLL\u 1应该透明地加载DLL\u x到它的客户端代码,并且应该动态加载DLL\u x。现在,加载可以惰性地完成,因此 LoadLibrary 呼叫不需要驻留在 DLL_PROCESS_ATTACH DLL_1的一部分。

    有没有办法在没有明确说明的情况下做到这一点 DLL_1/Uninitialize 必须由客户端调用的函数?

    我会注意到:

    • DllMain公司
    • 在kernel32/ntdll或共享MS-CRT中是否有其他回调机制来实现这一点?
    1 回复  |  直到 7 年前
        1
  •  1
  •   Harry Johnston    7 年前

    然而,如果你不能做到这一点,你可以通过启动一个助手线程来为你卸载来解决这个问题。如果您想安全起见,请在加载DLL\u x的同时启动线程,并让它等待事件对象。(不过,根据记录,通常认为从 DllMain 只要你尊重它直到 DllMain公司

    显然,助手线程的代码不能在DLL\u 1中。如果您可以修改DLL\u x,您可以将其放在那里。如果没有,您将需要一个助手DLL。在任何一种情况下,包含辅助线程代码的DLL都可以使用 FreeLibraryAndExitThread