21

マネージ DLL を外部プロセスに挿入する .NET ライブラリを作成しています。私の現在のアプローチは次のとおりです。

  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.CreateInstanceFromObject.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 に答える