2009-09-17 12 views
19

Sto scrivendo una libreria .NET per iniettare DLL gestite in processi esterni. Il mio approccio attuale è:AppDomain.CreateInstanceFromAndUnwrap - Impossibile eseguire il proxy trasparente

  1. Usa CreateRemoteThread per forzare il processo di destinazione per chiamare LoadLibrary su una DLL bootstrap non gestito. Da questo punto stiamo eseguendo il codice nel processo di destinazione.
  2. La mia bootstrap DLL quindi crea un'istanza del CLR e chiama ExecuteInDefaultAppDomain su di esso, che esegue un metodo in una DLL di helper gestita.
  3. Questo metodo crea un nuovo AppDomain e chiama AppDomain.CreateInstanceFromAndUnwrap per passare l'esecuzione nella DLL del carico utile, trasmettendo il risultato come IInjectionPayload.
  4. L'idea è che il mio payload DLL esponga una classe che implementa IInjectionPayload, quindi la DLL helper può semplicemente chiamare payload.Run().

Lo sto facendo in questo modo in modo che il codice del payload possa essere completamente scaricato semplicemente chiamando AppDomain.Unload (dopo averlo segnalato per pulire).

Questo approccio funziona - la classe nella mia DLL payload è sempre un'istanza nel processo di destinazione, in modo da codice può essere eseguito - ma non può lanciare l'oggetto restituito da CreateInstanceFromAndUnwrap ad un IInjectionPayload; getta la seguente eccezione:

Impossibile trasmettere il proxy trasparente per digitare "blah.Blah.IInjectionPayload".

Ho provato con CreateInstanceAndUnwrap, e Activator.CreateInstanceFrom seguito da Object.Unwrap, ma entrambi questi metodi anche causare lo stesso generazione di un'eccezione.

La firma della mia classe carico utile è:

public class Program : MarshalByRefObject, IInjectionPayload

stumped perché la DLL carico utile è sicuramente sempre caricato e la classe viene creata un'istanza, come previsto. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

23

Trovato la correzione per questo problema qui: http://www.west-wind.com/WebLog/posts/601200.aspx

Sembra un bug nel framework .NET. La soluzione è aggiungere un gestore a AppDomain.CurrentDomain.AssemblyResolve che carica manualmente & restituisce l'assembly a args.Name. Quindi è possibile chiamare CreateInstanceFromAndUnwrap senza che generi un'eccezione.

+1

Questo mi ha appena salvato il sedere. Il mio problema sembra essere con il caricamento di un assembly AppDomain da una directory diversa da quella in cui è in esecuzione l'eseguibile. L'oggetto remoto viene restituito correttamente, ma quando I Unwrap() lo richiede, afferma che non è il tipo corretto. Il suo trucco con risolutore funziona meravigliosamente. –

Problemi correlati