Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Tworzenie trenera w języku c ++ (win32)
#1
Jest to dość prosty samouczek na temat tworzenia trenerów w języku c ++. Nie jestem ekspertem w tej dziedzinie, tylko pokazuję sposób, w jaki można to zrobić. Pozwoliłem sobie spojrzeć na szablon stworzony przez Nanobot2k, aby zobaczyć, jak to się robi. Nie wyjaśniam wszystkiego o c ++ lub WINAPI, więc podstawowa wiedza jest warunkiem wstępnym.   Przede wszystkim jest komentarz, który musimy dodać:     Zacytować:       # komentarz do komentarza (linker) / FILEALIGN: 512 /MERGE:.rdata=.text /MERGE:.data=.text /SECTION:.text,EWR / IGNORE: 4078 ")         Ok, po pierwsze, potrzebujemy mnóstwa zmiennych.     HWND HandleGameWindow;   Jest to uchwyt do rzeczywistego okna gry, którą chcesz zhackować. Używamy funkcji FindWindow do wyszukiwania tego konkretnego okna.     Zacytować:         HWND FindWindow (LPCTSTR lpClassName, LPCTSTR lpWindowName);     Jeśli lpClassName ma wartość NULL, znajduje dowolne okno, którego tytuł jest zgodny z parametrem lpWindowName.   lpWindowName jest wskaźnikiem do zakończonego znakiem NUL łańcucha, który określa nazwę okna (tytuł okna). Jeśli ten parametr ma wartość NULL, wszystkie nazwy okien są zgodne. Jeśli funkcja się powiedzie, zwróconą wartością jest uchwyt okna, które ma określoną nazwę klasy i nazwę okna. Jeśli funkcja nie działa, zwracana wartość ma wartość NULL.         DWORD pid;   Używamy tego DWORD do przechwytywania identyfikatora procesu. Używamy funkcji GetWindowThreadProcessId, aby uzyskać ten identyfikator.     Zacytować:         DWORD GetWindowThreadProcessId (HWND hWnd, LPDWORD lpdwProcessId);     lpdwProcessId jest wskaźnikiem do zmiennej, która odbiera identyfikator procesu. Jeśli ten parametr nie ma wartości NULL, GetWindowThreadProcessId kopiuje identyfikator procesu do zmiennej.         Potrzebujemy tego ID jako argumentu w naszym wywołaniu funkcji OpenProcess. Używamy tej funkcji do "otwarcia" określonego procesu. Jest to konieczne, aby zapisać się w pamięci konkretnego procesu.     Rękojeść Rękojeść;   Używamy tego uchwytu, aby zapisać uchwyt zwrócony przez OpenProcess.     Zacytować:         HANDLE OpenProcess (DWORD fdwAccess, BOOL fInherit, DWORD IDProcess);     fdwAccess służy do otwarcia procesu, ustaw to na PROCESS_ALL_ACCESS. fInherit można zignorować, po prostu ustawić na 0. IDProcess określa identyfikator procesu procesu do otwarcia (który jest naszym plikiem DWORD pid).         Ok, teraz pokażę najpierw, jak będziemy szukać gry, którą chcesz znaleźć. Robimy to, wykonując małą funkcję, która wyszuka okno gry, do której chcesz wprowadzić trenera. Ponieważ chciałbyś móc zacząć trenera przed rozpoczęciem gry, użyjemy również timera.     Kod:   void FindGame (HWND hwnd, WPARAM wParam, LPARAM lParam) {hwndWindow = FindWindow (NULL, GameWindow); if (hwndWindow) {GetWindowThreadProcessId (hwndWindow, & pid); handle = OpenProcess (PROCESS_ALL_ACCESS, 0, pid); Run = true; // zabijamy timer, ustawiając wartość bool na true)}   Nazywamy tę funkcję naszym zegarkiem. Aby upewnić się, że ten zegar działa tylko wtedy, gdy gra nie zostanie jeszcze znaleziona, używamy wartości logicznej. Kiedy jest ustawione na true, oznacza to, że gamewindow został znaleziony, więc możemy zabić nasz timer.     Kod:   case WM_TIMER: if (! Run) {FindGame (hWnd, wParam, lParam); } else {KillTimer (hWnd, Timer2); }   Rozumiem, że wiesz jak pracować z timerem, do tego używamy oddzielnego timera.   Będziemy potrzebować innego zegara dla naszych skrótów klawiszowych. Ten timer wykonuje funkcję, której użyjemy dla naszych skrótów klawiszowych. Jako przykład podam jeden skrót, z którego można się łatwo objaśnić.     Kod:   void HotKeys () {if (GetAsyncKeyState (VK_NUMPAD1))}   Reszta trenera jest dość łatwa do zrobienia, wszystko, co musimy teraz zrobić, to adresy kart pamięci. Oczywiście chcemy to zrobić po naciśnięciu klawisza skrótu, więc logiczne jest, że ta część jest wykonywana pod rzeczywistym skrótem klawiszowym. Używamy funkcji WriteProcessMemory, aby zapisać w pamięci pewnego procesu.     Zacytować:         BOOL WriteProcessMemory (HANDLE hProcess, LPVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesWritten);     hProcess jest uchwytem zwróconym przez funkcję OpenProcess, która zapewnia pełny dostęp do procesu. lpBaseAddress jest wskaźnikiem do adresu bazowego w określonym procesie. Przed rozpoczęciem przesyłania danych system sprawdza, czy wszystkie dane w adresie bazowym i pamięci o określonym rozmiarze są dostępne do zapisu. Jeśli tak się stanie, funkcja będzie kontynuowana; w przeciwnym razie funkcja nie działa. lpBuffer jest wskaźnikiem do bufora, który dostarcza dane do zapisania w przestrzeni adresowej określonego procesu. Parametr nSize określa wymaganą liczbę bajtów do wpisania w podanym procesie. lpNumberOfBytesWritten jest wskaźnikiem do faktycznej liczby bajtów przesłanych do określonego procesu. Ten parametr jest opcjonalny. Jeśli lpNumberOfBytesWritten ma wartość NULL, parametr jest ignorowany.         Używamy jeszcze jednego variabl
Reply
#2
Rzeczywiście bardzo ładne, dobra robota.
Reply
#3
Niezły kolega z pracy, dzięki za wkład
Reply
#4
Będziesz także miał lepszą wydajność całego systemu, jeśli przeniesiesz wszystkie swoje funkcje do wątku. Oznacza to również, że musisz napisać kod zabezpieczający wątek.
Reply




Users browsing this thread: 1 Guest(s)