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.