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

时间:2009-09-17 10:00:58

标签: c# appdomain code-injection

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

  1. 使用CreateRemoteThread强制目标进程在非托管引导DLL上调用LoadLibrary。从这一点开始,我们在目标进程中执行代码。
  2. 我的引导程序DLL然后创建一个CLR实例并在其上调用ExecuteInDefaultAppDomain,它在托管助手DLL中执行一个方法。
  3. 此方法创建一个新的AppDomain并调用AppDomain.CreateInstanceFromAndUnwrap将执行传递到我的有效负载DLL,并将结果转换为IInjectionPayload
  4. 我的想法是我的有效负载DLL公开了一个实现IInjectionPayload的类,因此助手DLL可以简单地调用payload.Run()
  5. 我这样做是为了通过简单地调用AppDomain.Unload(在用信号通知清理之后)完全卸载有效负载代码。

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

      

    无法投射透明代理以输入'blah.Blah.IInjectionPayload'。

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

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

      

    public class Program : MarshalByRefObject, IInjectionPayload

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

1 个答案:

答案 0 :(得分:23)

在此处找到此问题的修复程序:http://www.west-wind.com/WebLog/posts/601200.aspx

它看起来像.NET框架中的一个错误。解决方案是向AppDomain.CurrentDomain.AssemblyResolve添加处理程序,手动加载&返回args.Name处的程序集。然后你可以调用CreateInstanceFromAndUnwrap而不会抛出异常。