如何从运行中的MyLittleProggy.exe进程实例化Class1类?
可行性与实现方案
可行性结论
完全可行,但无法通过常规本地反射直接跨进程创建对象实例,必须借助.NET的远程调用机制或CLR进程注入技术,让目标进程(MyLittleProggy.exe)的CLR执行对象创建逻辑。
实现方向指引
方案1:使用.NET Remoting(原生轻量方案)
这是.NET Framework原生支持的跨进程通信/对象共享方案,适合可控的同架构进程间操作:
- 在
Class1上标记[Serializable]或继承MarshalByRefObject,使其支持跨进程传递 - 在MyLittleProggy.exe启动时注册一个远程通道(推荐IPC通道,适合本地进程通信),并将
Class1注册为可远程访问的服务类型 - AnotherProggy.exe通过相同的通道连接到MyLittleProggy,通过
Activator.GetObject获取远程Class1实例
代码片段(C#)
MyLittleProggy端注册通道:
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; // 启动时执行 var ipcChannel = new IpcChannel("MyLittleProggy_Ipc_Channel"); ChannelServices.RegisterChannel(ipcChannel, ensureSecurity: false); System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType( typeof(Class1), "Class1_Create_Service", WellKnownObjectMode.SingleCall);
AnotherProggy端获取实例:
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Ipc; var ipcChannel = new IpcChannel(); ChannelServices.RegisterChannel(ipcChannel, ensureSecurity: false); var class1Instance = (Class1)System.Activator.GetObject( typeof(Class1), "ipc://MyLittleProggy_Ipc_Channel/Class1_Create_Service");
方案2:CLR进程注入(更灵活但复杂度高)
如果无法修改MyLittleProggy的代码(或需要无侵入式操作),可以通过Windows API将反射逻辑注入到目标进程:
- 通过
Process.GetProcessesByName获取目标进程对象,使用Process.Modules定位目标进程中的CLR核心模块(如clr.dll) - 借助P/Invoke调用Windows API(
VirtualAllocEx、CreateRemoteThread等)将自定义的.NET反射代码注入到目标进程内存 - 注入的代码会在目标进程的CLR环境中执行,通过反射加载MyLittleProggy的程序集并创建
Class1实例
核心思路代码片段(C#)
using System.Diagnostics; Process targetProc = Process.GetProcessesByName("MyLittleProggy")[0]; // 省略P/Invoke声明(需导入CreateRemoteThread、VirtualAllocEx等Windows API) // 1. 在目标进程分配可执行内存 // 2. 将编译好的反射逻辑字节码写入内存 // 3. 创建远程线程触发CLR执行该逻辑,完成Class1实例创建
关于Modules与Reflection的使用
- System.Reflection:两种方案都必须用到——方案1是远程反射调用,方案2是注入后在目标进程内通过反射创建实例
- Process.Modules:仅方案2需要,用于定位目标进程中的CLR模块,确保注入的代码能正确触发.NET运行时执行逻辑
内容的提问来源于stack exchange,提问作者DinahMoeHumm
相关产品推荐
相关产品推荐

