第2章 cmd命令基础:执行动态链接库(rundll32)
Hi~ 我是李小咖,主要从事网络安全技术开发和研究。
本文取自《李小咖·网安技术库》,欢迎一起交流学习🫡:https://imbyter.com
rundll32命令是一个Windows命令行实用程序,用于运行动态链接库(DLL)文件,就像它们是可执行文件一样。这对于管理和配置Windows组件,启动应用程序以及执行系统维护等各种任务非常有用。
一、语法
rundll32命令的语法如下:
rundll32.exe <dllname>,<entrypoint> <可选参数>
-
dllname
:包含要执行的函数的DLL文件的名称。可以是完整路径或位于Windows系统目录中的文件名。 -
entrypoint
:要在DLL文件中执行的函数的名称。可以是数值或序数值,也可以是用引号括起来的字符串值。注意:如果是自己编写的函数,需要按照固定的格式编写,见下文。 -
optional arguments
:DLL文件中的函数所需的任何参数。
二、执行系统自带功能
使用rundll32能够执行系统自带的一些功能,比如下面的命令能够快速打开指定的网站:
rundll32 url.dll,FileProtocolHandler https://bing.com
-
url.dll
:系统自带的dll文件; -
FileProtocolHandler
:url.dll中的函数; -
https://bing.com
:传给函数FileProtocolHandler的参数。
如下命令可以快速打开“控制面板”:
runDll32.exe shell32.dll,Control_RunDLL
如下命令可锁定主机:
rundll32 user32.dll,LockWorkStation
通过rundll32命令还能对指定进程的内存进行dump:
rundll32.exe comsvcs.dll, MiniDump 14840 memory.dmp full
-
其中
14840
是目标进程PID,可根据需要自行修改。
如下命令可用来启动应用程序(比如记事本):
rundll32.exe pcwutl.dll,LaunchApplication C:\Windows\System32\notepad.exe
其他可用的命令:
命令 | 含义 |
Rundll32.exe shell32.dll,Control_RunDLL | 显示控制面板 |
RunDll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,0 | 添加删除程序 |
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 | 删除IE浏览器等上网浏览历史 |
RunDll32.exe shell32.dll,Control_RunDLL timedate.cpl | 调整日期和时间 |
RunDll32.exe shell32.dll,Control_RunDLL access.cpl,3 | 轻松使用设置中心 |
RunDll32.exe devmgr.dll DeviceManager_Execute | 设备管理器 |
RunDll32.exe shell32.dll,Options_RunDLL 0 | 文件夹选项 - 常规 |
RunDll32.exe shell32.dll,Options_RunDLL 2 | 文件夹选项 - 搜索设置 |
RunDll32.exe shell32.dll,Options_RunDLL 7 | 文件夹选项 - 查看 |
RunDll32.exe keymgr.dll,PRShowSaveWizardExW | 忘记密码向导 |
RunDll32.exe powrprof.dll,SetSuspendState | 立即进入休眠状态 |
RunDll32.exe shell32.dll,Control_RunDLL main.cpl @1 | 键盘设置 |
Rundll32 User32.dll,SwapMouseButton | 鼠标切换左右键 |
Rundll32 Shell32.dll,Control_RunDLL main.cpl @0,0 | 鼠标设置 |
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL Connect | 映射网络驱动器 |
RunDll32.exe shell32.dll,Control_RunDLL ncpa.cpl | 网络连接 |
Rundll32.exe shdocvw.dll,DoOrganizeFavDlg | 管理IE收藏夹 |
Rundll32 Shell32.dll,OpenAs_RunDLL 文件名 | 直接打开某文件的对话框 |
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder | 打印机管理 |
RunDll32.exe Shell32.dll,Control_RunDLL powercfg.cpl | 电源设置 |
Rundll32 Shell32.dll,Control_RunDLL Intl.cpl,,0 | 地区和语言设置 |
RunDll32.exe keymgr.dll,KRShowKeyMgr | 系统保存的密码管理 |
Rundll32 Shell32.dll,Control_RunDLL HotPlug.dll | 安全移除硬件对话框 |
Rundll32 Shell32.dll,Control_RunDLL Sysdm.cpl,,3 | 系统属性对话框 |
Rundll32 Shell32.dll,Control_RunDLL Mmsys.cpl,,0 | 系统声音设置 |
RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,4 | 系统属性 - 系统保护 |
RunDll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,5 | 系统属性 - 远程 |
RunDll32.exe shell32.dll,Options_RunDLL 1 | 任务栏属性 |
RunDll32.exe shell32.dll,Control_RunDLL nusrmgr.cpl | 用户帐户管理 |
RunDll32.exe shell32.dll,Control_RunDLL wscui.cpl | 控制面板 - 安全和维护 |
RunDll32.exe SHELL32.DLL,ShellAboutW | Windows - 关于 |
Rundll32 Shell32.dll,SHHelpShortcuts_RunDLL FontsFolder | Windows 字体安装文件夹 |
RunDll32.exe shell32.dll,Control_RunDLL firewall.cpl | Windows防火墙 |
Rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2 | 控制面板 - Windows功能 |
Rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3 | 应用 - 默认应用 |
Rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1 | 屏幕保护设置 |
三、执行自写DLL功能
使用rundll32可以执行我们自己编写的dll文件,但dll中的导出函数要遵循如下规则编写:
void CALLBACK EntryPoint( HWND hwnd, // handle to owner windowHINSTANCE hinst, // instance handle for the DLL LPTSTR lpCmdLine, // string the DLL will parse int nCmdShow // show state
);
-
EntryPoint
:导出函数名,可以任意指定; -
hinst
:dll的句柄文件; -
lpCmdLine
:传入dll的参数; -
nCmdShow
:窗口显示方式。
如下示例是一个标准的rundll32支持运行的dll模板:
#include "pch.h"
#include <windows.h>extern "C" __declspec(dllexport) void test1(HWND hwnd, // handle to owner window HINSTANCE hinst, // instance handle for the DLL LPSTR lpCmdLine, // string the DLL will parse int nCmdShow // show state
)
{if (strlen(lpCmdLine) != 0){MessageBoxA(hwnd, lpCmdLine, "测试", MB_OK | MB_ICONINFORMATION);}else{MessageBoxA(NULL, "这是默认弹框内容", "测试", MB_OK | MB_ICONINFORMATION);}
}BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
上述程序支持用rundll32执行,当传入参数时,弹框显示传入的参数。当没传入参数时,弹框显示“测试”。
用如下方式调用执行:
E:\>rundll32.exe demo.dll,test1 "测试传入的参数"
执行效果:
参考链接:
-
rundll32 | Microsoft Learn