[Tut 2] DMA's, Pointer Um was gehts in diesem Tutorial? Da DMA's sich bei jedem Neustart ändern und wir so ihre Werte nicht mehr einfrieren oder ändern können werden wir Pointers benutzen um an die gewünschten Speicheradressen zu kommen um diese dann per Poke Commands zu überschreiben. Nichts verstanden? Egal, das kommt noch... Vorrausgesetzte Kenntnisse: Verständniß von Tut-1, Grundkenntnisse Hex Benötigte Programme: Cheat Engine 5.5 1) DMA's nochmal Wie schon Beschrieben sind DMA's (Dynamic Memory Allocations) nichtstatische Speicheradressen. Wenn wir z.B die Speicheradresse für Geld in einem Computerspiel gefunden haben und das Spiel neu starten dann schreibt das Spiel diesen Wert in eine neue Speicheradresse und wir müssen von neuem eine Suche starten. Das wird auf Dauer lästig. Deshalb gibt es Pointers! 2) Pointers (=Eng. Zeiger) Pointers sind Speicheradressen die auf eine Speicheradresse verweisen in der unser gewünschter Wert liegt. Diese Pointer verweisen auch nach Neustart des Spieles auf die richtige Adresse, meistens jedenfalls... Ok, auf zur Praxis! Ich nehme als Beispiel einen Egoshooter und wir suchen nach der Adresse dessen Wert die verbleibenden Patronen im Magazin beinhaltet. Spiel starten, aha!, 30 Patronen im Magazin! - Alt-Tab zu Cheat Engine, Wert 30 suchen, Alt-Tab zum Spiel, einen Schuss abfeuern - zurück zu CE, 29 suchen.... Wenn ihr eure gewünschte Speicheradresse in der Liste habt klickt darauf rechts und wählt "Find out what writes to this Adress" aus. Falls ein Popup kommt bestätigt es mit Ja Alt-Tab't nun zurück ins Spiel, feuert einen weitern Schuss ab und tabbt wieder zu Cheat Engine. Nun sollte CE etwas gefunden haben wie: Klickt nun auf "More Information" und ihr erhaltet ein neues Fenster welches so aussieht: Der rote Code ist übrigens die Stelle an der unser Wert vom Spiel in der gefundenen Speicheradresse abgeändert wird. Die Sprache heisst ASM aber das ist uns zu diesem Zeitpunkt noch egal. Das wird interessant wenn wir in einem späteren Tutorial per Code Injection diesen Code zu unseren Gunsten abändern um spezielle Trainer zu machen. Totzdem jetzt schon eine kurze Erklärung: 005daa50 - mov [eax+00000110],ecx sagt aus dass bei der Adresse 005daa50 der Befehl mov einen Wert den ecx beinhaltet in die Speicheradresse die eax beinhaltet bewegt wird und den Wert von 110 (hex) addiert. Auf Deutsch: Die übriggebliebenen Schüsse ecx werden in die Speicheradresse [eax+00000110] geschrieben wo der alte Wert lag. Also ammo -1 Was uns aber im Moment hier brennend interessiert ist folgender Satz: The value of the Pointer needed to find this address is probably 055ED008 Das heisst die Speicheradresse (unser gesuchter Pointer) die auf die Adresse mit dem Ammo-Wert zeigt hat den Wert 055ED008. Deshalb suchen wir jetzt nach diesem Wert! Scan type: Exact Value Value Type: 4 Bytes Macht nun ein Häckchen bei Hex und gebt den gefundenen Wert ein (bei mir 055ED008) ein. Wenn ihr Glück habt bekommt ihr nur eine einzige Speicheradresse, Pech wenn ihr mehrere 100 bekommt. Wenn ihr jetzt nur eine oder ein paar Adressen habt können wir diese nun als Pointer in unsere Liste aufnehmen. Dazu klickt auf "Add Address manually" und macht ein Häckchen bei Pointer. Gebt nun die Addresse des/einer der gefundenen Adressen ein (nicht den Wert!) und das Offset was in unserem Fall 110 ist ([eax+00000110]). bevor ihr auf OK klickt könnt ihr nun erkennen das oben bei Addresse unsere Adresse des Ammo-Wertes steht. Erklärung: Der Pointer beinhaltet eine Adresse. Addiert man nun zu dieser Adresse 110 in hex kommt man auf unsere Adresse die unseren Ammo-Wert beinhaltet. Praktisch erklärt: Startet euren Windows-Rechner stellt ihn im Menü Ansicht auf Wissenschaftlich um Stellt ihn auf Hex um und Addiert zu eurem Pointer-Wert 110 - Ihr werdes sehen dass ihr so auf eure Ammo-Wert Adresse kommt. Ihr habt nun in eurer Liste den/die Pointer stehen. Jetzt solltet ihr das Projekt erstmal abspeichern und das Spiel beenden. Wenn ihr nun das Spiel neustartet und der Pointer Zeigt noch immer auf die Ammo-Adresse habt ihr es geschafft und einen statischen Pointer gefunden. Ihr müsst jetzt nicht bei jedem Spielneustart nach euren Werten suchen sondern müsst nur mehr in CE die Cheat Datei laden. Ausserdem kann man mit statischen Pointern schon tolle Trainer bauen und das ist auch ganz leicht. Wie man Pointer findet die auf Pointer zeigen die auf.... und wie man Pointer-Trainer macht steht im nächsten Tutorial. Falls man keine statischen Pointer findet kommt dann Code Injection ins Spiel. Das wird dann wohl im übernächsten Tutorial stehen [Tut 3]Um was gehts in diesem Tutorial? Was ein Pointer ist solltet ihr ja inzwischen verstehen. In Spielen gibt es aber auch oft Pointer die auf Pointer zeigen, die wiederum auf einen Pointer zeigen u.s.w. Diese Pointer sind allsamt nicht statisch, also für eine Trainer-Erstellung nicht verwendbar. Es gilt den Base-Pointer herauszufinden welcher Statisch ist und der alle anderen Pointer mit unserem Wert den wir ändern wollen füttert. Vorrausgesetzte Kenntnisse: Verständniß von Tut-1 und Tut-2 Benötigte Programme: Cheat Engine 5.5 1) Den Base-Pointer finden Der Base-Pointer lässt sich im Grunde genau so wie der erste Pointer finden. Ich gehe mal davon aus ihr habt den ersten Pointer wie in Tut-2 beschrieben schon gefunden. Klickt nun rechts auf den Pointer und wählt "Find out what writes to this pointer" Nun den Wert im Spiel wieder verändern und wieder zu Cheat Engine tabben. Falls Cheat Engine etwas gefunden hat den neuen Pointer wieder in die Liste aufnehmen. Wie gesagt sollte man alle Pointer die man mit dieser Weise findet in die Liste aufnehmen. Dann das ganze bei CE abspeichern, das Spiel neu-starten und hoffen das einer der Pointer statisch war. Hat man nun einen statischen Pointer kann man für diesen Wert einen Trainer erstellen, das sehr leicht mit Cheat Engine geht. 2) Pointer Trainer erstellen Ihr habt also für einen oder mehrere Werte einen Pointer. ihr solltet die Pointer in eurer Liste der besseren Übersicht halber eindeutige Namen geben wie Leben, Ammo, Geld, ... Klickt nun ganz unten bei Cheat Engine auf Advanced Options, das Diskettensymbol links oben im neu aufgegangenem Fenster startet den Trainer Maker. Wählt "Create a new Trainer that" und "will run during Game..." Ich gehe jetzt nur auf das wesentliche ein, für das Design müsst ihr euch einfach ein wenig rumspielen.... Klickt auf add Entry Wählt die Kartei Addresses und klickt auf Add. Erklärung: Set a Value and freeze/unfreeze the address: Mit dieser Option wird die Adresse mit dem bei Value eingegeben Wert eingefroren, wenn man danach auch noch ein Häckchen macht erlaubt man dem Trainer-Benutzer auch noch diesen Wert selbst zu bestimmen. Normal freeze: Der Wert bleibt immer gleich Allow Increase: Eine Erhöhung des Wertes ist erlaubt, eine Verringerung nicht Allow Decrease: andersrum Only set a Value Mit dieser Option setzt man nur einen Wert, er wird NICHT eingefroren. Der Benutzer hat auch hier wahlweise die Möglichkeit seinen eigenen Wert einzugeben. Only freeze/unfreeze Die Adresse wird kann mit den oben genannten 3 Wahlmoglichkeiten eingefroren werden, der Wert kann nicht bestimmt werden Nun müsst ihr nur mehr unten in der Liste den richtigen Pointer auswählen (deshalb das benennen ) bei Effect einen Namen (für den Benutzer was er damit freezen kann) und einen Hotkey (einen Shortcut damit man den Effekt im Spiel ein und ausschalten kann. Ich benutze dort meist strg+numpad1-9 Bei Title gebt den Namen ein Wie euer Trainer-Fenster heissen soll, bei Process wählt das Spiel aus. Habt ihr alle Einstellungen gemacht klickt auf Generate Trainer et voila, der Trainer ist fertig. Falls ihr keinen statischen Pointer findet gibt es noch ein