EMO Style ForumPro - Hos Geldiniz
Giriş yap

Şifremi unuttum

Istatistikler
Toplam 203 kayıtlı kullanıcımız var
Son kaydolan kullanıcımız: posta59

Kullanıcılarımız toplam 1186 mesaj attılar bunda 862 konu
Tarıyıcı
 Kapı
 Indeks
 Üye Listesi
 Profil
 SSS
 Arama
Arama
 
 

Sonuç :
 


Rechercher çıkıntı araştırma

RSS akısı


Yahoo! 
MSN 
AOL 
Netvibes 
Bloglines 


Anahtar-kelime

pointer  

Kimler hatta?
Toplam 3 kullanıcı online :: 0 Kayıtlı, 0 Gizli ve 3 Misafir

Yok

[ Bütün listeye bak ]


Sitede bugüne kadar en çok 217 kişi C.tesi Tem. 29, 2017 1:46 am tarihinde online oldu.
En son konular
» İnternetten Para Kazandıran Oyun ! Ödeme Alt Limiti Yok ! DEV KONU
Cuma Ağus. 29, 2014 8:33 am tarafından Hello EMO

» goldenchase.net maden yaparak para kazanma
Cuma Ağus. 29, 2014 8:18 am tarafından Hello EMO

» etichal hacker görsel egitim seti
Çarş. Ağus. 06, 2014 4:57 am tarafından Hello EMO

» KO TBL Source C#
Ptsi Ara. 09, 2013 6:36 am tarafından Hello EMO

» x86 Registers
C.tesi Ağus. 24, 2013 5:02 am tarafından Hello EMO

» [Tutorial] Pegando Address, Pointers de WYD
Çarş. Tem. 10, 2013 7:25 am tarafından Hello EMO

» [Tutorial] Pegando Address, Pointers de CS Metodo²
Çarş. Tem. 10, 2013 7:23 am tarafından Hello EMO

» [Tutorial] Aprendendo basico deASM OLLYDBG
Çarş. Tem. 10, 2013 7:22 am tarafından Hello EMO

» Basic C# DLL injector
Ptsi Tem. 08, 2013 7:48 am tarafından Hello EMO

Reklam

[Tutorial] Gamehacking Howto I [German]

Önceki başlık Sonraki başlık Aşağa gitmek

[Tutorial] Gamehacking Howto I [German]

Mesaj tarafından Hello EMO Bir Ptsi Ara. 13, 2010 5:09 am

[QUOTE=Adroxxx;1997062]
[SIZE="5"]Gamehacking Howto I[/SIZE]

Das ist ein etwas größeres Tutorial über Gamehacking. Euch erwartet hier das finden eines Wertes im Speicher, das finden des Pointers und anschließend das Programmieren eines Hacks dafür in C++. Ich hoffe das ich den Anfängern hier eine gute Basis bieten kann andere Spiele zu hacken und eigene Hacks zu schreiben. Ohne AutoIt Razz Außerdem ist das erst der erste Teil. Im zweiten Teil werden noch einige andere Techniken erwarten. Aber das zu gegebener Zeit Razz




#Inhalt:
[-]Voraussetzungen & Programme
[-]Adresse finden
[-]Pointer finden
[-]Hack Programmieren
[-]Nachwort


[SIZE="4"]
[-]Voraussetzungen & Programme[/SIZE]

Voraussetzungen:

  • Grundlegende Erfahrung im Umgang mit Memory Search Programmen
  • Grundlegende Erfahrung im Umgang mit Debuggern
  • Grundlegende ASM Kenntnisse
  • C++ / Visual C++ Kenntnisse
  • Menschenverstand



Programme:

  • Solitär
  • [URL="http://www.cheatengine.org/download.php"]Cheat Engine[/URL]
  • Visual Studio 2005 oder höher


Als Opferspiel nehme ich dieses mal Solitär. Das sollte jeder auf seinem Rechner haben und es ist recht simpel. Und erfüllt auch alle unsere Ansprüche Smile



[SIZE="4"]
[-]Adresse finden[/SIZE]

Als erstes starten wir mal Solitär.


Wir sehen unten Rechts einmal eine Punkteanzeige und eine Zeitanzeige. Wenn wir nun z.B. das Ass oben hinlegen, bekommen wir Punkte und die Zeit fängt an zu laufen.


Ich werde mich in diesem Tutorial nur mit der Punktezahl befassen. Nach diesem Tutorial solltet ihr in der Lage sein die Zeit selbstständig zu hacken Razz

Nun öffnen wir CheatEngine, wählen als Process sol.exe aus und machen uns bereit. Wir wechseln in Solitär und machen ein paar Punkte. Dann wechseln wir schnell in CE und suchen nach dem Wert der unten steht. Wir müssen uns natürlich beeilen, weil die Punkte mit der Zeit ja weniger werden.





Dann warten wir einfach ab bis die Punkte auf 0 gefallen sind und suchen nach 0. Aber was sehen unsere Augen da? Es wir kein Wert mehr angezeigt. CE hat nichts gefunden.



Aber nichts verzagen! Die Lösung ist recht simpel. Wenn wir uns die Memory Scan Options anschauen, haben wir dort 32 Bit gewählt.

Was in den meisten Fällen ja auch richtig ist. Aber wir haben nun das Problem das CE nichts findet. Also wählen wir "All" aus. Somit wird der ganze Speicher Bereich gescannt!

Also wechseln wir nun in Solitär, verschieben ein paar Karten um Punkte zu machen, wechseln wieder schnell in CE und suchen nach dem Punktestand!
Dann warten wir wieder bis die Punkte auf 0 sind und suchen nach 0!
Dann sollten wir dort 1 Adresse stehen haben. Mit einem Doppelklick gelangt diese nun in unsere Adressen Liste.



Wenn wir nun den Wert verändern, z.B. auf 100 haben wir auch in Solitär 100 Punkte.


[SIZE="4"]Pointer finden[/SIZE]

Aber unser Werk ist noch nicht vollendet. Wenn wir jetzt Solitär neustarten würde, könnten wir diese Adresse nicht mehr benutzten. Weil sie sich stätig ändert. Denn wir haben es hier mit einem Pointer oder auf deutsch mit einem Zeiger zu tun. Wir wissen auch nicht ob es mehrere Zeiger sind. Oftmals muss man über 2-3 oder auch 4 Adressen gehen bis wir zu unserem Wert kommen. Wir müssen also den Base Pointer finden. Das ist in den meisten fällen einfach. Wir haben nun zwei Möglichkeiten. Die erste ist wir benutzten den Pointer scanner. Er scannt automatisch den Speicher ab und sucht nach dem Pointer. In einigen Fällen wohl hilfreich, aber kann unter umständen auch ziemlich lang dauer. Aber dabei lernen wir ja nix. Wir machen es von Hand!


Wir machen also einen Rechtsklick auf die Adresse und wählen "Find out what access this address"

Dann öffnet sich der Debugger und wir sehen was auf diese Adresse zugreift.


Wir sehen:
[PHP]mov eax, [edi+30] [/PHP]
Das heißt er holt sich den Wert der in edi+30 steht und verschiebt diesen in eax!
Also müssen wir wissen welche Adresse edi hat. Mit einem doppelklick auf die Zeile öffnet sich das "Extra Info" Fenster.


Und dort sehen wir das EDI den Wert 000AB640 beinhaltet. Jetzt müssen wir nur herausfinden, welche Adresse EDI hat. Also suchen wir nach diesem Wert.
Wichtig ist das wir bei der neuen Suche den Haken bei HEX gesetzt habe. Da unser Wert ja in HEX ist.



Jetzt sehen wir dort 3 Adressen. 1 von denen ist Grün. Das heißt diese Adresse ist der Base Pointer.

Nun müssen wir diese Adresse als Pointer hinzufügen. Wir klicken nun auf Add address manually. Dann öffnet sich ein PopUp und dort machen wir einen Haken bei Pointer.

Dann geben wir die Adresse 01007170 unten bei Address of Pointer ein.
Das war's aber noch nicht! Wir erinnern uns an die mov anweisung.
[PHP]mov eax, [edi+30] [/PHP]
Da wird also noch +30 addiert. Also müssen wir als Offset 30 eingeben.

Mit einem Klick auf Ok fügen wir die Adresse hinzu. Und haben nun unseren Pointer.



[SIZE="4"]
[-]Hack Programmieren[/SIZE]

So natürlich ist es doof immer mittels CheatEngine Solitär zu verändern. Also schreiben wir uns einen kleinen hack dafür.

Ich verwende hier jetzt Visual Studio 2005. Außerdem benutzte ich MFC um die GUI zu machen. Ihr könnt auch eine neuere Version von Visual Studio nehmen. Aber beachtet bitte, das die Kosntelose Express Version kein MFC hat. Das heißt ihr könnt die GUI nicht so machen wie ich. Es gibt ja genügend andere GUI libs, aber wie gesagt ich beziehe mich jetzt hier nur auf MFC. Wie ihr es mit anderen GUIs macht müsst ihr selbst herausfinden Razz

Also wir erstellen uns erstmal einen Dialog. Dazu geht ihr auf Datei -> Neu -> Projekt -> MFC -> MFC Anwendung.
Ich nenne mein Projekt "Solitär Hack".


Bei den Einstellungen, stellen wir auf Dialogfeld basierend:


Und machen den Haken bei ActiveX-Steuerelemente weg!


Dann klicken wir auf Fertigstellen.

Wir gehen in die Ressourcenansicht und fügen unserem Dialog 1 Static Textfeld, 1 Editfeld und 2 Buttons hinzu.


Das Static Feld benennen wir in "Punktestand" um. Und die Buttons in "Lesen" und "Schreiben".



Nun machen wir einen Rechtsklick auf das Editfeld und klicken auf Variable hinzufügen.


Dann öffnet sich ein Pop-Up mit dem Assistenten. Rechts bei Kategorie wählen wir Value.


Der Variablentyp bleibt CString. Und als Variablennamen geben wir m_Value ein.


Dann machen wir einen Rechtsklick auf den "Lesen" Button und klicken auf "Ereignishandler Hinzufügen".

Dann öffnet sich der Assistent und wir wählen (falls nicht schon automatisch ausgewählt ist) BN_CLICKED aus und fügen den Ereignishandler hinzu.


Das gleiche machen wir dann auch nochmal für den "Schreiben" Button.

Dann gehen wir in die Klassenansicht. Dort sehen wir die Klassen die unser Projekt hat.



CAboutDlg ist die Klasse des About Dialoges. Der About Dialog wird automatisch generiert.
CSolitärHackApp ist die Application Klasse. Die ist für uns uninteressant.
CSolitärHackDlg ist die Klasse von unserem Dilaog den wir erstellt haben. Wenn wir da drauf klicken sehen wir da drunter die ganzen Funktionen die in der Klasse sind und auch die Member Variablen. Wir machen einen Rechtsklick auf die Klasse -> Hinzufügen -> Funktion hinzufügen.


Dann öffnet sich unser altbekannter Assistent. Als Rückgabetyp schreiben wir void. Da die Funktion nichts zurückgeben muss. Als Name geben wir m_lesen ein und fügen die Funktion hinzu. Das selbe machen wir nun nochmal und fügen die Funktion m_schreiben hinzu.


So nun genug gespielt. Jetzt gehts an's programmieren.
Wie gehen in's code Fenster und sollten nun das da stehen haben:

[PHP]
void CSolitärHackDlg::OnBnClickedButton1()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
}

void CSolitärHackDlg::OnBnClickedButton2()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
}

void CSolitärHackDlg::m_lesen(void)
{
}

void CSolitärHackDlg::m_schreiben(void)
{
}[/PHP]

Nun rufen wir bei der Funktion OnBnClickedButton1() die funktion m_lesen auf.

[PHP]void CSolitärHackDlg::OnBnClickedButton1()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
m_lesen();
}[/PHP]

Und bei der OnBnClickedButton2 Funktion rufen wir die Funktion m_schreiben() auf.
[PHP]void CSolitärHackDlg::OnBnClickedButton2()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
m_schreiben()
}
[/PHP]

So jetzt wird wenn man den Lesen Button drückt, die m_lesen() Funktion aufgerufen und wenn man den Schreiben Button drückt wird die m_schreiben() Funktion aufgerufen.

Was müssen wir machen?
Wir müssen uns einmal den Window Handle holen. Dann brauchen wir die ProcessID. Außerdem wir müssen die Pointer Adresse berechnen und den Wert holen.

Um den Window Handle zu holen müssen wir uns erstmal 2 Variablen anlegen. Dazu gehen wir in die Klassenansicht und machen einen Doppelklick auf die Klasse CSoliträHackDlg. Damit landen wir im SolitärHackDlg Header. Wenn wir runter scrollen sehen wir auch unsere 2 Funktionen m_lesen() und m_schreiben(). Da drunter legen wir uns 2 Variablen an.
Einmal eine CWnd und eine HWND.

[PHP]
CWnd *pWnd;
HWND hWnd;[/PHP]
CWnd ist eine Klasse von MFC. Diese brauchen wir um uns den Windo Handle zu holen. Und HWND brauchen wir um ums die ProcessID zu holen.

So dann sollte es nun so aussehen:
[PHP]
...
...
public:
void m_lesen(void);
void m_schreiben(void);
CWnd *pWnd;
HWND hWnd;[/PHP]

Dann gehen wir wieder in unsere m_lesen() Funktion.
Um uns den Handle zu holen schreiben wir:

[PHP]pWnd = CWnd::FindWindowExW(NULL,NULL,NULL,_T("Solitär"))[/PHP]
Nun haben wir in der Variable pWnd den Handle gespeichert von Solitär.
Wir müssen aber noch den Handle in die HWND Variable bekommen, das geschiet mit:
[PHP]hWnd = HWND(pWnd->GetSafeHwnd());[/PHP]

Für alle Fälle sollte man auch - um die Fehlersuche später zu erleichtern - eine if Abfrage machen damit wir sicher gehen können dass, das Fenster gefunden wurde.

[PHP]if (pWnd = CWnd::FindWindowExW(NULL,NULL,NULL,_T("Solitär"))) {

hWnd = HWND(pWnd->GetSafeHwnd());

}else{
AfxMessageBox(_T("Fenster nicht gefunden!"));
}[/PHP]

Falls dsa Fenster nun nicht gefunden wird, bekommen wir ein Pop-Up mit der Meldung "Fenster nicht gefunden".

So dann legen wir uns mal die Variablen an. Wir brauchen einmal eine Variable die, die Base Pointer adresse beinhaltet. Dann brauchen wir eine für das Offset und eine für die Adresse auf die der Pointer zeigt. Die unseren Wert beinhaltet. Da wir auch gerad bei Wert sind, dafür brauchen wir auch eine Adresse.

Dann brauchen wir eine Variable die den Process Handle Beinhaltet und eine für die Process Id. Und so sieht es dann aus.

[PHP]
unsigned long address1 = 0x01007170;
unsigned long offset = 0x30;
unsigned long address2 ;
int value ;

DWORD numBytesRead;
HANDLE hProc;
DWORD procID;[/PHP]

Nun holen wir uns die Process Id:

[PHP]
GetWindowThreadProcessId(hWnd,&procID);[/PHP]

und den Handle:
[PHP]hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);[/PHP]

Nun lesen wir den Wert aus den die address1 hat und schreiben es in address2.
[PHP]ReadProcessMemory(hProc, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead);[/PHP]

Nun haben wir unsere neue Adresse in address2 stehen. Aber wir müssen noch den Offset dazurechnen!

[PHP]address2 = address2+offset ;[/PHP]

Nun haben wir unsere Entgültige Adresse. Und können diese nun auslesen und den Wert in value schreiben.

[PHP]ReadProcessMemory(hProc, (LPCVOID)address2, &value, sizeof(int), &numBytesRead);[/PHP]

Jetzt haben wir den Wert der neuen Adresse, die den aktuellen Punktestand beinhaltet in value drin.

Wir erinnern uns an unser Editfeld, was wir angelegt haben. Und die Variable die wir diesem Feld zugewiesen haben. Nun müssen wir den inhalt von value in m_value schreiben.

[PHP]m_Value.Format(_T("%i"),value);[/PHP]

Damit das Editfeld auch aktualisiert wird kommt noch ein
[PHP]UpdateData(false);[/PHP] ans Ende und ein
[PHP]UpdateData(true);[/PHP] an den Anfang.
Und ein
[PHP]CloseHandle(hProc);[/PHP].

So das war's dann. Wir haben unsere Lesen Funktion fertig.

Hier nochmal im ganzen:

[PHP]void CSolitärHackDlg::m_lesen(void)
{
if (pWnd = CWnd::FindWindowExW(NULL,NULL,NULL,_T("Solitär"))) {

hWnd = HWND(pWnd->GetSafeHwnd());

}else{
AfxMessageBox(_T("Fenster nicht gefunden!"));
}
UpdateData(true);
unsigned long address1 = 0x01007170;
unsigned long offset = 0x30;
unsigned long address2 ;
int value ;
DWORD numBytesRead;
HANDLE hProc;

DWORD procID;
GetWindowThreadProcessId(hWnd,&procID);

hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);

ReadProcessMemory(hProc, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead);
address2 = address2+offset ;
ReadProcessMemory(hProc, (LPCVOID)address2, &value, sizeof(int), &numBytesRead);

m_Value.Format(_T("%i"),value);

UpdateData(false);

CloseHandle(hProc);
}
[/PHP]

Jetzt brauchen wir noch eine schreiben Funktion.
Wir können eigentlich alles Kopieren aus der Lesen Funktion. Das Letzte ReadProcessMemory brauchen wir nicht, weil wir ja nicht den Aktuellen Stand lesen wollen. Stattdessen kommt da ein WriteProcessMemory hin.
Außerdem mussen wir uns die Eingabe holen. Also wenn man jetzt was in das Editfeld eingibt, wird das in die m_value geschrieben. m_value ist eine CString Variable und wir müssen diese erst in eine int variable konvertieren und in value schreiben. Das machen wir mit:

[PHP]value = _wtoi (m_Value);[/PHP]

_wtoi macht aus unserem CString eine int Variable und diese wird in int value geschrieben.

Dann müssen wir noch das was in value steht in den Speicher schreiben. Das machen wir mit:
[PHP]WriteProcessMemory(hProc,(LPVOID)address2,&value,sizeof(value),NULL);[/PHP]

Und hier nochmal der ganze Quelltext der Funktion:

[PHP]void CSolitärHackDlg::m_schreiben(void)
{

if (pWnd = CWnd::FindWindowExW(NULL,NULL,NULL,_T("Solitär"))) {

hWnd = HWND(pWnd->GetSafeHwnd());

}else{
AfxMessageBox(_T("Fenster nicht gefunden!"));
}

unsigned long address1 = 0x01007170;
unsigned long offset = 0x30;
unsigned long address2 ;
int value ;
DWORD numBytesRead;
HANDLE hProc;

DWORD procID;
UpdateData(true);

GetWindowThreadProcessId(hWnd,&procID);

hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);

ReadProcessMemory(hProc, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead);
address2 = address2+offset ;

value = _wtoi (m_Value);
WriteProcessMemory(hProc,(LPVOID)address2,&value,sizeof(value),NULL);


UpdateData(false);

CloseHandle(hProc);
}
[/PHP]

Dann kompelieren wir unser Projekt erstmal als Debug ( Grüner Pfeil zum Kompelieren):
Dann starten wir Solitär - falls es nicht mehr offen ist - und starten unseren Hack und drücken auf Lesen. Dann verschrieben wir ein paar Karten, machen Punkte und drücken wieder auf Lesen. Dann sollte sich der Wert in der Editbox ändern. Dann schreiben wir unseren eigenen Wert in die Editbox und drücken auf Schreiben. Dann sollte dieser Wert auch in Solitär unten Rechts stehen. Wenn das Funktioniert, ändern wir das Debug in Release und Kompelieren nochmal. Nun haben wir einen Fertigen Solitär Hack! Glückwunsch Razz


[SIZE="4"]
[-]Nachwort[/SIZE]

Puh, das war wohl bisher mein Längstes Tutorial. Ich hoffe es hat euch so die Basics von Cheat Engine , Pointern und Hacks Programmieren gezeigt.
Ich werde wenn ich mal wieder Lust habe, noch einen zweiten Teil schreiben, wo ich auch einige andere Techniken eingehen werde Razz

Ich hoffe es hat euch gefallen. Falls ihr Fehler findet, könnt ihr euch melden. Bin ja auch nur ein Mensch und diese machen bekanntlich Fehler Razz[/QUOTE]


Hello Kitty
vs
eMoStyLe



avatar
Hello EMO
EMO Team
EMO Team

Cinsiyet : Erkek
Burçlar : Yay
Yılan
Mesaj Sayısı : 935
Puan : 257693
Rep Puanı : 18
Doğum tarihi : 28/11/89
Kayıt tarihi : 21/07/09
Yaş : 28
Nerden : EMO WorlD
İş/Hobiler : RCE Student / Game Hacking / Learn Beginner C#,C++,Delphi
Lakap : EMO

Kullanıcı profilini gör http://emostyle.myforumpro.com

Sayfa başına dön Aşağa gitmek

Önceki başlık Sonraki başlık Sayfa başına dön


 
Bu forumun müsaadesi var:
Bu forumdaki mesajlara cevap veremezsiniz