Skocz do zawartości

Wasylo

  • Postów

    26
  • Dołączył

  • Dostępny

  • Donacje

    0.00 PLN 
  • Diamenty

    0 [ Podaruj ]

Posty opublikowane przez Wasylo

  1. 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?

     

    bg.png

  2. 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? 😄

  3. @wiotq

    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;

    @Hacky

    
    	cout << ModuleBaseAddress << endl; // 548012032
    	cout << m_dwLocalPlayer << endl;   // 12974236
    	cout << dwLocalPlayer << endl;     // 0
    	cout << GetLastError();            // 0

     

  4. @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ść.

  5. @krzychu1

    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?"

  6. 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?

  7. 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

  8. 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ą?

  9. @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

  10. @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

  11. Okej działa, to został już ostatni błąd który wywala kompilator

     

    dds.png

     

    @Edit

    Usunąłem "-1" z tej linijki i działa, ale to tak troche bezmyślnie, jak mogłbyś mi Hacky wyjaśnić za co odpowiada ta linijka, a w szczególności to -1 to byłbym wdzięczny :) I dzięki za pomoc w rozwiązaniu poprzednich błędów :)

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Regulamin. Polityka prywatności