2009-09-17 13 views
19

Ich schreibe eine .NET-Bibliothek, um verwaltete DLLs in externe Prozesse zu injizieren. Mein aktueller Ansatz ist:AppDomain.CreateInstanceFromAndUnwrap - Transparenter Proxy kann nicht umgewandelt werden

  1. Verwenden CreateRemoteThread den Zielprozess zu erzwingen LoadLibrary auf einem nicht verwalteten Bootstrap-DLL zu rufen. Von diesem Punkt aus führen wir Code im Zielprozess aus.
  2. Meine Bootstrap-DLL erstellt dann eine Instanz der CLR und ruft ExecuteInDefaultAppDomain darauf auf, die eine Methode in einer verwalteten Helper-DLL ausführt.
  3. Diese Methode erstellt eine neue Anwendungsdomäne und ruft AppDomain.CreateInstanceFromAndUnwrap auf, um die Ausführung in meine Nutzlast-DLL zu übergeben, wobei das Ergebnis als IInjectionPayload ausgegeben wird.
  4. Die Idee ist, dass meine Nutzlast-DLL eine Klasse zur Verfügung stellt, die IInjectionPayload implementiert, so dass die Helfer-DLL einfach payload.Run() aufrufen kann.

Ich mache es so, dass der Payload-Code vollständig entladen werden kann, indem einfach AppDomain.Unload (nach der Signalisierung zu bereinigen) aufgerufen wird.

Dieser Ansatz funktioniert - die Klasse in meiner Nutzlast DLL in dem Zielprozess instanziiert zu werden, so Code kann ausgeführt werden - aber ich kann das Objekt nicht gegossen, indem CreateInstanceFromAndUnwrap zu einem IInjectionPayload zurückgekehrt; Es wird die folgende Ausnahme ausgelöst:

Kann keinen transparenten Proxy für den Typ 'blah.Blah.IInjectionPayload' übertragen.

Ich habe versucht, mit CreateInstanceAndUnwrap und Activator.CreateInstanceFrom von Object.Unwrap, wobei jedoch beide Methoden auch dazu führen, die gleiche Ausnahme ausgelöst werden.

Die Unterschrift meiner Nutzlastklasse:

public class Program : MarshalByRefObject, IInjectionPayload

ich ratlos bin, weil die Nutzlast DLL auf jeden Fall immer geladen wird, und die Klasse instanziiert wird, wie beabsichtigt. Jede Hilfe würde sehr geschätzt werden.

Antwort

23

Fand die Lösung für dieses Problem hier: http://www.west-wind.com/WebLog/posts/601200.aspx

Es sieht aus wie ein Fehler in dem .NET-Framework. Die Lösung besteht darin, einen Handler zu AppDomain.CurrentDomain.AssemblyResolve hinzuzufügen, der manuell lädt & die Baugruppe bei args.Name zurückgibt. Dann können Sie CreateInstanceFromAndUnwrap aufrufen, ohne dass es eine Ausnahme auslöst.

+1

Dies rettete mir nur den Hintern. Mein Problem scheint mit dem Laden einer AppDomain-Assembly aus einem anderen Verzeichnis als dem zu sein, in dem die ausführbare Datei läuft. Das Remoting-Objekt kommt gut zurück, aber wenn ich es auspacke(), behauptet es, dass es nicht der richtige Typ ist. Sein Resolver-Handler-Trick funktioniert wunderbar. –

Verwandte Themen