1

有没有办法在远程 Windows 机器上动态运行 DLL?

假设用户想要将他自己的 DLL 文件发送到远程服务器并在远程站点上运行该 DLL 中的函数。用户可能能够提供函数入口点以及所需的参数,但仅此而已。(例如没有头文件)

我正在考虑在远程站点设置一个代理可执行文件,它可以(1)动态加载和绑定一个未知的 DLL,(2)运行一个带参数的函数。这是一个好的方法,还是这样的可执行文件可能?

4

3 回答 3

2

您可以使用动态加载 DLL 的技术。

通常,您通过将 .LIB 静态链接到您的项目并对其进行编译来使用 DLL。要在运行时动态加载 DLL,您可以使用以下 WIN32 API 函数和其他一些技巧。

加载Libaray(); LoadLibarayEx(); GetProcAddress(); 免费图书馆();

还有一些其他的技巧

  • 您需要将 dll 函数声明为已导出。
  • 在 c++ 中,您需要使用 extern "C" 来防止函数的名称修改。
  • FARPROC ... 使用 GetProcAddress

这一切都在以下 wiki 文章中进行了解释 - http://en.wikipedia.org/wiki/Dynamic-link_library

您在远程机器上安装可执行文件的想法很好。只要您与用户就函数名称和参数达成一致。如果 dll 符合此规定,则可以随时更改 dll,而无需更改 EXE。一旦设置并工作,添加额外功能很简单。

于 2010-09-03T02:15:25.203 回答
1

是的,您可以编写使用此信息运行 DLL 函数的小程序,并使用sysinternals 中的PSEXEC之类的东西远程调用它。

PsExec 是一种轻量级 telnet 替代品,可让您在其他系统上执行进程,并与控制台应用程序完全交互,而无需手动安装客户端软件来手动安装客户端软件

于 2010-09-03T01:41:05.027 回答
0

Andrew Cash 对非托管代码的回答是合理的。他围绕GetProcAddress描述的技术本质上就是RunDll32.exe所做的。RunDll32.exe 是 Windows 的一部分,专门用于加载任意 DLL 并执行其代码。你可以像这样运行它:

RUNDLL32.EXE [dllfile],[入口点] [可选参数]

当你这样做时,RunDll32 将调用DLL 上的LoadLibrary,然后调用你给它的入口点名称上的GetProcAddress 。如果一切顺利,它就会调用入口点函数。

为此,需要导出入口点函数。它还必须像这样声明:

void CALLBACK MyEntryPoint(
  HWND hwnd,
  HINSTANCE hinst,
  LPSTR lpszCmdLine,
  int nCmdShow);
于 2010-09-03T15:18:41.263 回答