PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [S] TuT für Pointer in CE



Tw0F1sh
06.11.2011, 01:16
Hi. Ich suche ein Tutorial über Pointer von CeatEngiene, am besten videotut mit sprache. Habe nichts brauchbares bei TY und in der Sufu gefunden...

Danke ;)

krusty
06.11.2011, 17:51
Also erstmal sind Pointer nicht von CheatEngine, sondern kommen in Programmen vor.
Wenn du mit CheatEngine nach einem Wert suchst, hat dieser eine Adresse im Speicher. Dummerweise ist diese Adresse nur selten statisch, das bedeutet sie verändert sich wenn man das Programm neu startet.
Da helfen sogenannte Pointer (Zeiger).
Ein Pointer sitzt selber an einer bestimmten Adresse und zeigt auf eine Adresse:

0x0001 ich bin ein pointer und zeige auf die adresse 0x0002
0x0002 ich bin ein Wert, z.B. Munition = 100Du siehst, der Pointer befindet sich an der Adresse 0x0001 und zeigt auf die Adresse 0x0002, welche den Wert der Munition beinhaltet.

Wenn man das Programm neu startet kann es sein, dass sich die Adresse der Munition ändert,
das ist aber nicht schlimm, wir fragen einfach unseren Pointer:

0x0001 ich bin ein pointer und zeige auf die adresse 0x1337
0x1337 ich bin ein Wert, z.B. Munition = 100Dummerweise ändern sich auch die Adressen der Pointer. Wir versuchenn einen Multilevel-Pointer zu erstellen:

0x0001 ich bin ein Pointer, der auf die Adresse 0x0002 zeigt
0x0002 ich bin ein Pointer, der auf die Adresse 0x0003 zeigt
0x0003 ich bin ein Pointer, der auf die Adresse 0x1338 zeigt
0x1338 ich bin der Wert der Munition = 100.
Man spricht von einem Multilevelpointer, weil wir an den Wert der Munition nur dich eine Verkettung von Pointern gelangen:

Pointer1 = 0x0001
Pointer2 = Inhalt von Pointer1 auslesen
Pointer3 = Inhalt von Pointer2 auslesen
MunitionsAdresse = Inhalt von Pointer3 auslesen
MunitionsWert = Inhalt von MunitionsAdresse auslesen

Tw0F1sh
07.11.2011, 14:57
Das grund wissen habe ich jetzt verstanden, danke.

Aber wieviele Pointer habe ich in z.b. Counter strike source?

Tw0F1sh
11.11.2011, 10:38
//Push

blackberry
11.11.2011, 12:41
Das grund wissen habe ich jetzt verstanden, danke.

Aber wieviele Pointer habe ich in z.b. Counter strike source?

Wenn du das nicht selber beantworten kannst hast du offenbar gar nichts verstanden.
Sind natürlich 42 Stück.

Ernsthaft: Pointer werden da verwendet, wo man Daten referenziert. Das passiert vor allem exzessiv dort, wo man mit dynamisch angefordertem Speicher arbeitet.
Spiele brauchen offensichtlich einen großen Pool davon. Ebenso ist es oft geschickter beim Aufruf von Funktionen die Parameter in Form von Pointern zu übergeben, was auf das Konzept "Call by Reference" führt. Ansonsten müssten nämlich beim Funktionsaufruf die gesamten Daten erst kopiert werden. Wenn eine Funktion also nur mit den Daten arbeiten soll und diese nicht ändert, oder insbesondere diese Daten ändern _soll_, so übergibt man Pointer.
Die Zahl der Pointer hängt also zumal davon ab, wie das Spiel programmiert wurde (soll heißen: wie viel Gebrauch die Programmierer von Pointern gemacht haben) und welche Funktionen gerade ausgeführt werden, d.h.:
Es werden aktuell X Pointer benutzt. Funktion A ruft Funktion B auf. Funktion B braucht Y Pointer. Schon hast du effektiv X+Y Pointer. Dann wird Funktion B beendet und es gibt wieder nur X Pointer.
Long story short: die Anzahl der Pointer ändert sich im Laufe des Programms ständig und du wirst sicher nicht wissen können, wozu die alle gut sind. Es kann dir also scheiß egal seien, wie viele es davon gibt. Sprich: 42 Stück.

Bi0sh0k
11.11.2011, 16:57
Ich beschäftige mich auch schon eine weile damit, aber leider passierts immer wieder das ein Multilevelpointer nicht funzt. Manchmal hat man ja mehrere 100 Adressen die als Pointer fungieren könnten. Bei den grün angezeigten soll es sich ja um Basis Adressen handeln, aber wie ich die genau einordnen soll weiß ich auch nicht genau. Manchmal funzen meine Multilevelpointer für immer, manchmal nicht. Hatt da wer vielleicht noch ne Idee wie man es besser machen könnte. Ich hab mir letztens auch ein Tut über Assembler von dieser Seite gezogen: http://tuts4you.com/download.php?list.17
Ich will mich etwas enger damit beschäftigen, aber die Pointer wie oben genannt sind mir manchmal noch ein Rätsel, auch wenn ich die funktionsweise einigermaßen verstanden habe. Woran erkenne ich das ich die richtige Adresse wähle um darauß einen Pointer mit dem Offset zu machen?

Pointer+Offset=
Pointer+Offset=
Pointer+Offset=
Pointer+Offset=
usw.
Adresse mit Wert

krusty
11.11.2011, 17:41
ein Pointer ist standartmäßig ein Zeiger auf einen bestimmten Platz im Speicher. Das kann ein Wert sein, das kann aber auch ein Objekt oder eine Struktur sein.
Bei Spielen zeigt so ein Zeiger meist auf den Anfang einer Struktur. Meistens steht der Inhalt, den man haben möchte nicht an erster Stelle in der Struktur, also nicht direkt an der Stelle, auf die der Pointer zeigt, sondern etwas weiter hinten. Desshalb addiert man ein offset zur Adresse:
Das sei ein Speicherauszug aus einer Struktur der Spielfigur:

0x00000001 'K'
0x00000002 'R'
0x00000003 'U'
0x00000004 'S'
0x00000005 'T'
0x00000006 'Y'
0x00000007 0
0x00000008 1337Wir haben einen Pointer x, der auf 0x00000001 zeigt, wir wollen aber nicht den Namen der Spielfigur auslesen, sondern das Leben (1337), das steht genau 7 Bytes unter 0x00000001, also an 0x00000001 + 0x7.
Leben = Lese_Inhalt_aus( Lese_Inhalt_aus(x) + 0x7)

Tw0F1sh
11.11.2011, 17:50
ch beschäftige mich auch schon eine weile damit, aber leider passierts immer wieder das ein Multilevelpointer nicht funzt. Manchmal hat man ja mehrere 100 Adressen die als Pointer fungieren könnten. Bei den grün angezeigten soll es sich ja um Basis Adressen handeln, aber wie ich die genau einordnen soll weiß ich auch nicht genau. Manchmal funzen meine Multilevelpointer für immer, manchmal nicht. Hatt da wer vielleicht noch ne Idee wie man es besser machen könnte. Ich hab mir letztens auch ein Tut über Assembler von dieser Seite gezogen: http://tuts4you.com/download.php?list.17
Ich will mich etwas enger damit beschäftigen, aber die Pointer wie oben genannt sind mir manchmal noch ein Rätsel, auch wenn ich die funktionsweise einigermaßen verstanden habe. Woran erkenne ich das ich die richtige Adresse wähle um darauß einen Pointer mit dem Offset zu machen?

Das problem ahbe ich auch. Wenn ich immer mit CE die werte ändere, dann funzt alles, übertrage ich die Adresse in ein z.B. C++ Programm dann funzt sie net mehr...

krusty
11.11.2011, 19:23
Ihr müsst auf die Base-Adressen der Module achten, die können sich ändern, wenn das Programm neu gestartet wird.
In CE steht sowas : "Client.dll" + 0x1337.
Ihr müsst also die Baseadress von der Client.dll auslesen und 0x1337 dazu addieren.

Bi0sh0k
11.11.2011, 22:39
Genau das hatte ich ja.
Eine Base Adresse (grün dargestellt) die, die aus der Client.dll hervorgeht die dann ein offset bekommen hat um auf die richtige adresse zu zeigen mit dem wert. doch komischerweise hat sich diese geändert. 0.o

Tw0F1sh
13.11.2011, 02:16
wie addiert man denn die Client.dll zu 0x1337?

Bi0sh0k
17.11.2011, 17:23
Ich vermute er meint das wir, wenn wir eine Base Adresse in CE bei z.B. CSS gefunden haben müssen wir uns diese merken und dann mit CE auf die Client.dll zugreifen und die Base Adresse als gesuchten wert eingeben um in der Client.dll die Base Adresse zu finden die uns zu der Base Adresse in CSS führt.
Ich werds mal versuchen. Die 1337 ist nur der Wert der bei der Adresse eingetragen wird die letztendlich verändert werden soll (War nur ein Beispielwert).
Er meinte damit das der Wert in die Adresse eingetragen wird.
Wenn es wirklich so ist wie ich das oben denke, dann ist mir klar warum es bei manchen Spielen/Programmen klappte und warum nicht. ;)
Ich teste das mal und werde das dann hier mal posten, was dabei rumgekommen ist.

krusty
17.11.2011, 17:33
Jedes Modul, das Geladen wird (z.B. geladene DLLs) bekommt eine bestimmte Adresse. In diesem Modul liegen die Funktionen an bestimmten Punkten.
Man sagt z.B. 30 Bytes nach dem Anfang des Modules befindet sich die Funktion xy.
Die Adresse der Funktion ergibt sich jetzt aus der Addition der Basisadresse und den 30Bytes.
Cheag Engine ließt schon automatisch die Basisadresse des Moduls aus und addiert das Offset und zeigt dir die ganze Adresse an.

Hoffe das war alles richtig so.

Bi0sh0k
17.11.2011, 17:41
Aber warum funzt es dann 5 mal und dann nicht mehr?
Scheinbar funzt es ja auch wenn die Anwendung mehrmals neu gestartet wurde, aber nach dem System neustart nicht mehr.

/Edit:
Vielleicht sollte ich mal versuchen in einem Multilevelpointer die DLL mit Offset anzugeben anstatt einfach nur die BaseAdresse, die Cheatengine errechnet.
Vielleicht liegts daran. Ich mach en Edit wenns funzt. ;)