gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:43:44 31 4
gpt4 key购买 nike

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

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

我这样做是为了通过简单地调用 AppDomain.Unload 来完全卸载负载代码。 (在发出清理信号后)。

这种方法有效——我的负载 DLL 中的类在目标进程中被实例化,所以代码可以被执行——但我不能转换 CreateInstanceFromAndUnwrap 返回的对象到IInjectionPayload ;它抛出以下异常:

Unable to cast transparent proxy to type 'blah.Blah.IInjectionPayload'.

我试过使用 CreateInstanceAndUnwrap , 和 Activator.CreateInstanceFrom其次是 Object.Unwrap ,但这两种方法也会引发相同的异常。

我的负载类的签名是:

public class Program : MarshalByRefObject, IInjectionPayload

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

最佳答案

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

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

关于c# - AppDomain.CreateInstanceFromAndUnwrap - 无法转换透明代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437831/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com