AppDomain.CreateInstanceFromAndUnwrap – 无法转换透明代理
我正在编写一个.NET库,将托管DLL注入外部进程。 我目前的做法是:
- 使用
CreateRemoteThread
强制目标进程在非托管引导DLL上调用LoadLibrary
。 从这一点开始,我们在目标进程中执行代码。 - 我的引导DLL然后创建一个CLR实例并在其上调用
ExecuteInDefaultAppDomain
,它执行托管助手DLL中的方法。 - 此方法创建一个新的AppDomain并调用
AppDomain.CreateInstanceFromAndUnwrap
将执行传递到我的有效负载DLL,并将结果转换为IInjectionPayload
。 - 我的想法是我的有效负载DLL公开了一个实现
IInjectionPayload
的类,因此助手DLL可以简单地调用payload.Run()
。
我这样做是为了通过简单地调用AppDomain.Unload
(在发信号通知清理之后)完全卸载有效负载代码。
这种方法有效 – 我的有效负载DLL中的类正在目标进程中实例化,因此可以执行代码 – 但是我无法将CreateInstanceFromAndUnwrap
返回的对象IInjectionPayload
转换为IInjectionPayload
; 它抛出以下exception:
无法转换透明代理以键入’blah.Blah.IInjectionPayload’。
我尝试使用CreateInstanceAndUnwrap
和Activator.CreateInstanceFrom
后跟Object.Unwrap
,但这两种方法也会导致抛出相同的exception。
我的有效载荷类的签名是:
public class Program : MarshalByRefObject, IInjectionPayload
我很难过,因为有效负载DLL肯定会被加载,并且正在按照预期实例化类。 任何帮助将非常感激。
在这里找到了解决这个问题的方法: http : //www.west-wind.com/WebLog/posts/601200.aspx
它看起来像.NET框架中的一个错误。 解决方案是向AppDomain.CurrentDomain.AssemblyResolve
添加一个处理程序,该处理程序在args.Name
处手动加载并返回程序集。 然后你可以调用CreateInstanceFromAndUnwrap
而不会抛出exception。