2009-09-17 9 views
19

Estoy escribiendo una biblioteca .NET para inyectar archivos DLL administrados en procesos externos. Mi enfoque actual es:AppDomain.CreateInstanceFromAndUnwrap - No se puede emitir el proxy transparente

  1. Uso CreateRemoteThread para forzar el proceso de destino para llamar LoadLibrary en una DLL de arranque no administrado. A partir de este punto, estamos ejecutando código en el proceso objetivo.
  2. Mi DLL de rutina de arranque crea una instancia del CLR y llama al ExecuteInDefaultAppDomain, que ejecuta un método en una DLL de ayuda administrada.
  3. Este método crea un nuevo dominio de aplicación y llama a AppDomain.CreateInstanceFromAndUnwrap para pasar la ejecución a mi DLL de carga, arrojando el resultado como IInjectionPayload.
  4. La idea es que mi DLL de carga expone una clase que implementa IInjectionPayload, por lo que la DLL auxiliar simplemente puede llamar al payload.Run().

lo estoy haciendo de esta manera para que el código de carga puede ser descargado completamente, simplemente llamando a AppDomain.Unload (después de la señalización a limpiar).

Este enfoque funciona - la clase en mi DLL de carga útil es conseguir una instancia en el proceso de destino, por lo que el código puede ser ejecutado - pero no puede convertir el objeto devuelto por CreateInstanceFromAndUnwrap a un IInjectionPayload; arroja la siguiente excepción:

No se ha podido emitir el proxy transparente para escribir 'blah.Blah.IInjectionPayload'.

He intentado usar CreateInstanceAndUnwrap y Activator.CreateInstanceFrom seguido por Object.Unwrap, pero ambos de estos métodos también causan la misma excepción que se lance.

La firma de mi clase de carga útil es:

public class Program : MarshalByRefObject, IInjectionPayload

Estoy confundido porque la DLL de carga útil sin duda se está cargado y está siendo instanciado la clase, según lo previsto. Cualquier ayuda sería muy apreciada.

Respuesta

23

encontrado la solución para este problema aquí: http://www.west-wind.com/WebLog/posts/601200.aspx

Parece un error en el marco .NET. La solución es agregar un controlador a AppDomain.CurrentDomain.AssemblyResolve que carga manualmente & devuelve el conjunto al args.Name. Luego puede llamar al CreateInstanceFromAndUnwrap sin que arroje una excepción.

+1

Esto acaba de salvar mi trasero. Mi problema parece ser cargar un ensamblado AppDomain desde un directorio que no sea aquel en el que se ejecuta el ejecutable. El objeto remoto vuelve bien, pero cuando lo desenredo, afirma que no es del tipo correcto. Su truco de resolver-handler funciona maravillosamente. –

Cuestiones relacionadas