RunDll32是如何工作的?

11

RunDll32如何调用函数,却不知道函数可以接收的参数数量及类型?

它是否有内置编译器或类似工具?

2个回答

15

RunDll32实际上是一个薄包装,它调用LoadLibrary来加载给定的DLL,调用GetProcAddress来获取所需函数的函数地址,然后调用该函数。

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

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

其中CALLBACK是一个宏,扩展为__stdcall调用约定。详情请参见这篇知识库文章

如果你的DLL函数没有正确的签名或调用约定,将会产生许多问题。请参见当你不匹配调用约定时会出现哪些问题?获取更多详细信息。幸运的是(或者也许不幸的是),RunDll32的编写方式使这些类型的错误得到缓解,但这仍然意味着这是一个不好的主意。不要使用RunDll32来调用没有正确签名的函数。这只是一个时限炸弹,等待在下一版Windows中爆炸。


3

SwapMouseButton是User32.dll中的一个函数示例,其中涉及到“魔法”。这种魔法在以下答案中得到了解释:https://dev59.com/Q1PTa4cB1Zd3GeqPl7_T#30285986。 - Norbert Willhelm
我刚刚发现 PowrProf.dll 中的 SetSuspendState 是这种神奇的另一个例子。只需尝试以下命令即可演示此类魔法:rundll32.exe PowrProf.dll,SetSuspendState。 - Norbert Willhelm
LockWorkStation在User32.dll中是可由rundll32.exe调用的函数之一。命令行为:rundll32.exe User32.dll,LockWorkStation。 - Norbert Willhelm
我的最后一个例子是在dwmapi.dll中具有序数105的函数。它调用Flip 3D功能。该函数的命令行为:rundll32.exe dwmapi.dll #105 - Norbert Willhelm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接