Witam, mam DLLkę, Injector'a i aplikację. Wszystko działa pięknie, lecz gdy chcę wstrzyknąć DLLkę jeszcze raz bez wyłączania docelowej aplikacji to po prostu nie działa.
Za 1 razem jest tak:
-DLL wyświetla komunikat o tym że się udał Inject
-Zmienia wartość zmiennej
-DLL wyświeta komunikat o tym że DLL zostało zwolnione
-DLL wyświeta komunikat o tym że DLL zostało zwolnione
Nie mam pojęcia dlaczego dwa razy, tak jakby dwa razy było wywołane: DLL Detach
Za 2 razem jest tak:
-DLL wyświeta komunikat o tym że DLL zostało zwolnione
-DLL wyświeta komunikat o tym że DLL zostało zwolnione

Kod DLL:

BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
    switch(reason)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(NULL,L"Injected",L"Udalo sie",MB_OK);
        *((DWORD*)0x12FF34) = 2200;
        break;
    case DLL_PROCESS_DETACH:
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        MessageBox(NULL,L"Dejected",L"Udalo sie",MB_OK);
        break;
    }
    return TRUE;
}

Kod Injectora:

bool Wstrzyknij(const char* nazwa_dll,int PID)
{
    HANDLE Proces = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD,false,PID);
    if (!Proces)
    {
        std::cout << "Nie udalo sie otworzyc procesu" << std::endl;
        return false;
    }
    void* adres = VirtualAllocEx(Proces,NULL,strlen(nazwa_dll),MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
    if (adres == NULL)
    {
        std::cout << "VirtualAclloEx nie zadzilalo" << std::endl;
        return false;
    }
    if (!WriteProcessMemory(Proces,adres,(LPVOID) nazwa_dll,strlen(nazwa_dll),NULL))
    {
        std::cout << "Nie udalo sie zapisac nazwy dll do procesu" << std::endl;
        return false;
    }
    HMODULE Kr32 = GetModuleHandle(L"kernel32.dll");
    if (Kr32 == NULL)
    {
        std::cout << "GetModuleHandle nie zadzialalo" << std::endl;
        return false;
    }
    HANDLE WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"LoadLibraryA"),adres,0,NULL);
    if (WWatek == NULL)
    {
        std::cout << "Watek nie zostal utworzony1" << std::endl;
        std::cout << GetLastError() << std::endl;
        return false;
    }
    WaitForSingleObject(WWatek,INFINITE);
    DWORD AdresDLL;
    GetExitCodeThread(WWatek,&AdresDLL);
    CloseHandle(WWatek);
    if(!VirtualFreeEx(Proces,adres,0,MEM_RELEASE))
    {
        std::cout << "VirtualFreeEx nie zadzialo" << std::endl;
    }
    WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"FreeLibrary"),(void*)&AdresDLL,0,NULL);
    if (WWatek == NULL)
    {
        std::cout << "Watek nie zostal utworzony2" << std::endl;
        return false;
    }
    WaitForSingleObject(WWatek,INFINITE);
    CloseHandle(WWatek);
    CloseHandle(Proces);
    return true;
}
 
int main()
{
    int PID = 0;
    while (true)
    {
 
        std::cout << "Podaj PID:" << std::endl;
        std::cin >> PID;
        std::string dllka;
        std::cout << "Podaj nazwe DLLki:" << std::endl;
        std::cin >> dllka;
        if (dllka == "K")
            break;
        dllka += "\0";
        if (!Wstrzyknij(dllka.c_str(),PID))
            std::cout << "Nie udalo sie" << std::endl;
        else
            std::cout << "Udalo sie" << std::endl;
    }
    getch();
    return 0;
}

Z góry dziękuję za jakiekolwiek odpowiedzi.