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
- Uso
CreateRemoteThread
para forzar el proceso de destino para llamarLoadLibrary
en una DLL de arranque no administrado. A partir de este punto, estamos ejecutando código en el proceso objetivo. - 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. - 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 comoIInjectionPayload
. - La idea es que mi DLL de carga expone una clase que implementa
IInjectionPayload
, por lo que la DLL auxiliar simplemente puede llamar alpayload.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.
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. –