Внедрение потока с codecave - PullRequest
       32

Внедрение потока с codecave

0 голосов
/ 04 февраля 2011

Используя метод 'codecave' для внедрения кода в другой процесс;Можно ли внедрить код для создания нового потока (а также ввести код для нового потока) и позволить этому потоку выполняться параллельно с основным потоком целевого процесса?

Я могу управлять этим с помощью внедрения DLL, но яХотите узнать, возможно ли это только с помощью простого внедрения кода.

Цель состоит в том, чтобы в первую очередь узнать о различных методах внедрения, но в конце концов создать функцию биения для случайных процессов, чтобы контролировать выполнение (Высокая доступность).Windows является целевой ОС, а язык - C / C ++ (при необходимости используется встроенный ASM).

Спасибо.

Ответы [ 5 ]

0 голосов
/ 21 сентября 2013

Вы также можете использовать функцию RtlCreateUserThread для создания удаленного потока.

0 голосов
/ 09 августа 2011

Проблема в том, что даже если вы внедрите свой код в процесс, если вы не создадите поток в начале введенного кода, он все равно не будет работать.Как правило, для внедрения кода вы вводите полную 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 и т. Д.).Поток будет работать как параллель так же, как и законно созданный поток (переключение контекста).

0 голосов
/ 08 августа 2011

При использовании загрузчика DLL-инъекций, такого как "Winject (тот, который вызывает CreateRemoteThread), очень легко создавать потоки, которые остаются до закрытия целевого процесса.

Просто создайте поток внутри функции:

void run_thread(void* ass)
{
  // do stuff until process terminates
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD result, LPVOID lpReserved)
{
  HANDLE handle = (HANDLE)_beginthread(run_thread, 0, 0);
}

С уважением, Майкл

0 голосов
/ 09 августа 2011

Конечно, но вы должны также ввести код для удаленного потока в процесс (например, функцию).Внедрение всей функции в удаленный процесс является трудной задачей, поскольку не существует четкого способа определения размера функции.Этот подход был бы гораздо более эффективным, если бы внедренный код был маленьким, и в этом случае вы просто вставили бы короткую заглушку сборки, а затем вызвали CreateRemoteThread.

Действительно, что было бы выгодно делать это по сравнению с простыминъекции DLL?Ваша функция «сердцебиение» может быть реализована так же легко с помощью внедренной DLL.(разве кто-нибудь скажет мне, что есть значительные накладные расходы?)

0 голосов
/ 04 февраля 2011

Есть функция CreateRemoteThread.

...