Laden...

Variable in fremden Prozess ändern, obwohl diese bei jedem Start an anderer Adresse liegt

Erstellt von UZI vor 13 Jahren Letzter Beitrag vor 12 Jahren 2.990 Views
U
UZI Themenstarter:in
189 Beiträge seit 2011
vor 13 Jahren
Variable in fremden Prozess ändern, obwohl diese bei jedem Start an anderer Adresse liegt

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!!

V
78 Beiträge seit 2008
vor 13 Jahren

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 😉

U
UZI Themenstarter:in
189 Beiträge seit 2011
vor 12 Jahren

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

1.130 Beiträge seit 2007
vor 12 Jahren

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...

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

C
1.214 Beiträge seit 2006
vor 12 Jahren

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.

1.130 Beiträge seit 2007
vor 12 Jahren

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!

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

C
1.214 Beiträge seit 2006
vor 12 Jahren

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 😉

U
UZI Themenstarter:in
189 Beiträge seit 2011
vor 12 Jahren

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!