Я пишу библиотеку .NET для внедрения управляемых DLL во внешние процессы. Мой текущий подход:
- Используйте
CreateRemoteThread
, чтобы заставить целевой процесс вызывать LoadLibrary
для неуправляемой библиотеки начальной загрузки. С этого момента мы выполняем код в целевом процессе.
- Моя библиотека начальной загрузки затем создает экземпляр 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 полезной нагрузки определенно загружается и создается экземпляр класса, как и предполагалось. Любая помощь будет высоко ценится.