Удаленный процесс не запускается

Я пытаюсь вызвать процесс из другой программы, этот процесс я ввел через DLL. Первый, куда мы загружаем библиотеку "Client.dll", работает отлично, это засеивается MessageBox Debug в DllMain (DLL_PROCESS_ATTACH).

После того, как DLL загружена в программу, я пытаюсь вызвать функцию MainThread из Client.dll, но использование того же метода (скопированного, вставленного, отредактированного) не работает. Оба размещены ниже, кто-нибудь может сказать мне, почему? Я удалил весь код из MainThread, но по причинам отладки.

Вот главная тема:

void MainThread(void * Arguments)
{
    MessageBoxA(NULL, "MainThread Started!", "bla", MB_OK); //Not Shown
    for (;;)
    {
         //This loop is here for the main program loop.
    }
    _endthread();
}

Вот как я загружаю Client.dll и пытаюсь вызвать Main Thread, имейте в виду, что фактическое внедрение работает, но не запуск Main Thread.

bool InjectDLL(DWORD ProcessID, const char* Path)
{
    HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);
    if (!Handle)
    {
        std::cout << "Could not access process! Inject Failed!";
        return false;
    }

    LPVOID LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
    LPVOID Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, Allocate, 0, NULL);
    WaitForSingleObject(Thread, INFINITE); // WAIT FOREVER!
    VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE);

    //Start DLL Main Thread
    LPVOID MainThreadAddress = (LPVOID)GetProcAddress(GetModuleHandleA("Client.dll"), "MainThread");
    Allocate = VirtualAllocEx(Handle, NULL, 0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL);

    HANDLE MainThread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)MainThreadAddress, Allocate, 0, NULL);
    WaitForSingleObject(MainThread, INFINITE); // Wait for Main Thread to start
    VirtualFreeEx(Handle, MainThread, strlen(Path), MEM_RELEASE);

    CloseHandle(MainThread);
    CloseHandle(Thread);
    CloseHandle(Handle);
    return true;
}

Спасибо всем, кто может помочь.

1 ответ

Решение

Я не вижу никакой проверки ошибок - особенно для случая, когда вы выбираете адрес "MainThread". Это успешно?

Чтобы это работало, вам нужно явно экспортировать "MainThread" из вашей DLL либо через файл.DEF, либо с помощью __declspec( dllexport ), Смотрите эту ссылку для подробностей.

Другие вопросы по тегам