AppDomain.CreateInstanceFromAndUnwrap - Não é possível converter o proxy transparente
Estou escrevendo uma biblioteca .NET para injetar DLLs gerenciadas em processos externos. Minha abordagem atual é:
UsarCreateRemoteThread
para forçar o processo de destino para chamarLoadLibrary
em uma DLL de inicialização não gerenciada. A partir deste ponto, estamos executando o código no processo de destino.Minha DLL de bootstrap cria uma instância do CLR e chamaExecuteInDefaultAppDomain
nele, que executa um método em uma DLL auxiliar gerenciada.Esse método cria um novo AppDomain e chamaAppDomain.CreateInstanceFromAndUnwrap
para passar a execução para minha DLL de carga útil, lançando o resultado como umIInjectionPayload
.A ideia é que minha DLL de payload expõe uma classe que implementaIInjectionPayload
, então a DLL auxiliar pode simplesmente chamarpayload.Run()
.Eu estou fazendo desse jeito para que o código de carga útil possa ser completamente descarregado simplesmente chamandoAppDomain.Unload
(depois de sinalizar para limpar).
Essa abordagem funciona - a classe na minha DLL de carga útil está sendo instanciada no processo de destino, portanto, o códigoposso ser executado - mas eu não posso lançar o objeto retornado porCreateInstanceFromAndUnwrap
para umIInjectionPayload
; ele lança a seguinte exceção:
Não é possível converter proxy transparente para digitar 'blah.Blah.IInjectionPayload'.
Eu tentei usarCreateInstanceAndUnwrap
eActivator.CreateInstanceFrom
Seguido porObject.Unwrap
, mas ambos os métodos também fazem com que a mesma exceção seja lançada.
A assinatura da minha classe de carga é:
public class Program : MarshalByRefObject, IInjectionPayload
Estou perplexo porque a DLL de carga útil está sendo carregada e a classe está sendo instanciada, como pretendido. Qualquer ajuda seria muito apreciada.