Inject dll process

249
21 сентября 2017, 13:06

Подскажите каким способом еще возможно заинжектить dll .net кроме mono? Нужно чтобы dll загрузилась и выполнила void Loader из Class Initialize. Нужно это для того,чтобы с сервера загружать в клиент dll и далее уже инжектить в Assambly лист

Answer 1

Вручную. Ну во-первых надо чтобы клиент тыкнул в окошко UAC, когда будет запускаться инъектор (иначе открывать чужой процесс с правами на чтение-запись-создание удаленного потока как минимум ему не дадут).

Во-вторых, ниже я привожу нужный вам код. На C# писать будет тяжеловато, придется делать dllimport для нужных системных вызовов, мучаться с типами и т.д., я бы написал код на Си, собрал в dll и подключал эту dll к проекту на шарпе.

Портянка нужного вам кода на сишке + винапи в общем тривиальна: * Здесь и далее код с функциями винапи в скобках, описывающий ход решения *

Получить имя процесса, в который вы будете внедряться;

Получить снимок процессов скажем CreateToolHelp32Snapshot (это функция-обертка над NtQuerySystemInformation, так что решайте, использовать её или нет. но я бы использовал);

Пробегая по полученному списку процессов (для этого есть Process32Next), найти нужный по имени;

Сделать себе SeDebugPrivilege (процессу инъектора, это необязательный пункт);

Открыть найденный процесс с правами на запись в память и создание удаленного потока (OpenProcess, нужные флаги выглядят так: PROCESS_CREATE_THREAD | PROCESS_VM_WRITE);

Далее потребуется некая предварительная подготовка. Получите адрес kernel32.dll:LoadLibrary в инъекторе, и этот же адрес (по крайней мере для 32бит систем, в 64бит придется еще обходить/отключать ASLR) будет в чужом процессе также указывать на kernel32.dll. Получите абсолютный путь до своей dll. В моем случае dll лежит в папке с инъектором, так что я делаю GetModuleFileName в инъекторе, получившийся путь парсю с конца до первого вхождения '\' и вставляю "\myDll.dll".

Выделите память в чужом адресном пространстве (VirtualAllocEx), вам нужна память под адрес своей dll. Запишите туда адрес своей dll (WriteProcessMemory).

Создайте и запустите удаленный поток (CreateRemoteThread), в аргументах у него должен лежать адрес kernel32.dll:LoadLibrary, и указатель на строку с путем до dll - не в вашем процессе, а то что вернула VirtualAllocEx, она возвращает адрес в чужом адресном пространстве.

Удаленный поток вызовет в чужом процессе LoadLibrary, та загрузит вашу DLL, DLL выполнит свою точку входа. Задача решена.

READ ALSO
Получить RGB из System.Windows.Media.Brush

Получить RGB из System.Windows.Media.Brush

Как получить RGB значения из SystemWindows

328
Парсинг сайта с помощью anglesharp

Парсинг сайта с помощью anglesharp

Использую AngleSharp для парсинга сайтаОчень хорошая штука

290
Инициализация полей UserControl 'a WPF

Инициализация полей UserControl 'a WPF

Передо мной стоит задача открыть изображения в сетке

212
Как через async\await вызвать метод DisconnectAsync у сокета?

Как через async\await вызвать метод DisconnectAsync у сокета?

Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттернОн поддерживает только старые...

228