Trainer face pe C vizual

În acest articol vă voi arăta cum să faci un antrenor, folosind Visual C ++. La scrierea acestui articol am împins faptul că, atunci când am încercat să găsesc pe internet, cel puțin unele informații cu privire la modul de a face un antrenor simplu în VC, tot ce am găsit au fost articole care prezintă exemple de C / C ++, și în principal, în Delphi și MASM. S-ar părea că, în această situație a fost posibil să se utilizeze materialul de articole pe C / C ++, dacă nu un „dar“ - un atașament puternic clase VC ++, în urma cărora unele funcții API nu se comportă așa cum ar trebui. Mai târziu, va deveni clar.







Asta e ceea ce avem nevoie:

Jocul în sine. Am ales un RPG interesant - Avernum 3 (ia)

Programul de tip GameHack TSearch sau cauta noi valori specifice în memorie. Prefer TSearch, pentru că, în opinia mea, aceasta este cea mai funcțională a tuturor acestor programe. Deși problema de alegere a fiecărui. (Ia departe)

Visual C ++. Eu ar trebui să versiunea 6.0, astfel încât tutorial se va face pe el. Versiunea nu este foarte principială, după cum știți :)

HP character'a 0x00C1C050 primele 2 octeți
MP character'a 0X00C1C054 primii 4 octeți

HP doua character'a 0x00C1C420 2 octeți
MP doilea character'a 0x00C1C424 4 octeți

HP a treia character'a 0x00C1C7F0 2 octeți
MP treia character'a 0x00C1C7F4 4 octeți

HP a patra character'a 0x00C1CBC0 2 octeți
MP patra character'a 0x00C1CBC4 4 octeți

Ne întoarcem la cel mai important și creativ procesul - scriere Trainer nostru. Să facem, desigur, folosind funcția API, deoarece va fi mai ușor, iar programul va rula mult mai rapid. Aici avem nevoie de o funcție (a se vedea descrierea lor în referința Win32 API):

SetTimer
FindWindow
GetThreadProcessId
OpenProcess
WriteProcessMemory
GetAsyncKeyState
KillTimer
CloseHandle

Teper va crea un nou proiect pentru Trainer buduyuschego. Start Visual C și Davie Fișier-> Nou. În fereastra care apare, alegeți tipul de MFC AppWizard (exe), numele proiectului, formați - Avernum3tr. Davie următor. Selectați Dialog pe bază. În continuare. Apoi, debifați Active X și caseta Despre - ei ne dau nu nafig nevoie. Toate Davie Finish și pentru a primi cadru. După cum puteți vedea AppWizard a generat dialogovoo fereastra pentru noi, ca o mulțime de cod care inițializează o mulțime de prostii. Puteți șterge imediat text static și două butoane de pe fereastra - acestea sunt, de asemenea, inutile.

Numele Clasa - CAvernum3trDlg
ID obiect - CAvernum3trDlg
Funcții membre - OnIntiDialog

și faceți clic pe Editare cod. Deoarece această funcție a fost creată, vom ajunge la o bucată de cod al funcției care se numește atunci când creați fereastra noastră. Acolo ne-am inițializa cronometrul nostru. Adăugat înainte de a reveni linia de coasere ADEVĂRAT:

SetTimer (1, 100, NULL);

Astfel, la lansarea trainerul nostru, va crea un cronometru. care va trimite un mesaj la WM_TIMER nostru fereastră de aproximativ 4 ori pe secundă (un al doilea parametru). Dar, odată ce am creat un cronometru la pornire, este necesar să-l distrugă la ieșirea din Trainer. Davie Ctrl + W din nou și a adăugat funcția WM_DESTROY (gândi clar cum) și codul PUSH Editare. Scrie acolo:

OK, trece la ceasul procesorului. Ctrl + W și adaugă funcția WM_TIMER și du-te la codul său. Aici. Această funcție va fi numit de fiecare dată când timer-ul va funcționa. După cum ați înțeles deja, atunci vom scrie codul care va fi responsabil pentru prinderea taste apăsate și trebuie să facem ceva pentru care, de fapt, creează un antrenor :)







Aici vom ajunge la punctul, de ce. De fapt, multe dintre articolele despre scrierea Formator C / C ++ nu funcționează în VC. Încercați să scrie FindWindow funcția de corpul funcției ON_WM_TIMER (vezi și ieșit la suprafață indiciu despre parametrii funcției:

CWnd * FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

si compara cu ceea ce avem nevoie:

HWND FindWindow (LPCTSTR lpszClassName, LPCTSTR plszWindowName);

Faptul că prima opțiune este o funcție membru al clasei de ferestre noastre (Știu, chto sună complicat, dar cu toate acestea), și, prin urmare, returnează un tip ușor diferit. Ce este de făcut. Și vom face asta aici - crea propria clasă generică independentă, vom folosi nu numai în acest prog. Dacă avem o astfel de clasă, atunci data viitoare, atunci când scrie următorul antrenor, tu trebuie doar să adăugați clasa la proiect, vpisheshsya în function timer corp doar câteva linii (mai târziu vei înțelege de ce) și toate - gata. Asta, prietene, clase - doar super-oportunitate OEP. Da, desigur, va dura ceva timp acum, dar o mare salvați-l mai târziu. Nu mă crezi - uite.

Degetele ventilator - clasa lepim:

Chiar în fereastra ClassView, selectați tab-ul și faceți clic pe butonul din dreapta al claselor Avernum3tr. Selectați New Class. În fereastra care apare, alegeți:

Tipul de clasă generică de clasă
Nume CProcess

și Davie OK și veți vedea că el a apărut în lista claselor de proiect. Dacă apăsați pe pictograma „+“ de lângă numele noii noastre de clasă, veți vedea, există două funcții de membru - constructor si destructor.
Acum, voi arăta cum să adăugați o singură funcție, iar restul pe care le-ați adăugat. Țineți clic dreapta pe clasa noastră și selectați Adăugați funcția de membru. În fereastra rezultată, scrie următoarele:

MÂNER de acționare Tip
Funcția Declarațiile cOpenProcess (char * p_ClassName, char * p_WindowName)
accesul publicului

HWND hWindow;
DWORD pid;

hWindow = FindWindow (p_ClassName, p_WindowName);
if (hWindow)
GetWindowThreadProcessId (hWindow, pid);
întoarce. OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
>
întoarce NULL;

Ar trebui să primiți următoarele:

MÂNER CProcess :: cOpenProcess (char * p_ClassName, char p_WindowName *)
HWND hWindow;
DWORD pid;

hWindow = FindWindow (p_ClassName, p_WindowName);
if (hWindow)
GetWindowThreadProcessId (hWindow, pid);
întoarce. OpenProcess (PROCESS_ALL_ACCESS, FALSE, pid);
>
întoarce NULL;
>

În același Makarov a scrie următoarele funcții:

bool CProcess :: FindProcess (char * p_WindowTitle)
if (proces == NULL)
proces = this-> cOpenProcess (NULL, p_WindowTitle);
>
if (proces)
isrunning = TRUE;
isrunning reveni;
>
altfel
return false;

bool CProcess :: IsRunning ()
isrunning reveni;
>

bool CProcess :: IsKeyPressed (tasta int)
în cazul în care (IsRunning ()) retur ((GetAsyncKeyState (cheie) 1) == 1);
return false;
>

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

if (isrunning)
întoarcere (WriteProcessMemory
(Procedeul (void *) (p_Adress), (void *) (p_Value), 1, bytes) = 0)!;
>
return false;
>

Oh, da, am aproape am uitat - adaugă la clasa două variabile private (dreapta clic-> Adăugați o variabilă membru):

MÂNER pocess
bool isrunning

Deschideți fila (dreapta) fișierul FileView Avernum3trDlg.cpp și în partea superioară (după toate scriere # include'ov:

Acest lucru va crea o variabilă globală de tip CProcess numit joc. Deci, vom vorbi cu clasa noastră și cu jocul (prin ea)

Acum, înapoi la funcția noastră ON_WM_TIMER. Înscriem există această piesă - Cred că ar trebui să apară înțelegerea problemelor:

dacă (check)
game.FindProcess ( "Avernum 3");
>
altfel
if (game.IsKeyPressed (VK_F4))
game.WriteByteToProcess (0x00c1c050, 0xFF);
game.WriteByteToProcess (0x00c1c051, 0x10);
>

în cazul în care ((cec! GetAsyncKeyState (VK_F4)))
MessageBox ( "Zapusti igru ​​snachala.", "Lameru", MB_OK);
>

Acum, compila proiectul și rulați-l. Un fel ar trebui să fie nici o problema - rescriere, cum ar fi la domiciliu. Nu alerga un joc, apăsați F4 - blestemele de captură. Acum începe jocul, de a crea un caracter. și în jocul de presă F4 - câștiga bonusuri de sănătate. Alte opțiuni de umplere în sine - este pentru tine ca temă de casă.