RunDll32 是如何工作的?

Posted

技术标签:

【中文标题】RunDll32 是如何工作的?【英文标题】:How does RunDll32 work? 【发布时间】:2012-01-02 16:45:09 【问题描述】:

RunDll32 究竟如何调用函数,而不知道函数可以接受的参数的数量/类型?

它有内置编译器或类似的东西吗?

【问题讨论】:

【参考方案1】:

它不能调用任何函数,它只能调用函数specifically written to be called。因此,没有魔法。

【讨论】:

User32.dll 中的 SwapMouseButton 是一个涉及“魔法”的函数示例。这种魔法在那个答案中得到了解释:***.com/a/30285986/832220 我刚刚发现 PowrProf.dll 中的 SetSuspendState 是这种魔法的另一个例子。只需尝试以下命令来演示这种魔法:rundll32.exe PowrProf.dll,SetSuspendState User32.dll 中的LockWorkStation 只是rundll32.exe 可调用函数的另一个示例。命令行为:rundll32.exe User32.dll,LockWorkStation 我的最后一个例子是 dwmapi.dll 中序数为 105 的函数。它调用 Flip 3D 功能。该函数的命令行是:rundll32.exe dwmapi.dll #105【参考方案2】:

RunDll32 几乎是一个瘦包装器,它调用 LoadLibrary 来加载给定的 DLL,调用 GetProcAddress 来获取所需函数的函数地址,然后调用该函数。

但它不能只调用 DLL 中的任何导出函数——它假定该函数具有以下非常特定的函数签名:

  void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);

其中CALLBACK 是一个扩展为__stdcall 调用约定的宏。有关更详细的说明,请参阅this knowledge base article。

如果您的 DLL 函数没有正确的签名或调用约定,就会出现很多问题。请参阅What can go wrong when you mismatch the calling convention? 了解许多血腥细节。幸运(或者不幸)RunDll32 is written in such a way to ameliorate those types of errors,但这并不意味着这是一个好主意。 不要使用 RunDll32 调用没有正确签名的函数。这只是一颗等待在下一版 Windows 中引爆的定时炸弹。

【讨论】:

以上是关于RunDll32 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中使用 rundll32.exe 删除文件?

如何使用 Rundll32 交换鼠标按钮?

如何使用 Rundll32 执行 DLL 函数?

电脑中毒了有3个rundll32进程

RUNDLL32的问题

Rundll32