Проблема в том, что даже если вы внедрите свой код в процесс, если вы не создадите поток в начале введенного кода, он все равно не будет работать.Как правило, для внедрения кода вы вводите полную DLL.Один из популярных способов внедрения DLL - это:
- Получить дескриптор целевого процесса (EnumProcesses, CreateTool32Snapshot / Process32First / Process32Next, FindWindow / GetWindowThreadProcessId / OpenProcess и т. Д.)
- Выделите память в целевом процессе, которая имеет ту же длину, что и строка, указывающая путь к вашей DLL (VirtualAllocEx)
- Записывает строку, указывающую путь вашей DLL к этой выделенной памяти (WriteProcessMemory)
- Создать удаленный поток в подпрограмме LoadLibrary (получить адрес с помощью GetModuleHandle / GetProcAddress) и передать указатель на выделенную память в качестве параметра (CreateRemoteThread)
- Освободить выделенную память (VirtualFreeEx)
- Закрыть все открытые дескрипторы (дескрипторы процесса, дескрипторы снимков и т. Д. С помощью CloseHandle)
Если нет особой причины, по которой вы хотите избежать этого метода, гораздо предпочтительнее копировать всам код (WriteProcessMemory и, возможно, настройка pagЭлектронная защита (VirtualProtectEx)).Без загрузки библиотеки вам потребуется вручную отобразить переменные, переместить указатели на функции и все другие функции, выполняемые LoadLibrary.
Ранее вы спрашивали о семантике CreateRemoteThread.Он создаст поток в другом процессе, который будет продолжать работать до тех пор, пока не прекратит сам или что-то еще (кто-то вызывает TerminateThread или процесс завершается и вызывает ExitProcess и т. Д.).Поток будет работать как параллель так же, как и законно созданный поток (переключение контекста).