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
- Verwenden
CreateRemoteThread
den Zielprozess zu erzwingenLoadLibrary
auf einem nicht verwalteten Bootstrap-DLL zu rufen. Von diesem Punkt aus führen wir Code im Zielprozess aus. - Meine Bootstrap-DLL erstellt dann eine Instanz der CLR und ruft
ExecuteInDefaultAppDomain
darauf auf, die eine Methode in einer verwalteten Helper-DLL ausführt. - 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 alsIInjectionPayload
ausgegeben wird. - Die Idee ist, dass meine Nutzlast-DLL eine Klasse zur Verfügung stellt, die
IInjectionPayload
implementiert, so dass die Helfer-DLL einfachpayload.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.
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. –