AppDomain.CreateInstanceFromAndUnwrap - 无法转换透明代理

flu*_*es1 20 c# appdomain code-injection

我正在编写一个.NET库,将托管DLL注入外部进程.我目前的做法是:

  1. 使用CreateRemoteThread强制目标进程调用LoadLibrary的非托管引导DLL.从这一点开始,我们在目标进程中执行代码.
  2. 然后我的bootstrap DLL创建一个CLR实例并对其进行调用ExecuteInDefaultAppDomain,该实例在托管助手DLL中执行一个方法.
  3. 此方法创建一个新的AppDomain并调用AppDomain.CreateInstanceFromAndUnwrap将执行传递到我的有效负载DLL,将结果转换为IInjectionPayload.
  4. 我的想法是我的有效负载DLL公开了一个实现的类IInjectionPayload,因此助手DLL可以简单地调用payload.Run().

我这样做是为了通过简单地调用AppDomain.Unload(在发信号通知清理之后)可以完全卸载有效载荷代码.

这种方法有效 - 我的有效负载DLL中的类正在目标进程中实例化,因此可以执行代码- 但我不能将返回的对象强制CreateInstanceFromAndUnwrap转换为IInjectionPayload; 它抛出以下异常:

无法转换透明代理以键入'blah.Blah.IInjectionPayload'.

我已尝试使用CreateInstanceAndUnwrap,Activator.CreateInstanceFrom然后使用Object.Unwrap,但这两种方法也会导致抛出相同的异常.

我的有效载荷类的签名是:

public class Program : MarshalByRefObject, IInjectionPayload

我很难过,因为有效负载DLL肯定会被加载,并且正在按照预期实例化类.任何帮助将非常感激.

flu*_*es1 23

在这里找到了解决这个问题的方法:http://www.west-wind.com/WebLog/posts/601200.aspx

它看起来像.NET框架中的一个错误.解决方案是添加一个处理程序AppDomain.CurrentDomain.AssemblyResolve,手动加载并返回程序集args.Name.然后你可以在CreateInstanceFromAndUnwrap没有它的情况下调用异常.