C# DLL Injection — вызов метода запуска приложения

Допустим, у меня есть исполняемый файл foobar.exe, написанный на C# и теперь скомпилированный, работающий в Windows. Одна из функций в приложении следующая (пример):

public static async Task LoadBox(string msg)
{
    System.Windows.Forms.MessageBox.Show(msg);
}

Я хотел бы написать DLL на С#, которая вызывает этот метод в приложении. DLL, скажем, «injected.dll», будет внедрена в работающий процесс «foobar.exe» с помощью инжектора, указанного здесь: http://www.codingvision.net/miscellaneous/c-inject-a-dll-into-a-process-w-createemotethread< /а>

Можно ли из недавно введенной DLL вызвать общедоступную функцию в исходном exe? Если это так, любой пример кода на С# будет оценен.


person acelives    schedule 06.03.2019    source источник
comment
Если DLL является .NET DLL, нет необходимости использовать вызовы Windows API. Просто используйте Assembly.LoadFrom и подобные (обратите внимание, что ссылки на документ с рекомендациями по загрузке сборок).   -  person Heretic Monkey    schedule 07.03.2019
comment
Связано, если не обман: Правильный способ загрузки сборки, найти класс и вызвать метод Run()   -  person Heretic Monkey    schedule 07.03.2019
comment
Чтобы уточнить, я не буду модифицировать приложение foobar.exe для загрузки DLL. Foobar.exe — это стороннее приложение (написанное на C#), в котором я определил метод, который я хотел бы вызвать, когда приложение foobar.exe уже запущено, путем внедрения DLL в запущенный процесс и вызова его метод LoadBox.   -  person acelives    schedule 07.03.2019
comment
Мой друг и я обсуждаем это прямо сейчас. Нет никакого способа (в пределах разумного) сделать это. Я много раз использовал инъекцию, но это не было попыткой выйти за пределы управляемых границ. Кажется, что никто даже не читает ваши требования к бегу. Я бы предположил, что C++/CLI «может» дать вам шанс, но это будет, по меньшей мере, чрезвычайно сложно. Другой вариант? Дизассемблируйте исполняемый файл и делайте с ним что хотите.   -  person Señor CMasMas    schedule 07.03.2019
comment
Да, он дизассемблирован (декомпилирован, спасибо MSIL!), и пропатчен, чтобы делать то, что я хочу. Мне действительно просто любопытно написать исполняемый файл, который внедряется в запущенный процесс, а затем вызывает метод, чтобы обойти проверку, сделанную программой перед запуском LoadBox(), так что мне не нужно использовать исправленный двоичный файл .   -  person acelives    schedule 07.03.2019


Ответы (1)


Мой подход заключается в использовании концепций Reflection. Мы могли бы заставить EXE загрузить сборку через отражение, обнаружить тип и вызвать метод для этого типа, а затем передать экземпляр класса в вашем EXE этому методу, который, в свою очередь, выполняет обратный вызов. Круговым путем - но это сработает.

Вы можете использовать метод System.Reflection.Assembly.LoadFrom( для загрузки сборки, скомпилированной для .NET. Это довольно старый метод, в нем нет ничего нового. Зависимость содержит и приложения, предназначенные для загрузки Этим методом пишутся плагины после развертывания.

Шаг 1

Загрузите сборку подключаемого модуля в текущий домен приложения с помощью System.Reflection.LoadFrom.

Шаг 2

Найдите Type в этой сборке подключаемого модуля с помощью Assembly.GetTypes().

Шаг 3

Передайте экземпляр класса, определенного в вашем EXE, в плагин, и плагин сделает обратный вызов. Это то, что на самом деле сделал бы обратный вызов события.

Ссылка

person Sau001    schedule 06.03.2019