我正在搜索为什么rundll32.exe进程在我的系统上运行,当我发现它充当容器以将dll作为应用程序/exe运行的信息时。我无法理解我希望将 dll 作为应用程序运行的原因/用例。库不只是为了提供功能支持而不是作为单独的应用程序运行吗?
2 回答
rundll32 并不意味着一般“运行 dll”(实际上没有任何意义,dll 没有单个入口点,“经典”dll 没有足够的元信息来正确调用任何导出的符号)。
相反,它允许使用符合某些定义明确的规范的 dll 来充当具有多个入口点的可执行文件;我认为这个想法要么是允许将具有许多共享代码的多个小型实用程序合并到一个二进制文件中,和/或为主要用于其他应用程序使用的库提供额外的“测试”入口点(手动调用)。
rundll 所做的实际上是将 dll 加载到内存中并调用指定的函数,期望它必须具有与 exe 入口点相同的签名。
相关知识库文章中提供了更多信息。
这个EXE可以加载任何DLL并获取指定函数的地址,并调用它。这避免了编写 EXE 只是为了调用特定 DLL 上的函数的需要(前提是可以在加载 DLL 后直接调用此类函数)。
加载DLL意味着从EXE调用LoadLibrary
,它试图在当前进程(RunDLL32.EXE)中初始化DLL。在内存中加载 DLL 意味着调用DllMain
给定的 DLL,这是由加载程序(OS)完成的。如果一切成功,该进程将获得已加载 DLL 的句柄。
成功获取DLL句柄后,它会获取函数使用的地址,GetProceAddress
并通过函数的地址调用函数。
例如(在命令提示符下):
rundll32.exe user32.dll,LockWorkStation
将加载user32.dll
然后调用LockWorkStation
最终将锁定工作站。
我不确定 RunDLL32 如何找到原型、所需参数、返回类型和调用约定。