DLL卸载自身

如果使用 FreeLibrary卸载自身DLL的话会出现一个问题,在 FreeLibrary 之后,该 DLL 的地址空间就不再可用了,但这时 EIP 指针仍然会指向 FreeLibrary 的下面一句,于是程序就会崩溃。所幸,Win32 提供了另外的一个 API——FreeLibraryAndExitThread,这个函数能够在销毁 DLL 之后直接调用 ExitThread,这样一来 EIP 指针就不会指向非法的地址了。

#include <Windows.h>   
  
HMODULE g_hDll = NULL;   
  
DWORD WINAPI UnloadProc(PVOID param)   
{   
    MessageBox(0,"test","test",0); 
    FreeLibraryAndExitThread(g_hDll,0);   
    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;   
}   

  


 

在 Windows 系统中,`rundll32.exe` 主要用于执行 DLL 文件中的函数,而非直接用于卸载软件。然而,通过调用特定的 DLL 函数,`rundll32.exe` 可以间接实现某些系统功能的控制,包括启动或关闭部分系统组件。但需要注意的是,常规意义上的软件卸载通常依赖于软件自身的卸载程序或系统提供的卸载接口,而不是通过 `rundll32.exe` 来完成[^1]。 尽管如此,在某些特定情况下,`rundll32.exe` 可以用于触发与系统组件或某些应用程序相关的功能。例如,它可以通过调用 `shell32.dll` 中的 `Control_RunDLL` 函数来打开“添加或删除程序”控制面板,从而引导用户进入软件卸载界面: ```shell rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl ``` 此命令会打开“程序和功能”窗口,用户可以在其中选择要卸载的程序并执行卸载操作。这种方式并不是直接通过 `rundll32.exe` 卸载软件,而是通过它启动了一个可以进行卸载操作的界面[^2]。 此外,`rundll32.exe` 也可以调用其他 DLL 中的函数来实现特定功能,但这些功能通常不涉及直接卸载软件。例如,调用 `user32.dll` 中的 `LockWorkStation` 函数可以锁定当前工作站: ```shell rundll32.exe user32.dll, LockWorkStation ``` 对于某些特定的系统组件或第三方软件,如果它们提供了可以通过 `rundll32.exe` 调用的卸载函数,则可以使用如下格式的命令: ```shell rundll32.exe <DLL文件路径>,<函数名> <参数> ``` 其中 `<DLL文件路径>` 是目标 DLL 的完整路径,`<函数名>` 是该 DLL 中定义的导出函数名称,`<参数>` 是传递给该函数的可选参数。需要注意的是,该函数必须符合 `rundll32.exe` 所要求的函数签名,即: ```c void CALLBACK FunctionName(HWND hwnd, HINSTANCE hinst, LPTSTR lpCmdLine, int nCmdShow); ``` 否则,`rundll32.exe` 将无法正确调用该函数,并可能显示错误信息。例如,如果某个 DLL 文件中定义了用于卸载的函数,并且该函数名为 `UninstallSoftware`,则可以使用如下命令: ```shell rundll32.exe C:\Path\To\Uninstall.dll,UninstallSoftware ``` 然而,这种情况较为少见,因为大多数软件卸载功能并不通过 DLL 函数暴露给 `rundll32.exe`。因此,若目标是卸载软件,更推荐使用控制面板中的“程序和功能”或命令行工具如 `msiexec` 来完成卸载操作[^4]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值