DLL Inject nie działa - prosty przykład

0

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.

0

Na pierwszy rzut oka OK. Po porównaniu ze swoim (pisanym dość dawno) działającym kodem również ok.

Możesz dodać lepszą obsługę błędów bo tak się składa że OpenProcess i VirtualAlloc to nie jedyne rzeczy które mogą się nie powieść. Na przykład mieszasz typy stringów - projekt kompilujesz jako ascii czy unicode?

A jak wygląda wstrzykiwana biblioteka?

0

Może chodzi o kompilator: uzywam MSVC 2008++ EE
DLL skompilował w trybie C, podobno ma pomóc - nie pomogło.

Wstrzykiwana biblioteka jest podana w 1 poście, lecz podam jeszcze raz:

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;
}

Projekt Unicode. Zmieniłem argument na DLL.dll\0 lecz wciąż nic. Dodam obsługę błędów i zobaczę co wyrzuca.

0

Okej to zwraca błąd:

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;
return false;
}

0

Przepraszam za post pod postem, proszę moderatora o ich połączenie.

Dostaję:

ERROR_ACCESS_DENIED

0

Okej, działa. Wystarczyło dodać:
PROCESS_CREATE_THREAD

0

Przepraszam za ten spam, ale raz zadziałało i już nie chce współpracować i żadna funkcja nie zwraca błędu x_x

0

strzelam ze jakis defender/av blokuje ci virtualalloc

0

Dobra jestem głupi x_x Zapomniałem dać DLL i Injectora tam gdzie exe - już wszystko działa. Dziękuję wszystkim.

1 użytkowników online, w tym zalogowanych: 0, gości: 1