[C++] Kombinuję z injekcją DLLki

0

Witajcie :)
Ostatnio postanowiłem poszerzyć swoje umiejętności w programowaniu, zatem zabrałem się za injekcję DLL do aplikacji. Do testów wybrałem grę Tibia ze względu na prostotę, generalnie w nią nie gram wcale.

W związku z tym uczyniłem coś takiego:
Aplikacja:

int32_t main()
{
	char DLL[256] = "hook.dll";

	HWND Tibiaclient = FindWindow(NULL, "Tibia");

	DWORD dwProcessId;
	GetWindowThreadProcessId(Tibiaclient, &dwProcessId);

	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);


	LPVOID lpRemoteAddress = VirtualAllocEx(hProcess, 0, strlen(DLL), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

	WriteProcessMemory(hProcess, lpRemoteAddress, (LPVOID)DLL, strlen(DLL), 0);
	CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"), lpRemoteAddress, 0, 0);

	VirtualFree(lpRemoteAddress, strlen(DLL), MEM_RELEASE);
}

DLLka:

#include <windows.h>
HANDLE hFile;
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
        switch (ul_reason_for_call)
        {
			case DLL_PROCESS_ATTACH:
				MessageBox(HWND_DESKTOP, "Attached!", "Yesh", MB_OK);
				break;

			case DLL_PROCESS_DETACH:
				break;
        }
        return TRUE;
}

Jest to część kodu, reszta nie jest wam (chyba) potrzebna. Problem tkwi w tym, że nie pokazuje MessageBoxa przy injekcji. Dlaczego? Jak to naprawić?

Używam NetBeans (Linux Ubuntu) i kompiluję przez MinGW - tak dla pewności, gdyby ktoś pytał :)

Pozdrawiam i z góry dziękuję za wszelką pomoc.

0

Każdy program ma swój aktualny katalog roboczy, prawda? LoadLibrary wykonuje się w kontekście zdalnego procesu, korzystając z jego ścieżki poszukiwania - zapewne nie znajduje tego, co leży gdzieś głęboko zaszyte u Ciebie. Podaj pełną ścieżkę do pliku. Zaś bufor na ścieżkę trzymaj w rozmiarze MAX_PATH i pilnuj żeby nie przekroczyć - sensownie korzystaj z API.

BTW, coś Wam to przypomina? Tak, ten sam idiotyczny błąd wynikający z prawie-że-przeczytania-dokumentacji jaki popełniło w cholerę ludzi, który teraz jest sławną 'podatnością' w Windows. Sytuacja o tyle zabawna, że wszystko było udokumentowane od początku, kilkanaście lat temu w design guidelines było podane żeby na to uważać, kiedy wychodził XP to Microsoft nie wprowadzał SafeDllSearchMode po cichu, pisali wprost o co chodzi, w SP2 domyślnie włączyli, powody podali. Tylko oczywiście kto by czytał dokumentację, tak jak autor tegoż wątku...

Kolejna sprawa - jak jeszcze raz zobaczę PROCESS_ALL_ACCESS to zamorduję, to jeszcze gorsze niż "Tibia". Nigdy nie żądaj większych praw niż aktualnie potrzebujesz.

Z łaski swojej sprawdzaj czy wykonywane czynności się powiodły, to nie czysto funkcyjny świat (chociaż ciekawe efekty można uzyskać podchodząc do mechaniki kodu maszynowego itd. z punktu widzenia rachunku lambda).

Idąc dalej - odpalasz wątek i nawet nie czekasz na jego zakończenie, od razu zwalniasz pamięć. Co w tym złego? Ano to, że potencjalnie wątek może nawet nie ruszyć zanim mu stringa z argumentu sprzątniesz.

...ale przecież Ty nic nie zwalniasz, kolejny raz wykazałeś się prawie-że-przeczytania-dokumentacji:

Dokumentacja VirtualFreeEx:

MEM_RELEASE 0x8000

Releases the specified region of pages. After the operation, the pages are in the free state.

If you specify this value, dwSize must be 0 (zero), and lpAddress must point to the base address returned by the VirtualAllocEx function when the region is reserved. The function fails if either of these conditions is not met.

Tyle na pierwszy rzut oka.

Ech, kolejny hakier w okresie (u)buntu...

// 'int32_t main()' jest już naprawdę 1337...

0
deus napisał(a)

Każdy program ma swój aktualny katalog roboczy, prawda? LoadLibrary wykonuje się w kontekście zdalnego procesu, korzystając z jego ścieżki poszukiwania - zapewne nie znajduje tego, co leży gdzieś głęboko zaszyte u Ciebie. Podaj pełną ścieżkę do pliku. Zaś bufor na ścieżkę trzymaj w rozmiarze MAX_PATH i pilnuj żeby nie przekroczyć - sensownie korzystaj z API.

BTW, coś Wam to przypomina? Tak, ten sam idiotyczny błąd wynikający z prawie-że-przeczytania-dokumentacji jaki popełniło w cholerę ludzi, który teraz jest sławną 'podatnością' w Windows. Sytuacja o tyle zabawna, że wszystko było udokumentowane od początku, kilkanaście lat temu w design guidelines było podane żeby na to uważać, kiedy wychodził XP to Microsoft nie wprowadzał SafeDllSearchMode po cichu, pisali wprost o co chodzi, w SP2 domyślnie włączyli, powody podali. Tylko oczywiście kto by czytał dokumentację, tak jak autor tegoż wątku...

Kolejna sprawa - jak jeszcze raz zobaczę PROCESS_ALL_ACCESS to zamorduję, to jeszcze gorsze niż "Tibia". Nigdy nie żądaj większych praw niż aktualnie potrzebujesz.

Z łaski swojej sprawdzaj czy wykonywane czynności się powiodły, to nie czysto funkcyjny świat (chociaż ciekawe efekty można uzyskać podchodząc do mechaniki kodu maszynowego itd. z punktu widzenia rachunku lambda).

Idąc dalej - odpalasz wątek i nawet nie czekasz na jego zakończenie, od razu zwalniasz pamięć. Co w tym złego? Ano to, że potencjalnie wątek może nawet nie ruszyć zanim mu stringa z argumentu sprzątniesz.

...ale przecież Ty nic nie zwalniasz, kolejny raz wykazałeś się prawie-że-przeczytania-dokumentacji:

Dokumentacja VirtualFreeEx:

MEM_RELEASE 0x8000

Releases the specified region of pages. After the operation, the pages are in the free state.

If you specify this value, dwSize must be 0 (zero), and lpAddress must point to the base address returned by the VirtualAllocEx function when the region is reserved. The function fails if either of these conditions is not met.

Tyle na pierwszy rzut oka.

Ech, kolejny hakier w okresie (u)buntu...

// 'int32_t main()' jest już naprawdę 1337...

Dziękuję za odpowiedź. Kod wygląda teraz następująco:

	char DLL[MAX_PATH] = {0};
	GetFullPathName("hook.dll", MAX_PATH, DLL, NULL);

	HWND Tibiaclient = FindWindow(NULL, "Tibia");
	if(Tibiaclient)
		std::cout << "Klient zostal znaleziony. " << std::endl;
	else
		std::cout << "Klient nie zostal znaleziony. " << std::endl;

	DWORD dwProcessId;
	if(!GetWindowThreadProcessId(Tibiaclient, &dwProcessId))
		std::cout << "Blad! " << std::endl;

	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);
	if(!hProcess)
		std::cout << "Nie udalo sie otworzyc procesu Tibii! " << std::endl;


	LPVOID lpRemoteAddress = VirtualAllocEx(hProcess, 0, strlen(DLL), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	if(!lpRemoteAddress)
		std::cout << "Nie udalo sie zaalokowac do procesu! " << std::endl;

	HANDLE hThread;
	WriteProcessMemory(hProcess, lpRemoteAddress, (LPVOID)DLL, strlen(DLL), 0);
	hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"), lpRemoteAddress, 0, 0);
	if(hThread)
		WaitForSingleObject(hThread, INFINITE);
	else
		std::cout << "Nie udalo sie stworzyc watku! " << std::endl;

	VirtualFree(lpRemoteAddress, strlen(DLL), MEM_RELEASE);

PROCESS_ALL_ACCESS na razie nie zmieniam, ja jedynie chcę na razie sprawić, by to zadziałało, nie mam zamiaru nikomu tego wysyłać, ani publikować. Później, gdy już DLLka zadziała, zacznę całość optymalizować i zabezpieczyć przed niechcianymi 'wyciekami'. :)

W każdym razie jak nie uruchomię klienta, mam każdy błąd po kolei (to oczywiste), jak uruchomię klienta i aplikację, jest zaś napisane:

Klient zostal znaleziony.

I nic poza tym, niestety, msgbox jak się nie pokazywał, tak nadal się nie pokazuje. Ścieżka działa poprawnie, sprawdzałem.

A zbaczając już nieco z tematu mam osobistą prośbę - Czy mógłby Pan z łaski swojej nie przerzucać swoich złości, nie wiem, złego dnia (albo wieczora) na mnie? Jeżeli coś Panu dolega, albo ma Pan kłopoty rodzinne, to nie argumentuje Pana do wyżywania się na mnie. Pana zachowanie można porównać do niechcianego obowiązku pomagania. Ja staram się być miły, fakt, że wiedzy jeszcze za dużej nie posiadam, ale staram się i uczę, a tacy ludzie, którzy starają się uprzykrzać, tylko demotywują człowieka do dążenia do celów. To chyba oczywiste, że skoro piszę na forum, oczekuję pomocy - ale niekoniecznie gotowego rozwiązania, aczkolwiek bardzo rzadko udzielam się na forach w sprawie pomocy, bo zwykle sam dochodzę do rozwiązania. Niestety, tutaj byłem zmuszony skorzystać z pomocy na forum i co? Oberwało mi się, że raz na rok proszę kogoś o pomoc.

A hakerem nie jestem, a przynajmniej nie mam nim zamiaru nigdy być, chcę się po prostu uczyć i poszerzać wiedzę. Ma Pan do mnie jakieś "pretensje", że używam ubuntu? Używam wolnego oprogramowania i jest mi z tym bardzo dobrze. Nienawidzę microsoftowego softu.

Pozdrawiam serdecznie.

0

Przepraszam za spam, ale :
"Ech, kolejny hakier w okresie (u)buntu..."

Boskie! :)

0

@up & Deus - true, genialne :)

  1. Jezeli FindWindow zwroci NULL to po co wykonujesz GetWindowThreadProcessId, OpenProcess itd ? Przeciez ich wynik jest oczywisty. O to chodzilo Deusowi, jak napisal zebys sprawdzal czy operacje sie powiodly. I jak sprawdzasz bledy to dodaj info, jaki blad wystapil - GetLastError().
  2. Zamiast ViretualFree, powinno byc VirtualFreeEx i poczytaj uwaznie o parametrach jakie ta funkcja przyjmuje. Z reszta 2 posty wyzej jest napisane, gdzie popelniles blad...
  3. Sprawdz czy WriteProcessMemory i VirtualFreeEx wykonaly sie poprawnie.
    Nie wiem prawde mowiac czy to wszystko, wiecej na szybko nie zauwazylem.
0

Zlituj się i nie pisz per 'pan'.

Kod nadal jest nierewelacyjny. W każdym razie nie jest już tak spieprzony żeby nie działał. Krótka piłka - albo pliku nie ma tam, gdzie go szukasz, albo się do niczego nie nadaje. W ostateczności można podpiąć pod Tibię debugger z breakiem na evencie utworzenia wątku, wyjść z LoadLibrary i sprawdzić stanu błędu.

Gdybyś chciał się uczyć to nie celowałbyś w Tibię. Piszesz, że 'uczyniłeś' to co wkleiłeś, faktycznie tylko to śmieszne 'int32_t main()' jest Twoje, resztę z podrzędnego forum pełnego hakierów 'pożyczyłeś'. W tym miejscu muszę przeprosić za opieprzenie, opieprzyć należy nieudolnego autora kodu, który sobie 'pożyczyłeś'. Ciekawe, że ta dllka, której wycinek dałeś, to akurat dziwnym trafem część hooka na klawiaturę...

Nienawidzisz Microsoftu, ale pchasz się z buciorami w ich system, próbując robić brzydkie rzeczy na najpopularniejszym celu ataków wśród młodzieży. Całkowicie nieprzydatne na innych systemach rzeczy. Ciekawe dlaczego nie załapałeś o co chodzi z okresem buntu...

Do wolnego oprogramowania nic nie mam, wolę szybkie. Nienawidzę script kiddie.

0

Dokładnie, chłopaczyna jeszcze się tłumaczy, że nie gra w tę grę. Na bank próbuje napisać keylogger'a.

0
Diskrt napisał(a)

Dokładnie, chłopaczyna jeszcze się tłumaczy, że nie gra w tę grę. Na bank próbuje napisać keylogger'a.
Są prostsze sposoby na zrobienie keyloggera niż grzebanie w procesie...

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