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 полезной нагрузки определенно загружается, и класс создается, как предполагалось. Любая помощь будет высоко оценена.
Ответы
Ответ 1
Здесь найдено исправление для этой проблемы: http://www.west-wind.com/WebLog/posts/601200.aspx
Он выглядит как ошибка в .NET framework. Решение состоит в том, чтобы добавить обработчик к AppDomain.CurrentDomain.AssemblyResolve
, который вручную загружает и возвращает сборку в args.Name
. Затем вы можете вызвать CreateInstanceFromAndUnwrap
, не выбрасывая исключение.