Внедрение DLL не работает в целевом процессе

Я пытаюсь использовать функцию CreateRemoteThread(), чтобы внедрить функцию InjectedFunction() и запустить ее внутри удаленного процесса.

Однако кажется, что этот код не может работать. Целевая программа просто аварийно завершает работу, как только программа-инжектор запускает функцию CreateRemoteThread(). Любой указатель на то, что пошло не так?

void injectedFunction()
{
    MessageBoxA(NULL, "Injection OK", "Injection OK", NULL);
}


void injectionFunction()
{
    HANDLE hTargetProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);

    CreateRemoteThread(hTargetProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)injectedFunction, NULL, NULL, NULL);

}

person infotic    schedule 27.08.2016    source источник
comment
Функция не находится в адресном пространстве целевых процессов   -  person tkausl    schedule 27.08.2016


Ответы (1)


Я думаю, что вы искажаете несколько концепций: в основном вы пытаетесь внедрить функцию без использования внешней DLL, так что на самом деле это не внедрение DLL, которое вы делаете здесь.

Вот что пошло не так:

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

Предположим, что ваш injectedFunction() находится по адресу 0xABCD1234 в вашем процессе инжектора. По сути, то, что вы здесь делаете, это вызов адреса 0xABCD1234 в целевом процессе, который содержит кучу случайного кода и вообще не содержит следов кода инъекцииFunction(). Это может быть чрезвычайно опасно (хорошо, вероятность того, что этот случайный код отформатирует ваш жесткий диск или сделает что-то менее опасное, кроме сбоя целевого процесса, очень мала, но тем не менее выполнение кода в случайном месте НЕ< /strong> то, что вы вообще должны когда-либо делать).

Что ты должен делать:

1) Во-первых, выделите место в целевом процессе, которое содержит путь к файлу DLL на вашем жестком диске (путь к файлу должен быть в целевом процессе, иначе он не будет виден). Используйте для этого VirtualAllocEx и WriteProcessMemory.

2) Вызовите CreateRemoteThread с LoadLibraryA в качестве третьего аргумента и значением, возвращаемым VirtualAllocEx в качестве четвертого аргумента (адрес строки, содержащей путь к файлу DLL). Это создаст поток, который загружает только DLL. DLL вступит в действие и сделает все остальное.

Код:

DLL.cpp

extern "C" __declspec(dllexport) VOID injectedFunction(void)
{
    MessageBoxA(NULL, "Injection OK", "Injection OK", NULL);
}

Injector.cpp

void injectionFunction()
{
    HANDLE hTargetProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid);

    LPVOID lpParameter = VirtualAllocEx(hTargetProcess, NULL, 16, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

    WriteProcessMemory(hTargetProcess, (PBYTE)lpParameter, PATH_OF_YOUR_DLL, SIZE_OF_THE_DLL_PATH, NULL);

    CreateRemoteThread(hTargetProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryA, lpParameter, NULL, NULL);
}
person Ryan B.    schedule 27.08.2016