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.