Hallo,
ich bin gerade auf dem Weg einen Trainer für ein Spiel zu machen.
Vom Code her ist alles ok, das ist kein Problem.
Problem ist, dass sich die Variablenadressen nach jedem Neustart des Spiels ändern.
Soviel ich weiß gibt es Adressen oder Möglichkeiten wie man immer auf die gleiche Adresse zugreifen kann oder man es sich irgendwie ableiten kann.
Also:
Wie kann ich mit zum Beispiel Cheat Engine DAUERHAFT gleichbleibende Variablenadressen herausfinden?
Danke schonmal im Vorraus!!
Geh am besten mal das Tutorial von Cheat Engine durch (Das ist bei der Installation dabei). Darin wird das alles ganz genau erklärt.
Der Trick ist, dass es eine feste Adresse gibt, die einen Pointer auf die Variable darstellt. Das bedeutet du hast eine Adresse an der die Adresse von der Variable steht. Das lässt sich mit beliebig vielen Pointern verketten:
Pointer (feste Adresse) -> Pointer -> Pointer -> Variable (z.B. Lebenspunkte)
Du musst also den Wert des Pointers auslesen (4 byte unter 32bit) und dann solange weitergehen, bis du den Pointer auf die Variable findest.
Cheat Engine hat da ein paar Tools, die bei der Suche helfen, aber das wird alles in dem Tutorial beschrieben 😉
Okay danke erstmal für die antwort und sorry dass ich solange nich reingeckuckt hab
Also, wenn ich den letzten pointer gefunden habe( und wie ich das verstanden habe, bleibt bei dem die adresse immer gleich) kann ich mit c# einfach in die adresse von diesem pointer schreiben?
Danke schonmal für die antwort
Also, wenn ich den letzten pointer gefunden habe( und wie ich das verstanden habe, bleibt bei dem die adresse immer gleich) kann ich mit c# einfach in die adresse von diesem pointer schreiben?
Ja, WENN
Und ich bezweifle dass es so einfach gehen wird.
Überleg dir mal, was du in c# machst. Du schreibst Klassen. Diese Klassen haben mehrere Felder=Variablen. Wenn du eine Instanz mit new erstellst, wird sie an zufälliger stelle allokiert. Wenn du ein Member der Klasse verändern möchtest, brauchst du eine Referenz=Zeiger dees Objekts. Der Zeiger liegt dann entweder in einem Static oder auf dem Stack oder in einem anderen Objekt. Außerdem zeigt der Zeiger auf das erste Feld der Klasse (Im Falle von c# ist das erste Feld immer der Objekttyp) und NICHT DIREKT AUF DEN WERT DEN DU HABEN WILLST, SONDERN MEHR ODER WENIGER KURZ DAVOR. Mal abgesehen davon dass der Zeiger selber an belibiger position gespeichert sein kann (z.B. in nem anderen Objekt)
Außerdem kommt aslr immer mehr in Mode (Sicherheitsmaßnahme, zufällige Speicheraddressen für Dlls und co) Das lässt sich aber umgehen, wenn man Informationen über den Zielprozess auslesen kann. Ist aber etwas komplizierter...
Hi,
ich bezweifle auch, dass es so einfach ist, einen stabilen Zugriffspfad zu finden. Dafür brauchst du Erfahrung. Trainer werden von Leuten geschrieben, die sich mit sowas schon auskennen.
Aber wenn du eine Adresse gefunden hast, kanst du da natürlich rumpfuschen. Du brauchst im Endeffekt ReadProcessMemory und WriteProcessMemory. ASLR stört da nicht weiter... Du schreibst ja einen Trainer und keinen Shellcode.
ASLR stört da nicht weiter... Du schreibst ja einen Trainer und keinen Shellcode.
Wenn man nicht aufpasst, dann doch: Denn die Basisaddressen der dlls und stacks werden zufällig gewählt. Das heißt, dass man sich ne Liste der Module und Thread-stacks holen muss (dafür gibt es apis) und dann prüfen muss, ob eine Variable innerhalb eines Moduls liegt.
ich bezweifle auch, dass es so einfach ist, einen stabilen Zugriffspfad zu finden. Dafür brauchst du Erfahrung. Trainer werden von Leuten geschrieben, die sich mit sowas schon auskennen.
Jap!
ASLR stört da nicht weiter... Du schreibst ja einen Trainer und keinen Shellcode.
Wenn man nicht aufpasst, dann doch: Denn die Basisaddressen der dlls und stacks werden zufällig gewählt. Das heißt, dass man sich ne Liste der Module und Thread-stacks holen muss
Natürlich, aber wenn man nicht aufpasst, braucht man sowas auch nicht zu machen 😉
Danke für die zahlreichen Antworten,
es ist tatsächlich nicht ganz so einfach, wie ich mir das dachte.
Ich denke ich werde dieses Thema vielleicht später, wenn ich mal mehr Erfahrung haben sollte, nochmal angehen.
Trotzdem vielen Dank für die Antworten!