DLL 自动卸载自身

有没有可能让一个 DLL 自己卸载自己?

这个问题可以分成两个部分:

  1. 卸载一个 DLL。
  2. 卸载 DLL 的代码应该是放在 DLL之中的。

当然,如果不考虑后果的话,这个代码并不难写,如下:

view plaincopy to clipboardprint?

  1. #include <Windows.h>
  2. HMODULE g_hDll = NULL;  
  3. DWORD WINAPI UnloadProc(PVOID param)  
  4. {  
  5.     MessageBox(NULL, TEXT("Press ok to unload me."),  
  6.         TEXT("MsgBox in dll"), MB_OK);  
  7.     FreeLibrary(g_hDll);  
  8.     // oops!
  9.     return 0;  
  10. }  
  11. BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID lpvReserved)  
  12. {  
  13.     if (DLL_PROCESS_ATTACH == fdwReason)  
  14.     {  
  15.         g_hDll = (HMODULE)hinstDLL;  
  16.         HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL);  
  17.         CloseHandle(hThread);  
  18.     }  
  19.     return TRUE;  
  20. }  

简单说明一下:在 DllMain 初始化的时候保存 DLL 的实例句柄(即模块句柄)供 FreeLibrary 调用,然后开启一个线程,在适当的时机调用 FreeLibrary 销毁 DLL。

但是,如果实际运行起来的话,我们会遇到一个很实际的问题:在 FreeLibrary 之后,该 DLL 的地址空间就不再可用了,但这时 EIP 指针仍然会指向 FreeLibrary 的下面一句,于是程序崩溃。

所幸,Win32 提供了另外的一个 API——FreeLibraryAndExitThread,这个函数能够在销毁 DLL 之后直接调用 ExitThread,这样一来 EIP 指针就不会指向非法的地址了。因此,我们只需要把 FreeLibrary 的一句替换为:

  1. FreeLibraryAndExitThread(g_hDll, 0); 

FreeLibraryAndExitThread(g_hDll, 0);
这样就可以了。 


转自:http://maker316.wordpress.com/2010/08/16/dll-自动卸载自身转载/?

你可能感兴趣的:(DLL 自动卸载自身)