有没有办法在远程 Windows 机器上动态运行 DLL?
假设用户想要将他自己的 DLL 文件发送到远程服务器并在远程站点上运行该 DLL 中的函数。用户可能能够提供函数入口点以及所需的参数,但仅此而已。(例如没有头文件)
我正在考虑在远程站点设置一个代理可执行文件,它可以(1)动态加载和绑定一个未知的 DLL,(2)运行一个带参数的函数。这是一个好的方法,还是这样的可执行文件可能?
有没有办法在远程 Windows 机器上动态运行 DLL?
假设用户想要将他自己的 DLL 文件发送到远程服务器并在远程站点上运行该 DLL 中的函数。用户可能能够提供函数入口点以及所需的参数,但仅此而已。(例如没有头文件)
我正在考虑在远程站点设置一个代理可执行文件,它可以(1)动态加载和绑定一个未知的 DLL,(2)运行一个带参数的函数。这是一个好的方法,还是这样的可执行文件可能?
您可以使用动态加载 DLL 的技术。
通常,您通过将 .LIB 静态链接到您的项目并对其进行编译来使用 DLL。要在运行时动态加载 DLL,您可以使用以下 WIN32 API 函数和其他一些技巧。
加载Libaray(); LoadLibarayEx(); GetProcAddress(); 免费图书馆();
还有一些其他的技巧
这一切都在以下 wiki 文章中进行了解释 - http://en.wikipedia.org/wiki/Dynamic-link_library
您在远程机器上安装可执行文件的想法很好。只要您与用户就函数名称和参数达成一致。如果 dll 符合此规定,则可以随时更改 dll,而无需更改 EXE。一旦设置并工作,添加额外功能很简单。
是的,您可以编写使用此信息运行 DLL 函数的小程序,并使用sysinternals 中的PSEXEC之类的东西远程调用它。
PsExec 是一种轻量级 telnet 替代品,可让您在其他系统上执行进程,并与控制台应用程序完全交互,而无需手动安装客户端软件来手动安装客户端软件
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);