如何使用Rundll32执行DLL函数?

mik*_*ike 28 rundll32

使用ShellExecute文档作为参考:

我从命令行运行以下命令:

C:\>RUNDLL32.EXE SHELL32.DLL,ShellExecute handle,"open","C:\Documents and Settings\admin\Desktop\tmp",NULL,NULL,SW_SHOWNORMAL
Run Code Online (Sandbox Code Playgroud)

这会导致异常错误.

我不知道这意味着什么:

HINSTANCE ShellExecute(
  __in_opt  HWND hwnd,
  __in_opt  LPCTSTR lpOperation,
  __in      LPCTSTR lpFile,
  __in_opt  LPCTSTR lpParameters,
  __in_opt  LPCTSTR lpDirectory,
  __in      INT nShowCmd
);
Run Code Online (Sandbox Code Playgroud)

但是在描述中,提到了句柄(HWND)和指向以空字符结尾的字符串(LPCTSTR)的指针,但它非常混乱.

任何帮助将不胜感激.我还想了解更多,所以任何参考(书籍,网络链接等)也会很棒!

Mic*_*ael 26

Rundll32仅支持使用以下签名运行DLL导出:

void CALLBACK
  EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Run Code Online (Sandbox Code Playgroud)

它不支持运行任意入口点.由于ShellExecute没有该签名,因此显然会发生不好的事情.

信息:Windows Rundll和Rundll32接口在rundll32接口上有更多信息.

如果要从命令行执行等效的ShellExecute,只需使用start:

C:\>start "C:\Documents and Settings\admin\Desktop\tmp"
Run Code Online (Sandbox Code Playgroud)

  • 你不应该用随机函数调用Rundll32.要么记录您可以使用Rundll32(用于安装,InstallHinfSection),或者您提供导出自己. (5认同)
  • 如果您只有 extern "C" void Example(),它很可能是 __cdecl(调用者清理堆栈的默认调用约定)。CALLBACK 是 __stdcall 调用约定,在此被调用者清理堆栈。您的函数将忽略 4 个参数,这很好,但它不会清理堆栈,这意味着堆栈在返回时会被破坏,可能会导致 rundll32 进程崩溃。 (3认同)
  • 如果你很勇敢,你可以调用其他函数——它们将接受这 4 个参数(通过 cdecl 调用约定)。对于某些无参数函数或其他仅接受一两个无意义句柄作为参数的函数,这是可能的。您还可以轻松编写自己的 DLL,入口点(=dll 导出)遵循此签名,并使用 rundll32 调用它们。WinAPI 中的函数记录在 MSDN 中。你会看到很少能直接用 rundll32 ... (2认同)