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.