Цель: как следует из названия, наша главная задача здесь — внедрить .net dll в приложение .net. Но чтобы сделать его более увлекательным, мы попытаемся изменить поток приложения. (как мы делали до использования DetoursAPI)

В качестве демонстрации я написал следующее приложение. Поскольку вы уже поняли, что делает этот код (простое сообщение msgbox говорит «Hello World from .Net App»), мы собираемся изменить его на «Hello world from .Injected DLL».

Не делюсь этим простым кодом, потому что я загрузил весь код, связанный с этим, на свой github (вы можете найти соответствующие ссылки в конце этого письма).

Итак, наше целевое приложение готово.

Далее нам нужно написать наше приложение-инжектор. Это будет нативное приложение x64, однако вы можете выполнять ту же работу, просто вызывая те же функции в приложении .net console/form.

Это приложение принимает шесть аргументов: первый исполняемый файл для внедрения, второй dll для внедрения (NativeDLL, об этом будет рассказано далее) (обратите внимание, что пути dll должны быть точными, а не относительными, как вы уже знаете), третий путь .net dll , четвертое имя типа .net, пятое имя метода .net и последний аргумент метода .net.

Приложение работает так, как будто оно сначала внедряет NativeDLL в целевой процесс, а затем создает именованный канал с таким именем, как \\.\pipe\NetDLL%PID% (где %PID% — шестнадцатеричное представление идентификатора процесса) и всеми остальными аргументами. записывается в эту вертикальную черту с разделенным символом вертикальной черты ('|').

NativeDLL открывает этот канал и считывает информацию .net dll для внедрения в домен приложения .net и выполняет метод (который является нашим пятым параметром) с помощью ExecuteInDefaultAppDomain.

Определение метода должно быть следующим

Вот код NativeDLL

И наш код DLL основной цели выглядит следующим образом

Простое объяснение функций dll;

InjectedMethod наша основная функция, которая будет выполняться после инъекции. Он пытается получить дескриптор главного окна. Если это так, вызывает метод Invoke, чтобы иметь возможность изменять основные состояния формы. (Мы используем Invoke только потому, что наш код выполняется в потоке, отличном от основного потока пользовательского интерфейса)

RemoveNetAppEventHandler удаляет соединение между btnSayHi.Click и btnSayHi_Click.

(form.Controls["btnSayHi"] as Button).Click += btnSayHiFromInjected_Click; Добавьте связь между нашей функцией и btnSayHi.Click

Перед инъекцией dll

После процесса инъекции

Здесь вы можете найти все проекты, упомянутые в тексте



Счастливого кодирования