hi!
also erstmal...
dies ist mein allererstes tutorial überhaupt...ich hab es geschrieben, da ich bis jetzt noch kein ausführliches (ka ob das hier ausführlich is ;D ) tutorial auf deutsch und für delphi gefunden habe...
kritik is gerne erwünscht...
achja und gewöhnt euch schonmal dran das ich alles klein schreibe ^^
bin halt faul und das wird sich auch so schnell nicht ändern...
hmm wie fang ich am besten an?
okey dann versuch ich das tutorial am besten mal in mehrere teile zu unterteilen...
1. was ist überhaupt ein trainer und was wird in diesem tutorial eklärt?
2. was brauchen wir?
3. wie finde ich addressen heraus?
4. wie pack ich das ganze in einen delphi code?
1. was ist überhaupt ein trainer und was wird in diesem tutorial eklärt?
okey ich machs einfach mal knapp...
also...ein trainer is meistens da, um sich einen vorteil in einem spiel zu verschaffen. sei es nun um kein leben/geld oder einfach nur keine munition zu verlieren. diese ganzen werte wie leben geld usw werden im ram gespeichert,
unsere aufgabe ist nun, die position der werte herauszufinden und diese "einzufrieren".
dabei sollte man wissen, das es 2 sorten von werten...einmal den static memory addresses (dms) und den dynamic memory addresses (dma)...die sma bleiben immer an der gleichen stelle im ram, sie sind also einfach zu finden und zu editieren,
dann gibt es aber noch die dma...diese werte ändern diese position zB nach jedem spielneustart oder nach jedem reboot.
sobald wir diese werte herausgefunden haben, werden wir ein kleines programm mit delphi schreiben um sie "einzufrieren".
2. was brauchen wir?
hmm also erstmal das wichtigste...
-tsearch (könnt ihr hier runterladen
fly.to/mtc)
-delphi (ich habe delphi 7 benutzt)
-ein opfer für unseren trainer (hab mal einfach starcraft genommen)
-nen kaltes getränk, gute musik und ein gehirn ;D
3. wie finde ich addressen heraus?
so, als erstes starten wir das spiel für das wir den trainer programmieren wollen, ich habe mich für starcraft entschieden, da es relativ alt ist und es noch dort noch nicht ganz so viele addressen gibt die man durchsuchen muss.
am besten starten wir einmal eine eigene map gegen den computer.
als erstes wollen wir die addresse von unseren mineralien herausfinden,
am anfang haben wir ja 50 mineralien wie wir oben rechts im spiel sehen können. also starten wir nun tsearch und klicken auf den fetten "open process" button mit dem chip drüber...
nun öffnet sich ein fenster in dem wir unseren prozess auswählen sollen, in diesem fall halt starcraft.
nun klicken wir auf die kleine lupe links unter dem "open process" button...
in diesem search fenster müssen wir erst einmal "exact value" auswählen, da
wir ja wissen, wie viele mineralien wir haben (am anfang immer 50)...
also tippen wir die 50 bei "value" ein und lassen den "type" auf 4 bytes.
normalerweise sind 1 byte 2 zahlen, 2 byte 4 zahlen, 3 byte 6 usw...
aber anfangs soll uns dies nicht kümmern und wir drücken auf ok.
nun sucht er alle addressen mit dem wert 50 für uns raus, meist findet er anfangs viele addressen (bei neueren spielen manchmal bis zu 7-9 stellige zahlen), aber wir suchen sofort weiter =).
also gehen wir zurück ins spiel und sammeln ein paar ressourcen auf...
sobald wir mehr haben als zuvor, merken wir uns wie viele mineralien wir nun
haben und gehen wieder zurück zu tsearch und klicken auf die lupe mit den 3 punkten dahinter (direkt rechts neben dem knopf nur mit der lupe)...
dieser knopf steht für weiter suchen, also schaut er nach veränderungen in den addressen die wir zuvor durch die suche davor gefunden haben.
dort sollten die einstellungen die gleichen sein wie zuvor beim suchen, nur das wir nun bei "value" unseren neuen wert von den mineralien eintippen.
bei mir wären das nun 106.
er sollte nun 4 verschiedene addressen finden. (falls dies nicht der fall ist und er doch ein paar mehr findet, sammelt einfach wieder ein paar mineralien auf und wiederholt den letzten schritt)
bisher haben wir immer nur mineralien dazubekommen, aber jetzt sollten wir mal schaun was passiert, wenn wir mineralien ausgeben...
also gehen wir wieder in starcraft, geben ein paar mineralien aus und suchen wieder nach unserem neuen mineralienwert...
und *tadaa* sind nur noch 2 addressen über...
einer von diesen beiden werten ist wahrscheinlich für die anzeige selbst, und die andere für die mineralien selbst, womit das spiel arbeitet.
also machen wir jeweils einen doppelklick auf jede der beiden addressen und wir haben sie in unserer "cheats list".
hier können wir die werte bei "value" verändern und so ausprobieren, welcher der wert für die anzeige ist und welcher für die andere.
angenommen ihr lasst einen wert auf 50 und ändert den anderen auf 5...
wenn ihr nun in das spiel geht und er oben 5 anzeigt, so ist die addresse, wo ihr die 5 eingegeben habt, für die anzeige, also brauchen wir die andere addresse.
nun wollen wir ausfindig machen, was genau passiert, wenn sich ein wert verändert, also klicken wir in tsearch oben auf "autohack", und wählen "enable debugger" aus...dann wählen wir im "cheats list" fenster die zweite (wie grad schon erklärt könnt ihr mit dem verändern der "value's" herausfinden welche ihr braucht) der beiden variablen mit einem rechtsklick aus und wählen ganz unten autohack aus...
nun prüft tsearch was passiert, wenn sich dieser wert verändert...
also gehen wir zurück ins spiel und geben wieder ein paar mineralien aus...
zurück in tsearch klicken wir oben auf "autohack" und anschliessend auf "autohack window"...
in diesem fenster sollte sich jex eine zeile stehen...
(401F75: (und irgendein befehl) falls ihr mineralien dazubekommen habt, wird dort auch noch der befehl 401F75: (und irgendein befehl))
dies ist der befehl der ausgeführt wird, wenn ihr mineralien ausgebt...
und damit haben wir eigentlich schon unser ziel für dieses kapitel erreicht...
um zu testen ob ihr wirklich die richtige addresse habt, klickt einfach mal auf das kleine quadrat neben diesem befehl, so dass dieser befehl zu nop (no operations) gesetzt wird...also wenn das spiel diesen befehl ausführen möchte, macht er einfach nichts, also das spiel gibt den befehl "mineralien abziehen"
aber wir haben nun den befehl "mineralien abziehen" so modifiziert, dass nichts passiert.
also sollte logischerweise nichts passieren wenn wir nun mineralien ausgeben...
also nichts wie zurück ins game und ausprobieren...
und *tadaa* es werden keine mineralien mehr abgezogen.
also noch einmal ein paar addressen falls ihr kleine probleme hattet =)
mineralien abziehen : 401F75 mit dem wert 8990A0D44F00
vespin-gas abziehen : 401F89 mit dem wert 8988D9D44F00
die werte könnt ihr unten im autohack window ablesen, aber diese werte sind nur wichtig, falls ihr den trainer wieder ausstellen wollt.
so nun haben wir unsere beiden addressen herausgefunden, die wir in unserem trainer benutzen möchten.
damit ist diese kapitel abgeschlossen und wir kommen endlich dazu das ganze in ein delphi programm zu schreiben.
4. wie pack ich das ganze in einen delphi code?
hier werd ich mich mal auf das gröbste beschränken und nur erzählen was wichtig ist, um einen trainer zu erstellen...
auf die einzelnen funktionen werde ich nicht extra eingehen, da ich auch selber weiss das man diese gerne überspringt ^^.
also erstellen wir einfach mal eine neue form und klatschen einfach mal einen button in die mitte und nennen ihn "buttonStart".
nun springen wir mal in den code und fügen ein paar variablen hinzu...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var WindowName : integer; ProcessId : integer; ThreadId : integer; buf : PChar; HandleWindow : Integer; write : cardinal;
Const WindowTitle = 'Starcraft'; |
zurück auf der form machen wir mal einen doppelklick auf unseren button...nun sollte sich das code-fenster
wieder öffnen und wir sollten direkt bei der TForm1.buttonStart prozedur landen.
hier fügt ihr einfach folgenden code ein:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| const v1 = $90 begin WindowName := FindWindow(nil,WindowTitle); If WindowName = 0 then MessageDlg('...erst spiel starten...dann trainer starten =)', mtwarning,[mbOK],0); ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); GetMem(buf,1); buf^ := Chr(v1); FreeMem(buf); closehandle(HandleWindow); end; |
also "v1 = $90" ist die variable die wir einer bestimmten addresse geben wollen. 90 steht für nop, also das keine aktion durchgeführt wird.
im folgenden code wird erst einmal geschaut ob das spiel überhaupt geöffnet ist, wenn nicht, kommt die fehlermeldung:
"...erst spiel starten...dann trainer starten =)"
danach wird der ram ausgelesen und anschliessend wieder mit "FreeMem(buf)" freigegeben. "GetMem(buf,1)" ist pflicht um überhaupt etwas verändern zu können,
"FreeMem(buf)" hingegen ist nicht pflicht, aber dennoch empfohlen, da es den pc sonst unnötig langsamer macht.
nun brauchen wir noch unsern code der unsere addressen verändert.
erstmal müssen wir ein wenig rechnen und unser gehirn einschalten...
also wir haben ja die addresse 401F75 mit dem wert 8990A0D44F00 für mineralien herausgefunden und ich habe vorher schon einmal kurz angesprochen, dass
1 byte für 2 zahlen stehen...wir haben nun 8990A0D44F00 und müssen diese durch 909090909090 austauschen, und dies jeweils mit 1 byte...
also brauchen wir insgesamt 6 befehle um diesen code umzuschreieben. 6x2 zahlen, also 6x90...
401F75 selbst kann nur 1 byte zugewiesen werden...und wir müssen ja insgesamt 6 byte zuweisen...also müssen wir den 5 addressen direkt hinter 401F75
auch jeweils eine 90 zuweisen...
401F75
401F76
401F77
401F78
401F79
401F7A
...usw...jetzt haben wir unsere 6 addressen, welchen wir die 90 zuweisen müssen...
nun mal wieder ein bischen code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| WriteProcessMemory(HandleWindow,ptr($401F75),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F76),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F77),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F78),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F79),buf,1,write); WriteProcessMemory(HandleWindow,ptr($401F7A),buf,1,write); |
diese paar zeilen müssen wir nun zwischen "buf^ := Chr(v1);" und "FreeMem(buf);" einfügen...
das war der code für die mineralien, nun versucht einmal das ganze mit dem vespin-gas,
die addresse und den wert habt ihr ja schon...
so ich hab den ganzen code nochmal als rar datei hinzugefügt...
das ganze könnt ihr hier ->
www.phoenix-designz....rcraft%20trainer.rar herunterladen
so damit ist mein tutorial beendet denke ich...ich hoffe es war für alle verständlich, ansonsten bin ich noch gerne für fragen offen...
ich hoffe auf viel kritik und son kram =)
mfG
en!gma