short, german Win95 - training tutorial by defiler [blizzard] - v1.103
----------------------------------------------------------------------

Tools, die man brauchen wird (oder auch nicht):

	GeHirn v0.1
	SoftICE (3.XX)
	(Win32DASM)
	(Pen and paper ;)
	GameHack v2.0

Inhalt:

I.	Beschreibung der 1. Methode
II.	Beschreibung der 2. Methode
III.	Kurze GameHack - Anleitung
IV.	Was tun, wenn man die Adresse gefunden hat
V.	Wie bekomme ich *unendlich* Geld usw.
VI.	Wie schreibe ich einen Trainer

I. Methode 1:
-------------

Die gesuchte Adresse via Soft-ice suchen:
Wert aus dem spiel (geld usw.) in Hex umrechnen. am besten grosse Werte
wie aus starcraft etc.(da diese Werte seltener im Speicher gefunden werden,
als kleine werte). Hex Wert in Intel-Hex umrechnen (bsp.: 1234 -> 3412).
Diesen Wert in DATA: 30:0 bis 30:FFFFFFFF suchen.
(DATA befindet sich *IMMER* von 30:0 bis 30:FFFFFFFF, CODE *IMMER*
von 28:0 bis 28:FFFFFFFF !!!)
(s 30:0 lFFFFFFFF 34,12 - meistens befindet sich der gesuchte Wert im Bereich
30:00400000 bis 30:00700000).Mit dem Befehl 's' ohne Parameter sucht man
mit dem gleichen Pattern nach weiteren Adressen. Auf die 'aufflligen' Adressen
einen breakpoint setzen: 'bpm(b/w/d) adresse'.
Das Spiel solange weiterspielen, bis sich der wert ndert (Leben/Geld etc.).
Wenn man die richtige Adresse erwischt hat, dann msste man jetzt 
in Soft-Ice zurcksein. Softice meldet sich dann mit dem breakpoint und der 
adresse. 		   (Break due to BPMB/W #0030:adresse W DR3).
         ________________________________________________|
         |
Diese Adresse ist hchstwahrscheinlich die gesuchte Adresse.
Diese schreibt man sich am besten mal auf.
Dann kann man den Inhalt der Adresse mal vorsichtig ndern (e adresse - 
ABER keine zu hohen werte !!!). Jetzt disabled man die Breakpoints (bd *).
Man spielt weiter und achtet auf eine Vernderung des Wertes.
Wenn nicht, dann gibt es entweder noch eine andere Routine, die auf
diese Speicherstelle zugreift(diese verndert oder sie ausliest), oder man
hat die falsche Adresse erwischt ;). Jetzt alle Breakpoints wieder en-ablen (be *)
Dann kann man die alte Adresse lschen (bc <falscher_breakpoint>), oder sie disablen.
Beim Weiterspielen achtet man auf eine nderung des wertes im Spiel 
(z.B. das Geld).Zurck in Soft-ice ? wenn nicht, dann neuen Wert in intel
hex umrechnen und von vorne beginnen.

II. Methode 2:
--------------

Man benutzt Programme, wie etwa Gamehack, um die Adressen heraus-
zufinden.

III. Wie funktioniert Gamehack?
-------------------------------

1. 
Man startet das zu trainende Spiel,merkt sich die Anzahl der Leben usw.
(eben den Wert, den man trainen mchte), pausiert dann das Spiel und kehrt
zu Windows zurck (Alt-Tab etc.)

2. 
Dann startet man Gamehack, klickt auf den Process-Button und
whlt den Prozess des Spiels, das man trainen mchte.
Dann klickt man auf 'First' und schreibt in die Textbox die Zahl der
gerade im Spiel verfgbaren Leben usw. rein.

3.
Man wechselt zurck ins Spiel ('Alt-Tab'), wartet, bis
sich der Wert verndert (bis man ein Leben oder Geld usw. verliert), pausiert
wieder und wechselt zurck zu Gamehack, klickt auf next und schreibt in die
Textbox den neuen Wert hinein.

Man wiederholt Schritt 3 solange, bis man die gewnschte Adresse
gefunden hat.

(Fr eine ausfhrliche Beschreibung von Gamehack siehe Tutor_i.htm)

IV. Adresse gefunden
--------------------

Wenn die richtige Adresse endlich gefunden wurde, schreibt man sich diese auf
oder speichert sie, wenn man sie mit Hilfe von Gamehack gefunden hat.
In dieser Adresse steht nun die Anzahl des Geldes,
oder wonach man eben gesucht hat. 

Die Werte aus dieser Adresse kann man (in Soft-ICE) mit 'e adresse' ndern 
(nicht zu hoch setzen, sonst knnte das Spiel abstrzen!)
FFFFh reicht meistens fr geldwerte, 63h fr die anzahl der leben vllig aus.

V. Unendlich Geld
-----------------

Wenn man sich unendlich Geld/Leben verschaffen mchte, dann setzt man
einen Breakpoint auf die gefundene Adresse, jedoch nur auf 
schreibzugriffe! (auf das folgende 'W' fr 'write' achten) :

entweder :BPM  adresse W
oder	 :BPMW adresse W

Spielt man jetzt weiter, dann springt man bei jedem Schreibzugriff, den
das Spiel auf die Adresse macht, zurck in soft-ice. 
jetzt hlt man einfach nach folgenden anweisungen ausschau 
(meistens vor dem schreibzugriff auf den Speicher):

DEC BYTE PTR blahblah
DEC WORD PTR laber
INC BYTE PTR blahblah
INC WORD PTR laber
SUB [beliebige_adresse],Zahl
ADD [beliebige_adresse],Zahl

oder JE/JZ/JNE/JNE OFT AUCH JB/JG/JGE/JL usw oder weitere sprnge

Der Rest ist dann eben Reverse engineering... hehe
die SUBs und DEC BYTE/WORD PTRs kann man meistens rausNOPpen
um sich unendlich Leben zu verschaffen,
Die Jumps, naja: no comment...
man knnte die Routine, die den Geld/Leben-Wert ndert 
z.B. berspringen usw! muss man eben den code durchtracen!

Ein Beispiel:

137:407813	test eax,eax
137:407815	je 407823
137:407817	call 245972
137:40782D	mov [426629], eax
		...

dieser code erklrt sich eigentlich von selbst.
angenommen, der call bei 137:407817 ruft eine routine auf, die die Anzahl
der Leben um 1 verringert. In eax wird z.B. geprft, ob eine Kolission statt-
gefunden hat. d.h., dass wenn keine Kolission stattgefunden hat, steht in eax
der Wert '0' und der call, der ein Leben abzieht, wird bersprungen.
jetzt knnte man entweder den bedingten Sprung (conditional jump) bei
137:407815 in jmp 407823 ndern, oder, was natrlich ein 'sauberer' patch
ist, die ursache zu ndern, d.h., dass eax immer den Wert '0' enthlt und
es so also nie zu einer Kolission kommt.
'Sauberer' patch sage ich deshalb, weil eax in eine andere Speicherstelle kopiert
werden und so spter nocheinmal berprft werden knnte.
dann knnte es sein, dass der trainer NICHT funktioniert, wenn man nur den
jump bei 137:407815 ndert, da eax auch den Wert '1' enthalten knnte und
somit nocheinmal abgefragt werden kann.

VI. Wie schreibe ich einen Trainer ?
------------------------------------

Es gibt verschiedene Mglichkeiten, einen Trainer zu schreiben.
Ich nenne mal eben so ganz flott ganze zwei Stck ;)

I.  Das Spiel muss gestartet werden, dann zu Windows gewechselt werden, um
    schliesslich den Trainer zu aktivieren.

II. Ein Trainer-Loader, d.h. beim Ausfhren des Trainers fhrt der Trainer
    das Spiel aus und aktiviert sich dann.

Der Aufbau eines Trainers sieht folgendermassen aus:
Es werden 5 wichtige API Funktionen bentigt.

1. FindWindowEx			<- um das laufende Spiel zu finden
2. GetWindowThreadProcessId	<- Welcher thread hat das fenster erstellt?
3. OpenProcess			<- Prozess ffnen
4. WriteProcessMemory		<- schreibt bytes in den Speicher des Prozesses
5. CloseHandle			<- schliesst das Handle wieder

Ein TrainerLoader:

1. CreateProcess		<- Startet den Prozess und liefert ein Handle zurck
2. OpenProcess			<- Prozess ffnen
3. WriteProcessMemory		<- Prozess patchen
4. CloseHandle			<- Handle schliessen

Vor der Funktion WriteProcessMemory kann die Funktion WaitForInputIdle eingefgt
werden, um sicherzugehen, dass der Prozess schon initialisiert wurde
und gepatcht werden kann.

K, das wars dann.

Greetings go to :

	All Blizzard members
	   especially to:
	   Ultraschall [Blizzard]
	   IBH-Rip [Blizzard]
	everybody in The Exterminators, 
	   especially to: L!M!T, Rebelious, SPEEDWOLF and WhataDUCK (THX for yer help!)

	where to find me:
		#SCENE.DE, #CRACKING4NEWBIES, #CRACKING and #WIN32ASM

Fragen, Verbesserungsvorschlge, oder sonst irgendeinen Scheiss-Feedback, mail to:

virus.found@gmx.net

OK, ich hoffe, ich konnte irgendwie helfen oder begeistern oder so..


defiler [blizzard]