谷歌潜伏了一段时间之后,我没有发现任何与此问题相关的有用信息,所以我在这里问。
我有一个用C#编写的程序,该程序将DLL注入(inject)另一个进程,这相当琐碎。它使用[DllImport]从kernel32.dll调用CreateRemoteThread和LoadLibrary。
出于安全原因,一旦加载了我的DLL,然后等待来自C#程序的身份验证,就无法使用套接字传输此数据。因此,我将DLL导出一个计划通过身份验证数据从C#程序调用的函数。
导出的函数带有两个参数,如下所示:
extern "C" __declspec(dllexport) void DoStuff( const char* ccString1, const char* ccString2 ){
// Do stuff
}
由于DLL与C#程序不在同一个地址空间中,因此我无法使用[DllImport]来获取和调用导出的函数。
我的第二个想法是使用CreateRemoteThread调用该函数,尽管只能传递1个参数,而我需要两个参数,这也很困难,因为我需要调用GetProcAddress的返回值,因此我不能简单地通过直接导出功能。
那么,我将如何实现这一目标?
谢谢
最佳答案
[DllImport]与GetProcAddress相同。 C#直到第一次调用时才加载DLL,因此.NET可以在调用DLL之前进行安全检查。
如果您根本不信任DLL,则最好将C#程序一分为二。一个程序通过Remoting/WCF/IPC连接到第二个程序,第二个程序通过DllImport连接到C DLL。当您不信任C DLL的稳定性或内存分配时,通常使用此解决方案,因为可以在不重新启动主程序的情况下重新启动第二个程序(调用de C DLL的程序)。此模式的示例:一些Windows驱动程序(除了它们此时不使用C#)。