Witam, chciałem nauczyć się tej techniki więc napisałem prosty program w którym dodaję albo odejmuję wartości od zmiennej i je wyświetlam, wygląda tak:
int main()
{
int liczba = 0;
char znak;
for (;;)
{
std::cin >> znak;
if (znak == '+')
liczba++;
if (znak == '-')
liczba--;
if (znak == 'k')
break;
std::cout << "Wartosc: " << liczba << std::endl;
}
return 0;
}
Napisałem przykładowe 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);
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return true;
}
Oraz injector z kursu:
bool Wstrzyknij(char* nazwa_dll,int PID)
{
HANDLE Proces = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION,false,PID);
if (!Proces)
{
std::cout << "Nie udalo sie otworzyc procesu" << std::endl;
return false;
}
void* adres = VirtualAllocEx(Proces,NULL,strlen(nazwa_dll)+1,MEM_COMMIT | MEM_RESERVE,PAGE_READWRITE);
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");
HANDLE WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"LoadLibraryA"),adres,0,NULL);
WaitForSingleObject(WWatek,INFINITE);
DWORD AdresDLL;
GetExitCodeThread(WWatek,&AdresDLL);
CloseHandle(WWatek);
VirtualFreeEx(Proces,adres,0,MEM_RELEASE);
WWatek = CreateRemoteThread(Proces,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(Kr32,"FreeLibrary"),(void*)&AdresDLL,0,NULL);
WaitForSingleObject(WWatek,INFINITE);
CloseHandle(WWatek);
return true;
}
int main()
{
int PID = 0;
std::cout << "Podaj PID:" << std::endl;
std::cin >> PID;
if (!Wstrzyknij("DLL.dll",PID))
std::cout << "Nie udalo sie" << std::endl;
else
std::cout << "Udalo sie" << std::endl;
getch();
return 0;
}
Wsadziłem DLL.dll do katalogu z Injectorem no i uruchomiłem pierwszy progam, zobaczyłem jego PID w Menedżerze Zadań i podałem i program wypisuje: "Udalo sie" lecz nigdzie nie pojawia się MessageBox.