Sto scrivendo una libreria .NET per iniettare DLL gestite in processi esterni. Il mio approccio attuale è:AppDomain.CreateInstanceFromAndUnwrap - Impossibile eseguire il proxy trasparente
- Usa
CreateRemoteThread
per forzare il processo di destinazione per chiamareLoadLibrary
su una DLL bootstrap non gestito. Da questo punto stiamo eseguendo il codice nel processo di destinazione. - 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. - Questo metodo crea un nuovo AppDomain e chiama
AppDomain.CreateInstanceFromAndUnwrap
per passare l'esecuzione nella DLL del carico utile, trasmettendo il risultato comeIInjectionPayload
. - L'idea è che il mio payload DLL esponga una classe che implementa
IInjectionPayload
, quindi la DLL helper può semplicemente chiamarepayload.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.
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. –