Подтвердить что ты не робот

AppDomain.CreateInstanceFromAndUnwrap - Невозможно передать прозрачный прокси-сервер

Я пишу библиотеку .NET для ввода управляемых DLL во внешние процессы. Мой текущий подход:

  • Используйте CreateRemoteThread, чтобы заставить целевой процесс вызвать LoadLibrary в неуправляемой библиотеке начальной загрузки. С этого момента мы выполняем код в целевом процессе.
  • Затем моя загрузочная DLL создает экземпляр CLR и вызывает на нем ExecuteInDefaultAppDomain, который выполняет метод в управляемой вспомогательной DLL.
  • Этот метод создает новый AppDomain и вызывает AppDomain.CreateInstanceFromAndUnwrap, чтобы передать выполнение в мою полезную DLL-библиотеку, введя результат как IInjectionPayload.
  • Идея заключается в том, что моя DLL полезной нагрузки предоставляет класс, который реализует IInjectionPayload, поэтому вспомогательная DLL может просто вызвать payload.Run().

Я делаю это так, чтобы код полезной нагрузки можно было полностью выгрузить, просто позвонив AppDomain.Unload (после того, как он очистил его).

Этот подход работает - класс в моей полезной DLL-информации получает экземпляр в целевом процессе, поэтому код может быть выполнен, но я не могу отбросить объект, возвращаемый CreateInstanceFromAndUnwrap, на IInjectionPayload; он выдает следующее исключение:

Невозможно передать прозрачный прокси для ввода 'blah.Blah.IInjectionPayload'.

Я пробовал использовать CreateInstanceAndUnwrap и Activator.CreateInstanceFrom, а затем Object.Unwrap, но оба этих метода также вызывают одно и то же исключение.

Подпись моего класса полезной нагрузки:

public class Program : MarshalByRefObject, IInjectionPayload

Я тупик, потому что DLL полезной нагрузки определенно загружается, и класс создается, как предполагалось. Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Здесь найдено исправление для этой проблемы: http://www.west-wind.com/WebLog/posts/601200.aspx

Он выглядит как ошибка в .NET framework. Решение состоит в том, чтобы добавить обработчик к AppDomain.CurrentDomain.AssemblyResolve, который вручную загружает и возвращает сборку в args.Name. Затем вы можете вызвать CreateInstanceFromAndUnwrap, не выбрасывая исключение.