Trainer csinálni Visual C

Ebben a cikkben megmutatom, hogyan kell egy edző, a Visual C ++. Az írás ezt a cikket toltam a tény, hogy amikor megpróbálja megtalálni az interneten legalább néhány információt arról, hogyan lehet egy egyszerű edző a VC, csak olyat találtam voltak cikkekbe példa a C / C ++, és főleg a Delphi és MASM. Úgy tűnik, hogy ebben a helyzetben nem volt lehetséges, hogy az anyag a cikkeket C / C ++, ha nem egy „de” - egy erős kötődés VC ++ osztályok, melynek következtében az egyes API funkciók nem úgy viselkednek, ahogy kellene. Később világossá válik.

Ez az, amit meg kell:

A játék maga. Azért választottam egy érdekes RPG - Avernum 3 (elvenni)

A program írja GameHack TSearch vagy keressen az adott nekünk memória értékei. Inkább TSearch, mert véleményem szerint ez a leginkább működőképes az összes ilyen programok. Bár a választás kérdése minden. (Vedd el)

Visual C ++. Kéne 6.0 verzió, így a bemutató lesz rajta. Version nem nagyon elvi, mint tudjuk :)

HP character'a 0x00C1C050 első 2 byte
MP character'a 0X00C1C054 első 4 byte

HP második character'a 0x00C1C420 2 bájt
MP második character'a 0x00C1C424 4 bájt

HP harmadik character'a 0x00C1C7F0 2 byte
MP harmadik character'a 0x00C1C7F4 4 bájt

HP negyedik character'a 0x00C1CBC0 2 byte
MP negyedik character'a 0x00C1CBC4 4 bájt

Azt viszont, hogy a legfontosabb és kreatív folyamat - írásban a tréner. Tegyünk, persze, az API függvény, mert könnyebb lesz, és a program sokkal gyorsabban fog futni. Itt kell egy funkciót (lásd a leírást a Win32 API referencia)

SetTimer
FindWindow
GetThreadProcessId
OpenProcess
WriteProcessMemory
GetAsyncKeyState
KillTimer
CloseHandle

Teper létrehoz egy új projekt buduyuschego Trainer. Indítsa el a Visual C és Davie File-> New. A megjelenő ablakban válaszd típusát MFC AppWizard (exe), a projekt neve, dial - Avernum3tr. Davie gombra. Válassza Dialog alapú. Következő. Ezután törölje az Aktív X és About box - adnak nekünk nafig nincs szükség. Minden Davie Befejezés és fogadni keretben. Mint látható AppWizard generált dialogovoo ablak számunkra, mint egy csomó kód inicializálja a sok értelmetlen. Akkor azonnal törli statikus szöveget és két gomb az ablak - ők is felesleges.

Osztály neve - CAvernum3trDlg
Object ID-- CAvernum3trDlg
Member funkciók - OnIntiDialog

és kattintson a Szerkesztés kódot. Mivel ez a funkció azért hozták létre, megkapjuk egy darab kódot a funkciót, hogy az úgynevezett létrehozásakor ablakunk. Ott inicializálni a stoppert. Hozzáadott visszatérés előtt TRUE varrás sor:

SetTimer (1, 100, NULL);

Így a dob edzõnk létrehoz egy időzítőt. hogy küld egy üzenetet, hogy az ablakunk WM_TIMER mintegy 4-szer másodpercenként (a második paraméter). De ha egyszer már létrehoztunk egy időzítő induláskor, meg kell pusztítani a kilépés a tréner. Davie Ctrl + W újra és hozzáadunk WM_DESTROY funkció (tisztán gondolkodni, hogyan), és nyomja szerkesztése kódot. Írja van:

OK, lépni a processzor. Ctrl + W, és hozzáteszi WM_TIMER funkciót, és megy a kódot. Itt van. Ez a funkció kerül meghívásra minden alkalommal az időmérő fog működni. Ahogy már érthető, akkor fogjuk írni a kódot, amely felelős a fogása gombnyomás, és tennünk kell valamit, ami valójában létrehoz egy edző :)

Itt vagyunk, hogy eljusson a lényeg, hogy miért. Tény, hogy sok a cikkek írásával Trainer C / C ++ nem működött a VC. Próbálj meg írni a függvény törzsében ON_WM_TIMER funkció FindWindow (és látni felszínre nyom a funkció paraméterei:

CWnd * FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

és hasonlítsd össze, amire szükségünk van:

HWND FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

Az a tény, hogy az első lehetőség tagja funkció az osztály a mi ablakok (tudom, chto hangzik bonyolult, de mégis), ezért tér vissza egy kicsit más típusú. Mit kell tenni. És mi fog tenni, hogy itt - hozzon létre saját önálló generikus osztály fogjuk használni nem csak ebben a prog. Ha van egy ilyen osztály, akkor a következő alkalommal, amikor írsz a következő edző, csak add az osztályban, hogy a projekt vpisheshsya a szervezet működésében időzítő csak egy pár sort (később meg fogod érteni, hogy miért), és az összes - készen áll. Ez, barátom, osztályok - csak szuper lehetőség PLO. Igen, persze, hogy némi időt vesz igénybe most, de nagy mentse el később. Ne hidd el - néz.

Fingers fan - lepim osztály:

Jobb a ClassView ablakban válassza ki a lapot, majd kattintson a jobb gombbal Avernum3tr osztályok. Válassza az Új Osztály. A megjelenő ablakban válassza ki:

Class típusú Generic Class
Név CProcess

és Davie OK, és látni fogja, hogy megjelent a listán az osztályok a projekthez. Ha megnyomja a „+” jelre a neve az új osztály, látni fogja két tag funkciók - konstruktor és destruktor.
Most megmutatjuk, hogyan kell hozzáadni egy funkció, és a többi te vettél fel. Tartsa a jobb gombbal a mi osztály és válassza az Új tag funkciót. A megjelenő ablakban, írja a következőket:

Funkció jellegű fogantyú
Funkció nyilatkozatok cOpenProcess (char * p_ClassName, char * p_WindowName)
hozzáférés Public

HWND hWindow;
DWORD pid;

hWindow = FindWindow (p_ClassName, p_WindowName);
if (hWindow)
GetWindowThreadProcessId (hWindow, pid);
visszatéréshez. OpenProcess (PROCESS_ALL_ACCESS, HAMIS, PID);
>
NULL;

Meg kell kapni a következő:

FOGANTYÚ CProcess :: cOpenProcess (char * p_ClassName, char * p_WindowName)
HWND hWindow;
DWORD pid;

hWindow = FindWindow (p_ClassName, p_WindowName);
if (hWindow)
GetWindowThreadProcessId (hWindow, pid);
visszatéréshez. OpenProcess (PROCESS_ALL_ACCESS, HAMIS, PID);
>
NULL;
>

Ugyanebben Makarov levelet a következő funkciókat:

bool CProcess :: FindProcess (char * p_WindowTitle)
ha (folyamat == NULL)
folyamat = this-> cOpenProcess (NULL, p_WindowTitle);
>
ha (folyamat)
isrunning = TRUE;
visszatérés isrunning;
>
más
return false;

bool CProcess :: IsRunning ()
visszatérés isrunning;
>

bool CProcess :: IsKeyPressed (int) gombot
if (IsRunning ()) return ((GetAsyncKeyState (kulcs) 1) == 1);
return false;
>

bool CProcess :: WriteByteToProcess (DWORD p_Adress, BYTE p_Value)
DWORD byte;

if (isrunning)
return (WriteProcessMemory
(Process, (void *) (p_Adress), (void *) (p_Value), 1, bájt) = 0!);
>
return false;
>

Ja, majdnem elfelejtettem - Add hozzá a class két magán változók (jobb Click> Add member változó):

FOGANTYÚ pocess
bool isrunning

Nyissa meg a lapot (jobbra) FileView Avernum3trDlg.cpp fájlt, és a tetején (elvégre # include'ov write:

Ez létrehoz egy globális változó típusú CProcess nevű játék. Így fogunk beszélni, hogy mi osztály és a játék (rajta)

Most térjünk vissza a ON_WM_TIMER funkciót. Helyezni Van ez a darab - Azt hiszem, a megértést a probléma merül fel:

if (! check)
game.FindProcess ( "Avernum 3");
>
más
if (game.IsKeyPressed (VK_F4))
game.WriteByteToProcess (0x00c1c050, 0xFF);
game.WriteByteToProcess (0x00c1c051, 0x10);
>

if ((! check GetAsyncKeyState (VK_F4)))
MessageBox ( "Zapusti igru ​​snachala.", "Lameru", MB_OK);
>

Most fordítsd le a projektet, és futtatni. Kind nem lehet gond - újraírás, mint például otthon. Ne fuss a játékot, nyomja meg az F4 - fogás átkok. Most indul a játék, hozzon létre egy karaktert. és nyomja meg az F4 játék - átveheti egészségügyi bónuszok. További lehetőségek kitöltése is - az, hogy Ön, mint a házi feladatot.