Подскажите каким способом еще возможно заинжектить dll .net кроме mono? Нужно чтобы dll загрузилась и выполнила void Loader из Class Initialize. Нужно это для того,чтобы с сервера загружать в клиент dll и далее уже инжектить в Assambly лист
Вручную. Ну во-первых надо чтобы клиент тыкнул в окошко 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 выполнит свою точку входа. Задача решена.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как через async\await вызвать метод DisconnectAsync и дождаться его завершения у сокета? Этот метод не поддерживает TAP паттернОн поддерживает только старые...