我正在编写一个 .NET 库来将托管 DLL 注入外部进程。我目前的做法是:
- 用于
CreateRemoteThread
强制目标进程调用LoadLibrary
非托管引导 DLL。从这一点开始,我们正在目标进程中执行代码。 - 然后我的引导 DLL 创建 CLR 的一个实例并调用
ExecuteInDefaultAppDomain
它,它执行托管帮助 DLL 中的一个方法。 - 此方法创建一个新的 AppDomain 并调用
AppDomain.CreateInstanceFromAndUnwrap
以将执行传递到我的有效负载 DLL,将结果转换为IInjectionPayload
. - 这个想法是我的有效负载 DLL 公开了一个实现的类
IInjectionPayload
,因此帮助 DLL 可以简单地调用payload.Run()
。
我这样做是为了通过简单地调用AppDomain.Unload
(在发出清理信号后)来完全卸载有效负载代码。
这种方法有效 - 我的有效负载 DLL 中的类正在目标进程中实例化,因此可以执行代码 - 但我不能将返回的对象CreateInstanceFromAndUnwrap
转换为IInjectionPayload
; 它抛出以下异常:
无法将透明代理转换为类型“blah.Blah.IInjectionPayload”。
我尝试过使用CreateInstanceAndUnwrap
, 和Activator.CreateInstanceFrom
后跟Object.Unwrap
,但这两种方法也会导致抛出相同的异常。
我的有效载荷类的签名是:
public class Program : MarshalByRefObject, IInjectionPayload
我很困惑,因为有效负载 DLL 肯定会被加载,并且类正在按预期进行实例化。任何帮助将非常感激。