首页 网络安全 安全学院 查看内容

让DLL卸载自身

2009-5-26 12:17 740 0

摘要:   titilima.cn   今天的问题是:有没有可能让一个 DLL 自己卸载自己?   这个问题可以分成两个部分:   卸载一个 DLL。   卸载 DLL 的代码应该是放在 DLL 之中...
关键词: FreeLibrary DLL 句柄 指向 一个 模块 FreeLibraryAndEx 代码 C++ NULL

  titilima.cn   今天的问题是:有没有可能让一个 DLL 自己卸载自己?   这个问题可以分成两个部分:   卸载一个 DLL。   卸载 DLL 的代码应该是放在 DLL 之中的。   当然,如果不考虑后果的话,这个代码并不难写,如下:   C++代码   #include <Windows.h>   HMODULE g_hDll = NULL;   DWORD WINAPI UnloadProc(PVOID param)   {   MessageBox(NULL, TEXT("Press ok to unload me."),   TEXT("MsgBox in dll"), MB_OK);   FreeLibrary(g_hDll);   // oops!   return 0;   }   BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID lpvReserved)   {   if (DLL_PROCESS_ATTACH == fdwReason)   {   g_hDll = (HMODULE)hinstDLL;   HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL);   CloseHandle(hThread);   }   return TRUE;   }   简单说明一下:在 DllMain 初始化的时候保存 DLL 的实例句柄(即模块句柄)供 FreeLibrary 调用,然后开启一个线程,在适当的时机调用 FreeLibrary 销毁 DLL。   但是,如果实际运行起来的话,我们会遇到一个很实际的问题:在 FreeLibrary 之后,该 DLL 的地址空间就不再可用了,但这时 EIP 指针仍然会指向 FreeLibrary 的下面一句,于是程序崩溃。   所幸,Win32 提供了另外的一个 API——FreeLibraryAndExitThread,这个函数能够在销毁 DLL 之后直接调用 ExitThread,这样一来 EIP 指针就不会指向非法的地址了。因此,我们只需要把 FreeLibrary 的一句替换为:   C++代码   FreeLibraryAndExitThread(g_hDll, 0);   这样就可以了。   实际测试一下,在 DLL 被加载后,July 的模块视图显示了这个被加载的 DLL。   在内存视图中检查模块句柄指向的内容,证明该 DLL 的确被加载了。   FreeLibraryAndExitThread 调用后,再查看该模块句柄指向的内存,该地址已不再可用,销毁成功。  
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部