在一些严重的谷歌潜伏之后,我没有发现任何有用的问题,所以我会在这里问。
我有一个用C#编写的程序,它将DLL注入另一个进程,相当简单。它使用[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的返回,我不能只需直接通过导出函数调用。
那么,我将如何实现这一目标呢?
由于
答案 0 :(得分:0)
[DllImport]与GetProcAddress相同。 C#在第一次调用之前不加载DLL,因此.NET可以在调用DLL之前进行安全检查。
如果您根本不信任DLL,那么最好将de C#program拆分为两个。一个程序通过Remoting / WCF / IPC连接到第二个,第二个程序通过DllImport连接到C DLL。当您不信任C DLL稳定性或内存分配时,通常使用此解决方案,因为可以在不重新启动主程序的情况下重新启动第二个程序(调用de C DLL的程序)。这种模式的示例:一些Windows驱动程序(除了它们此时不使用C#)。
答案 1 :(得分:0)
您可以使用Non-persisted memory-mapped files在应用程序和DLL之间交换数据。