21

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

  1. 用于CreateRemoteThread强制目标进程调用LoadLibrary非托管引导 DLL。从这一点开始,我们正在目标进程中执行代码。
  2. 然后我的引导 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 肯定会被加载,并且类正在按预期进行实例化。任何帮助将非常感激。

4

1 回答 1

24

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

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

于 2009-09-17T12:43:27.697 回答