在 Windows 的核心进程库中,rundll32.exe 扮演着桥梁的角色:它能够在不启动完整可执行文件的前提下,直接调用存放于 DLL(动态链接库)中的导出函数,实现系统组件的即时加载与执行。
rundll32 的入口参数遵循 rundll32.exe <dll文件>,<入口函数> [<参数>...] 的格式。系统在解析后,会把指定的 DLL 装入进程地址空间,然后定位导出表中的函数入口,随后以标准的 WINAPI 调用约定执行该函数。由于它本身是一个轻量级的宿主进程(约 200KB),对资源占用几乎可以忽略不计。
rundll32.exe shell32.dll,Control_RunDLL desk.cpl 能直接打开“显示设置”。rundll32.exe netshell.dll,NetworkDiagnostics 可触发 Windows 网络故障排查向导。rundll32.exe printui.dll,PrintUIEntry 实现批量打印机管理。rundll32.exe cleanmgr.dll,LaunchDiskCleanup 调用系统自带的磁盘清理向导。因为 rundll32 能在任意 DLL 中执行代码,攻击者常利用它来隐藏恶意载荷。安全团队在日志审计时,重点关注以下两类异常:
C:UsersTempmalicious.dll)。RunMe、StartIt)。针对上述风险,建议开启进程创建审计策略,并在终端安全平台中加入基于路径和函数签名的白名单规则。
开发者若需验证自定义 DLL 的入口函数,可在命令行直接使用 rundll32 进行快速测试,省去写专门的包装 EXE。示例:
rundll32.exe MyLib.dll,MyExportedFunc "param1" "param2"
需要注意的是,导出函数必须采用 extern "C" __stdcall 约定,否则会导致调用栈错位,进程异常退出。
参与讨论
这一招常用来做小工具测试,开发时确实省事,注意 __stdcall 调用约定就行。
哪个安全日志能准确捕捉到非系统目录加载?有人贴过规则示例吗?
rundll32 用来临时调 DLL 真方便,但别随便在外面下载的 DLL 跑,风险太大了。
我之前遇到过被滥用的情况,日志里看到来自 Users\Temp 的 DLL 就怀疑了,果然不安全。
磁盘清理、打印机管理这些用法挺实用的,但企业环境下最好配合白名单和审计策略。