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