【系统工具】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

  1. 打开命令提示符
    在Windows操作系统中,可以通过按下Win+R键打开运行窗口,然后输入cmd命令来打开命令提示符。
  1. 在命令提示符中输入以下命令:
    rundll32.exe shell32.dll,Control_RunDLL

函数调用格式:rundll32.exe [dll文件名],[函数名] [Arguments]
其中,[dll文件名]是需要加载的DLL文件的文件名,[函数名]是需要调用的函数的名称, [Arguments]是参数,一个字符串。

  1. 输入完命令后,按下回车键即可运行命令。如果命令执行成功,会弹出相应的对话框或者执行相应的操作。
  1. 最终效果如下图:
    在这里插入图片描述

使用方法 - 运行窗口/任务管理器/资源管理器

上小节中,我们使用了cmd方式,但是当我们执行直接带窗口的对话框时,会发现执行命令后,没有任何反应。比如MessageBoxA函数。
完整命令为:rundll32.exe user32.dll,MessageBoxA kkk,111,0,0

【原因】
这是因为,cmd窗口中,没有加载窗口相关的内核资源等,MessageBoxA运行依赖于窗口,所以没有反应。(Win11系统测试效果)

【解决方案】
我们通过带窗口的进程运行rundll32.exe即可解决。
具体操作如下面的三种方式:

  1. 运行窗口(系统快捷键Win+R
    在这里插入图片描述
  2. 任务管理器 > 运行新任务
    在这里插入图片描述
    在这里插入图片描述
  3. 资源管理器
    资源管理器的路径栏中输入命令并执行回车。
    在这里插入图片描述

2️⃣ 常见应用场景

运行js或vbs的脚本代码

rundll32 javascript:"\..\mshtml,RunHTMLApplication ";window.execScript("msgbox('a')","vbs");window.close()
运行窗口中执行上面命令,程序执行下面操作

  • 弹出对话框。(msgbox)
  • 显示窗口3。
  • 关闭窗口3。(window.close())
    在这里插入图片描述

执行命令绕过杀毒软件的作法?

执行url.dll的OpenURLFileProtocolHandler函数。
这是经过反汇编分析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️⃣ 原理及使用

原理

    1. 通过LoadLibraryEx加载该DLL,此时会调用DllMain,且第二参数是DLL_PROCESS_ATTACH。
    1. 通过GetProcAddress获得指定的导出函数地址。
    1. 1 函数地址存在,传参并调用函数。
    1. 2 函数地址不存在,通过LoadStringW获得资源ID为400的字符串(“%s 出错\n丢失条目: %s”);然后格式化弹窗字符串
      在这里插入图片描述
    1. 点击确定后rundll32会通过FreeLibrary卸载该DLL。
    1. 最后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调用,执行相关功能。

📖 参考资料

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

用法: rundll32 printui.dll,PrintUIEntry [options] [@commandfile] /a[file] 二进制文件名 /b[name] 基本打印机名 /c[name] 如果操作在远程机器上,unc 机器名 /dl 删除本地打印机 /dn 删除网络打印机连接 /dd 删除打印机驱动程序 /e 显示打印首选项 /f[file] inf 文件或输出文件 /ga 添加每个机器打印机连接 /ge 枚举每个机器打印机连接 /gd 删除每个机器打印机连接 /h[arch] 下列驱动程序体系结构之一,Alpha | Intel | IA64 | x64 /ia 用 inf 文件安装打印机驱动程序 /id 用添加打印机驱动程序向导安装打印机驱动程序 /if 用 inf 文件安装打印机 /ii 用带 inf 文件的添加打印机向导安装打印机 /il 用添加打印机向导安装打印机 /in 添加网络打印机连接 /j[provider] 打印提供程序名称 /k 将测试页打印到指定的打印机,不能安装打印机时的命令组合 /l[path] 打印机驱动程序源路径 /m[model] 打印机驱动程序型号名 /n[name] 打印机名 /o 显示打印机队列查看 /p 显示打印机属性 /q 安静模式,不显示错误信息 /r[port] 端口名 /s 显示服务器属性 /Ss 将打印机设置存到一个文件 /Sr 从一个文件还原打印机设置 储存或还原必须放在命令结尾的打印机设置选项标志: 2 PRINTER_INFO_2 7 PRINTER_INFO_7 c 颜色配置文件 d 打印机数据 s 安全描述符 g 全局 DevMode m 最低设置 u 用户 DevMode r 解决名称冲突 f 强制使用名称 p 解析端口 /u 如果已安装,则使用现有的打印机驱动程序 /t[#] 起始的以零为基础的索引页 /v[version] 驱动程序版本属于下列的一个: Windows 95、98 和 ME | Windows NT 4.0 | Windows NT 4.0 或 2000 | Windows 2000 或 XP| Windows XP /w 如果指定的驱动程序不在 inf ,则提示用户 /y 将打印机设为默认打印机 /Xg 获得打印机设置 /Xs 设定打印机设置 /z 不要自动共享这台打印机 /Z 不要自动生成打印机名 /K 更改 /v 和 /h 的意义来将 Windows x64 和 Windows IA64 | Windows NT x86 | Windows NT Alpha_AXP | Windows 4.0 分别接受为 0、1、2、3 /Z 共享这台打印机,只能跟 /if 选项一起使用 /? 帮助信息 @[file] 命令行参数文件 /Mw[message] 确认命令之前显示警告消息 /Mq[message] 确认命令之前显示确认消息 /W[flags] 指定向导(APW 和 APDW)的标志和切换 r 使向导可以从上一页重新启动 /G[flags] 指定全局标志和切换 w 抑制安装程序驱动程序警告 UI (超级静声模式) 例如: 运行服务器属性: rundll32 printui .dll ,PrintUIEntry /s /t1 /n\\machine 运行打印机属性: rundll32 printui .dll ,PrintUIEntry /p /n\\machine\printer 在本地运行添加打印机向导: rundll32 printui .dll ,PrintUIEntry /il 在 \\machine: rundll32 printui .dll ,PrintUIEntry /il /c\\Machine 运行添加打印机向导 运行队列查看: rundll32 printui .dll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值