Wasylo
-
Postów
26 -
Dołączył
-
Dostępny
-
Donacje
0.00 PLN -
Diamenty
0 [ Podaruj ]
Typ zawartości
Profile
Forum
FAQ
Quiz
Posty opublikowane przez Wasylo
-
-
Czesc, mam krótkie pytanie:
Da się jakoś wyciągnąć ip graczy na serwerze?
0 -
Do kasacji
0 -
Cześć, mam pytanie - znalazłem sobie komórkę której szukałem, sprawdzam co nadpisuje ten adres, dostałem tam 2 rezultaty i przypuszczalny adres również nie jest stały. Kliknąłem poszukiwacza wskazników dla tego adresu i znalazłem 4 interesujące wiersze, skopiowałem je sobie i tylko 1 pasował - tzn przechowywał wartosc tego czego szukałem i wygląda to w ten sposob (zdj):
Napisałem sobie programik w c++
value = BaseAddress modułu xxx.exe + 02CB1...
value = value + 0xC
Odczytuje zawartosc komórki value bo jest to pointer i do tej odczytanej wartosci dodaje 4EC i jestem w domu o tą komórke mi chodziło. Przy zamknięciu aplikacji wciąż działa, super. Tylko problem jest w tym, ze na innym komputerze te offsety są zupełnie inne, a nawet jest ich więcej np. 3 offsety. Co zrobic, żeby chodziło na każdym kompie?
0 -
Cześć mam szybkie pytanko, robie triggera i cały kod rozumiem poza jedną linijką :
cheat.Read(ClientBaseAddress + EntityBase + ((CrossHairID - 1) * EntLoopDist));
Client + EntityBase = offset jednostki
jednostka + (CorssHair - 1) = ??
jednostka + ?? * ??? = ????
1. Na co wskazuje: ClientBaseAddress + EntityBase + ((CrossHairID - 1)?
2. Czemu przy CrossHairID jest -1?
3. Czemu to jest mnożone przez 0x10?
Wytłumczy mi ktos? 😄
0 -
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, pid); MODULEENTRY32 ModuleEntry32; ModuleEntry32.dwSize = sizeof(MODULEENTRY32); do { if (_tcsicmp(ModuleEntry32.szModule, "client_panorama.dll") == 0) { ModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr; break; } } while (Module32Next(hSnapshot, &ModuleEntry32));
DWORD m_dwLocalPlayer = 0xC5F89C;
cout << ModuleBaseAddress << endl; // 548012032 cout << m_dwLocalPlayer << endl; // 12974236 cout << dwLocalPlayer << endl; // 0 cout << GetLastError(); // 0
0 -
Cześć, mam taki problem. Zmieniły się offsety i teraz jak dodaje ten nowy offset dwLocalPlayer do bazowego adresu modułu client_panorama.dll to zwraca mi 0.
ReadProcessMemory(hProcess, (LPCVOID)(ModuleBaseAddress + m_dwLocalPlayer), &dwLocalPlayer, sizeof(DWORD), 0);
0 -
Ale ten nowy antywirus czy inny program, żeby powodował vaca musiałby modyfikować cos w procesie csa. A robi to? Jak tak to w jakim celu?
0 -
@Hacky Legitny proces? Wydaje mi sie, że programistycznie można zdefiniować jakie procesy/moduły mają dostęp do danych komórek pamięci. A każdy inny proces po próbie nadpisania jakiejś komórki aktywuje vaca, albo przynajmniej wysyła jakis raport do valve. Bo jaki legitny proces modyfikując dane innego procesu ma dobre zamiary?
@expl0it A to antywirusy modyfikują komórki pamięci innych procesów? Bo co innego czytać ich zawartość.
0 -
Sygnatura czyli rozumiem, że wykrywa jak używany kod jest w ich db 1:1, a po lekkiej modyfikacji kodu juz jest ud. Troche tez bez sensu bo mogloby wykrywać po samej próbie nadpisania komorki pamięcie z "nieznanego" procesu. Dlaczego to tak nie działa? 😄
0 -
Cześć, mam pytanie, czy proces csgo nie wykrywa, że inny proces ma do niego uchwyt i wykonuje operacje takie jak ReadProcessMemory i WriteProcessMemory? Bo to troche dziwne jest jakby nie wykrywał, a z drugiej strony jak wykrywa to z miejsca vac powinien lecieć. Jak to jest?
0 -
A no i wszystko jasne, dzięki 😉
0 -
No okej, mniej więcej rozumiem, ale wytłumacz mi to z tą flagą bo tego nie czaje
"W zmiennej Client mam adres bazowy pliku client.dll , w zmiennej m_dwLocalPlayer mam offset. Do zminnej dwLocalPlayer przypisuje wartość obiektu LocalPlayer na podstawie adresu bazowego + offsetu. No bo mem.Read zwraca zawartość komórki pamięci.
A skoro tak, to nie rozumiem linijki
BYTE flags = mem.Read<BYTE>(dwLocalPlayer + m_fFlags);
funkcja mem.Read przyjmuje przeciez adres komórki którą ma odczytać i zwraca jej zawartość. To dlaczego jako parametr podawana jest wartość jakiejś komórki zamiast jej adres + offset?"
0 -
Czytałem żeby nie używać process_all_access, ale oczywiście tego też próbowałem i jest to samo.
Co do CloseHandle to robiłem już na wszystkie sposoby czyli:
1. All access
2. Open w trybie do odczytu -> odczyt -> nadpisanie uchwytu na tryb do zapisu -> zapis
3. Open w trybie do odczytu -> odczyt -> zamknięcie uchwytu -> open w trybie do zapisu -> zapis -> zamknięcie uchwytu
Kod co wysłałem to ta trzecia juz próba i zdaje sobie sprawe ze jest napisany z dupy, ale napisałem to tylko w ramach testu bo jakby nie patrzeć to powinno to działać, a to w jaki sposób jest napisany to swoją drogą i w tym momencie nie istotne.
Oczywiście ta wersja również zwraca to samo, bo jest to to samo co napisałem wczesniej tylko nie otwieram i zamykam uchwytu milion razy w pętli
HANDLE hProcess; hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pid); DWORD dwLocalPlayer; BYTE flags; ReadProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwLocalPlayer), &dwLocalPlayer, sizeof(long), 0); while (1) { ReadProcessMemory(hProcess, (LPVOID)(dwLocalPlayer + m_fFlags), &flags, sizeof(char), 0); if(GetAsyncKeyState(VK_SPACE) & 0x8000) if (flags & (1 << 0)) { WriteProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwForceJump), (LPCVOID)6, sizeof(int), 0); cout << GetLastError() << endl; break; } }
A BaseAddress pobieram z tej funkcji:
DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName) { DWORD_PTR dwModuleBaseAddress = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcID); if (hSnapshot != INVALID_HANDLE_VALUE) { MODULEENTRY32 ModuleEntry32; ModuleEntry32.dwSize = sizeof(MODULEENTRY32); if (Module32First(hSnapshot, &ModuleEntry32)) { do { if (_tcsicmp(ModuleEntry32.szModule, szModuleName) == 0) { dwModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr; break; } } while (Module32Next(hSnapshot, &ModuleEntry32)); } CloseHandle(hSnapshot); } return dwModuleBaseAddress; }
@Edit
Już działa, źle napisałem 1 argument w funkcji WriteprocessMemory a dokładnie (LPCVOID)6
Tylko jeszcze jednej rzeczy nie rozumiem w tej pascie co pobrałem.
Kod:
#include "ProcMem.h" #include <string> using namespace std; ProcMem mem; DWORD Client; DWORD m_dwLocalPlayer = 0xAB9D9C; DWORD m_fFlags = 0x100; DWORD m_dwForceJump = 0x4F2FA78; int main() { mem.Process("csgo.exe"); Client = mem.Module("client.dll"); DWORD dwLocalPlayer = mem.Read<DWORD>(Client + m_dwLocalPlayer); while (1) { BYTE flags = mem.Read<BYTE>(dwLocalPlayer + m_fFlags); if (GetAsyncKeyState(VK_SPACE) & 0x8000) if (flags & (1 << 0)) mem.Write(Client + m_dwForceJump, 6); } return 0; }
A więc w zmiennej Client mam adres bazowy pliku client.dll , w zmiennej m_dwLocalPlayer mam offset. Do zminnej dwLocalPlayer przypisuje wartość obiektu LocalPlayer na podstawie adresu bazowego + offsetu. No bo mem.Read zwraca zawartość komórki pamięci.
A skoro tak, to nie rozumiem linijki
BYTE flags = mem.Read<BYTE>(dwLocalPlayer + m_fFlags);
funkcja mem.Read przyjmuje przeciez adres komórki którą ma odczytać i zwraca jej zawartość. To dlaczego jako parametr podawana jest wartość jakiejś komórki zamiast jej adres + offset?
0 -
HANDLE hProcess; hProcess = OpenProcess(PROCESS_VM_READ, false, pid); DWORD dwLocalPlayer; BYTE flags; ReadProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwLocalPlayer), &dwLocalPlayer, sizeof(long), 0); while (1) { ReadProcessMemory(hProcess, (LPVOID)(dwLocalPlayer + m_fFlags), &flags, sizeof(char), 0); if(GetAsyncKeyState(VK_SPACE) & 0x8000) if (flags & (1 << 0)) { hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, pid); WriteProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwForceJump), (LPCVOID)6, sizeof(int), 0); cout << GetLastError() << endl; break; } }
@Edit fakt poknociłem xD czytam w petli stan flagi majac uchwyt w trybie do zapisu moj błąd.
@Edit 2
Ale to nic nie zmienia bo nawet jak teraz na szybko poprawiłem kod na:
while (1) { hProcess = OpenProcess(PROCESS_VM_READ, false, pid); ReadProcessMemory(hProcess, (LPVOID)(dwLocalPlayer + m_fFlags), &flags, sizeof(char), 0); CloseHandle(hProcess); if(GetAsyncKeyState(VK_SPACE) & 0x8000) if (flags & (1 << 0)) { hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, pid); WriteProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwForceJump), (LPCVOID)6, sizeof(int), 0); CloseHandle(hProcess); cout << GetLastError() << endl; break; } }
To wciąż nie zapisuje i zwraca kod błedu 299
0 -
Pomyślałem, że napisze to auto bh bez tej klasy ProcMem. I juz praktycznie wszystko zrobiłem tzn.
1. Pobieram id procesu
2. Wyciągam adres bazowy client.dll
3. Otwieram proces w trybie do odczytu, pobieram dw_LocalPlayer i flagi
4.W pętli otwieram proces w trybie do zapisu
Ta pętla:
while (1) { ReadProcessMemory(hProcess, (LPVOID)(dwLocalPlayer + m_fFlags), &flags, sizeof(char), 0); if(GetAsyncKeyState(VK_SPACE) & 0x8000) if (flags & (1 << 0)) { hProcess = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, false, pid); WriteProcessMemory(hProcess, (LPVOID)(BaseAddress + m_dwForceJump), (LPCVOID)6, sizeof(int), 0); cout << GetLastError() << endl; break; } }
I wszystko działa, przy spacji wchodzi do ifa z flagą tylko nie zapisuje mi funkcja WriteProcessMemory. Po wywołaniu GetLastError dostaje error code = 299, a definicja tego błądu z dokumentacji brzmi :
ERROR_PARTIAL_COPY
299 (0x12B)
Only part of a ReadProcessMemory or WriteProcessMemory request was completed.
Co może być przyczyną?
0 -
@Hacky
"W kodzie binarnym najbardziej znaczący bit świadczy o znaku liczby – gdy jest równy 1, to liczba jest ujemna, gdy 0 – dodatnia. Wyjątkiem jest liczba zero, która w zależności od kodowania może ten bit mieć ustawiony albo wyzerowany."
Coś mi tu nie pasuje bo skoro najbardziej znaczący bit wynosi 1 to liczba jest ujemna, w takim razie jak zapisać dodatnią liczbe 255 w 1 bajcie? skoro 11111111 da -255 bo bit o największej wadze to 1
0 -
A jaka jest różnica pomiędzy && a &?
0 -
@krzychu1 Analizuje sobie kod na auto bh i tam jest taka linijka:
if (GetAsyncKeyState(VK_SPACE) && 0x8000)
I nie wiem za co odpowiada to && 0x8000. Wiem już ze ta funkcja
(GetAsyncKeyState(VK_SPACE)
Zwraca albo 0 kiedy spacja jest up albo -32768 kiedy spacja jest down. Przez dodanie && 0x8000(32768) funkcja ta zwraca albo 0 albo 1
Wgl jak mam czytać zawartość tego ifa? Jezeli funckja && liczba. Na początku myslalem ze moze sumuje wynik z funkcji i 0x8000 ale to by dalo 0 albo 32768, a zwraca 1 albo 0
0 -
-
Na Process działa, ale na Module jest troche inaczej bo jest tam wpisany typ LPSTR, program mi podpowiada ze to jest typedef CHAR *LPSTR, ale nigdzie nie ma definicji tego typedefa.
0 -
Cześć, mam problem z ProcMem. Wszystko na screenie
@WALDEk Help męczę się z tym juz z 6 godzin i brakuje mi pomysłów :/
0
Uruchamianie w kernel mode
w Dyskusje / problemy związane z programowaniem
Opublikowano
Jak uruchomić kod z uprawnieniami ring0. Za jakieś wskazówki/linki będe wdzięczny 😉