Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 00:23

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Gamehacking] Gamehacking mit C++ für Anfänger.

Discussion on [Gamehacking] Gamehacking mit C++ für Anfänger. within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
BlackFog's Avatar
 
elite*gold: 105
Join Date: Mar 2007
Posts: 5,073
Received Thanks: 558
[Gamehacking] Gamehacking mit C++ für Anfänger.

Moin,
Da hier ziemlich wenig los ist, möchte ich sie mal mit einem kleinen Tutorial zum Thema "Gamehacking" bereichern. Dabei habe ich mir ein Programm als "Opfer" ausgesucht, dass eigentlich jeder hat und jeder kennt: Windows Solitär .

Zuerst mal was ihr braucht/wissen müsst:

- Grundlegende C++ Kentnisse

- Eine C++ IDE. Ich benutze Visual C++ Express Edition 2008. (Gibts hier: )

- TSearch (Gibts hier: )

- Windows XP (Das Offset ist unter anderen Windows Versionen (wahrscheinlich) anders. Jedoch sollte es kein Problem sein, dass auch für andere Windows Versionen umzusetzen .

- Ihr müsst wenigstens Ansatzweise verstehen, wie man bei Solitär Punkte macht . Wenn nicht -> Wikipedia .
-Etwas Zeit

Was wir machen möchten:

Wir möchten die Speicheradresse des Punktestandes in Solitär herausfinden und dann eine C++ Programm schreiben, dass den Wert in unseren Wert verändert.


Also, los geht's .

Zuerst öffnen wir TSearch und Solitär. Dann wählen wir in Tsearch den Solitär Prozess aus()

Jetzt müssen wir das Offset, die Speicheradresse in der die Punktzahl gespeichert ist, finden.
Zuerst klicken wir hierfür auf die kleine Lupe und wählen als unseren Startwert 0 ein. Logisch , oder ? Wir starten ja mit 0 Punkten ()

Jetzt müssen wir etwas machen, dass die Punkte erhöht. Dann klicken wir auf die Lupe mit den drei Punkten und wählen "Has Increased"( deu: "Hat sich erhöht" ) aus. Also suchen wir nach einem Wert, der mal 0 war aber sich nun erhöht hat. ()
Klickt auf Ok und anschließen wir euch ein kleines Fenster angezeigt, dass sagt, wieviele "Kanidaten" noch zur Auswahl stehen. Schließt das Fenster mit einem Klick auf OK.

So nun lassen wir unseren Punktestand wieder auf 0 sinken und dann erhöhen wir die Punkte wieder. Dann klicken wir schnell wieder auf die kleine Lupe mit den drei Punkten und wählen "Exact Value" im Dropdown Menü. Dann geben wir schnell den momentanen PunkteWert ein und klicken auf OK. Dann sollte eigentlich nur noch ein Wert übrig bleiben. Falls das nicht so ist, führt ihr das Spielchen weiter, bis nur noch ein Wert übrig ist.

Eure Speicheradresse müsste unter Windows XP eigentlich "A5060" sein. Ich habe das ganze mehr als 10mal getestet(Mit neustart des Systems und der Programme) und die Adresse hat sich nicht verändert. Deswegen denke ich, dass die Adresse statisch ist. D.H, dass egal auf welchem Windows XP(Durch Servicepacks könnte das ganze abweichen) ihr das Offset sucht; es sollte überall gleich sein.

Nun erhöhen wir noch einmal den Punktestand und gucken, ob sich der Wert der Adresse ändert. In meinem fall tut es das . ()

Jetzt da wir unsere Adresse kennen, können wir beginnen ein Programm zu schreiben, dass diesen Wert verändert.


Unser kleiner Hack:


Viele werden sich jetzt warscheinlich Fragen: Wie zum Teufel änder ich einen Wert mit C++ ???
Keine Sorge, es ist garnicht mal so schwert .

Erstellt eine neue, leere Konsolenapplikation.
Zuerst beginnen wir mal mit unserem Grundgerüst:
Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{




cin.get(); //Damit sich unser Programm nicht sofort schließt...
}
Das sollte jeder kennen. Nun werden einige warscheinlich etwas neues lernen. Zu allererst möchten wir das Fensterhandle von Solitär herausfinden. Das Fensterhandle ist ein ganzzahliger Wert, der ein Fenster oder ein Steuerelement identifiziert. In C++ werden solche Fensterhandles in dem Variablentyp "HWND" gespeichert. Mit der Funktion FindWindow können wir dann das Fensterhandle bekommen.

Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{
HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
hwnd = FindWindow(0,L"Solitär");

// Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 

if(!hwnd) // Also das Fenster nicht vorhanden ist...
{
	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
}
else  // ansonsten...
{
	cout << "Solitär gefunden!" << endl; // gebe das aus
        cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
}


cin.get(); //Damit sich unser Programm nicht sofort schließt...
}
So diesen Code ausprobieren und dann gehts weiter. Jetzt müssen wir die ID des Thread's bekommen, den das Fenster erzeugt hat. Die ID brauchen wir später noch. (Wenn ihr nicht wisst was ein Thread ist, ist nicht ganz so tragisch. Bei Gelegenheit mal bei Wikipedia nachlesen )
Also los, hier der Code:

Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{
HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
hwnd = FindWindow(0,L"Solitär");
DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.

// Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 

if(!hwnd) // Also das Fenster nicht vorhanden ist...
{
	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
}
else  // ansonsten...
{
	cout << "Solitär gefunden!" << endl; // gebe das aus
        cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
       
        GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.

        cout << Id << endl;

}


cin.get();//Damit sich unser Programm nicht sofort schließt...
}
So jetzt ist es nicht mehr weit . Jetzt öffnen wir den Prozess damit wir endlich hineinschreiben können... Zuerst erstellen wir uns eine Variable die unser Handle zum offenen Prozess hält. Diese ist vom Typ "Handle". Dann öffnen wir den Process mit OpenProcess.

Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{
HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
hwnd = FindWindow(0,L"Solitär");
DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.
HANDLE ProcessHandle;

// Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 
if(!hwnd) // Also das Fenster nicht vorhanden ist...
{
	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
}
else  // ansonsten...
{
	cout << "Solitär gefunden!" << endl; // gebe das aus
        cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
       
        GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.

        cout << Id << endl;
        ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
	
	cout << "ProcessHandle: " << ProcessHandle << endl;


}


cin.get(); //Damit sich unser Programm nicht sofort schließt...
}
Die ersten Parameter sind unsere "Rechte" die wir für den Prozess haben. PROCESS_VM_WRITE bedeutet, dass wir in den Prozess schreiben dürfen und PROCESS_VM_OPERATION bedeutet, dass wir im Prozess operieren dürfen. Das zweite Parameter gibt an, ob von unserem "Opfer" Prozess erzeugte Prozesse das Handle erben sollen. Setzen wir auf false. Das dritte Parameter ist unsere ThreadID.
So jetzt wo der Prozess offen ist können wir nun endlich in ihn schreiben. Das machen wir mit "WriteProcessMemory".

Code:
#include <windows.h> // Hier sind die Funktionen die wir später noch brauchen
#include <iostream> // Sollte klar sein

using namespace std; // Sollte auch klar sein ...

int main()  // Unsere Main Funktion...
{
HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
hwnd = FindWindow(0,L"Solitär");
DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.
HANDLE ProcessHandle;
int value; // Der Wert den wir schreiben wollen.
unsigned adress = 0x0A5060; // Unsere Adresse

// Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung.. 

if(!hwnd) // Also das Fenster nicht vorhanden ist...
{
	cout << "Solitär nicht gefunden!" << endl; // Gebe das aus
}
else  // ansonsten...
{
	cout << "Solitär gefunden!" << endl; // gebe das aus
        cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
       
        GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.

        cout << Id << endl;
        ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
	
	cout << "ProcessHandle: " << ProcessHandle << endl;

       cout << "How much points to add? "; // Wieviel Punkte sollen geschrieben werden ???
	cin >> value; // Den Wer übernehmen
	fflush(stdin);

	
	
	WriteProcessMemory(ProcessHandle,(LPVOID)adress,&value,sizeof(int),NULL);  // Den Wert schreiben !
	cout << "Wert geschrieben" << endl;
	cin.get();// Damit sich unser Programm nicht sofort schließt...
}



}

Erstmal habe ich eine int Variable mit dem Namen "value" erstellt. Sie hält den Punktestand den wir schreiben wollen. Außerdem die Adresse von Typ unsigned (int). Dann wir der zu schreibende Wert mit einem cin abgefragt und dann die Funktion WriteProcessMemory aufgerufen.
Das erste Parameter ist unser Handle zum offenen Prozess. Das zweite Parameter unsere zu LPCVOID konvertierte Adresse. Das dritte Parameter der zu schreibende Wert. Das vierte Parameter gibt an, wieviel Bytes wir schreiben wollen. Das letzte Parameter gibt die geschriebenen Bytes an. Ist hier unwichtig also NULL.

Also das wars und ich hoffe ihr konntet etwas lernen. Bei Fragen etc. PN oder im Thread.


Mfg
Blackfog
BlackFog is offline  
Thanks
139 Users
Old 01/09/2009, 13:52   #2
 
Vulcanraven's Avatar
 
elite*gold: 0
Join Date: May 2006
Posts: 7,808
Received Thanks: 4,570
Bevorzuge aber eher Cheat Engine,
btw Quellen oder selber geschrieben?

#sticky
Vulcanraven is offline  
Old 01/09/2009, 14:01   #3
 
BlackFog's Avatar
 
elite*gold: 105
Join Date: Mar 2007
Posts: 5,073
Received Thanks: 558
Hmm mit Cheatengine habe ich keinen Wert raubekommen o_O. Und ja, ich habe alles selbst geschrieben. Hätte nicht gedacht, dass das soviel Arbeit wird ... ;D
BlackFog is offline  
Thanks
2 Users
Old 01/11/2009, 10:25   #4



 
Daniiii's Avatar
 
elite*gold: 260
Join Date: Nov 2007
Posts: 12,855
Received Thanks: 4,319
wow.. nett
Daniiii is offline  
Old 01/11/2009, 14:12   #5
 
DamageBreaker's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 358
Received Thanks: 43
danke hilft mir sehr weiter obwohl ich einiges schon kenne^^ trotzdem niicee
DamageBreaker is offline  
Old 01/11/2009, 18:29   #6
 
BlackFog's Avatar
 
elite*gold: 105
Join Date: Mar 2007
Posts: 5,073
Received Thanks: 558
Danke, bin froh, dass ich helfen konnte
BlackFog is offline  
Thanks
2 Users
Old 01/15/2009, 17:15   #7
 
Da_Killa's Avatar
 
elite*gold: 0
Join Date: Sep 2006
Posts: 114
Received Thanks: 21
Sehr nice !!!!
Schön zu sehn das sich leute noch die mühe machen und solche tutorials schreiben

+Thanks :P
Da_Killa is offline  
Thanks
2 Users
Old 01/20/2009, 19:22   #8
 
elite*gold: 0
Join Date: Jan 2008
Posts: 167
Received Thanks: 24
sehr schön =)
vielen dank für deine mühe war ja viel zu schreiben!!
hast mir echt weiter geholfen damit x)
weiter so *gg*

+thanks =)
suyu is offline  
Old 01/20/2009, 19:22   #9
 
elite*gold: 0
Join Date: Jan 2008
Posts: 167
Received Thanks: 24
sehr schön =)
vielen dank für deine mühe war ja viel zu schreiben!!
hast mir echt weiter geholfen damit x)
weiter so *gg*

+thanks =)
suyu is offline  
Old 01/20/2009, 21:47   #10
 
DamageBreaker's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 358
Received Thanks: 43
vllt kann mir ja jem helfen...wie friere ich einen wert ein per c++ muss imer ne while schleife nehmen gibt es da nichts effizienteres?
DamageBreaker is offline  
Old 01/21/2009, 08:45   #11
 
verT!c4L's Avatar
 
elite*gold: 0
Join Date: Aug 2005
Posts: 1,245
Received Thanks: 60
Wie sonst willste denn eine Variable "einfrieren", vorallem wenn es nicht dein eigener Prozess ist ?
Ich glaub ich poste mal was weiterführendes
verT!c4L is offline  
Old 01/21/2009, 16:48   #12
 
DamageBreaker's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 358
Received Thanks: 43
Quote:
Originally Posted by verT!c4L View Post
Wie sonst willste denn eine Variable "einfrieren", vorallem wenn es nicht dein eigener Prozess ist ?
Ich glaub ich poste mal was weiterführendes
denkste da an einen debugger? XD glaube mitm debugger würds gehen
DamageBreaker is offline  
Old 02/25/2009, 17:11   #13
 
xBananex's Avatar
 
elite*gold: 0
Join Date: Feb 2009
Posts: 279
Received Thanks: 22
also bai mir geht der download von der 2oo8 express dings net
xBananex is offline  
Old 02/26/2009, 17:12   #14
 
DamageBreaker's Avatar
 
elite*gold: 0
Join Date: Nov 2008
Posts: 358
Received Thanks: 43
Quote:
Originally Posted by xBananex View Post
also bai mir geht der download von der 2oo8 express dings net
admin rechte oder inet probs?
DamageBreaker is offline  
Old 03/08/2009, 18:15   #15
 
TrueYami's Avatar
 
elite*gold: 0
Join Date: Aug 2008
Posts: 1,256
Received Thanks: 314
Super tutorial !
Hat mich viel neues gelehrt =]
TrueYami is offline  
Reply


Similar Threads Similar Threads
[How To]Gamehacking für anfänger(AutoIT)
08/22/2010 - Coding Tutorials - 4 Replies
Hi, Ich dacht mir ich stelle mal ein kleinen Tutorial hier rein für anfänger die einen Hack erstellen wollen. Was braucht man: -AutoIT -die Normad Memory -Cheat Engine 5.6 -Ein zu hackendes Spiel (in diesem fall Solitaire)



All times are GMT +1. The time now is 00:24.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.