Statische Pointer? - Gamehacking!



  • Hallo Cpp Gemeinde! 🙂

    Wollte mich mal an einem Trainer versuchen, und hab mir als Beispiel Solitär ausgesucht.

    Wenn ich also das Spiel starte, sowie den Trainer, läuft alles einwandfrei, bis ich es irgendwann X-mal neu geöffnet habe, dann hat sich plötzlich der Pointer verändert, warum??

    Zuerst war er:
    0x050A5F4

    Dann:
    0x02FA5F4

    Jetzt:
    0x018A5F4

    Habe die Pointer über Cheat-Engine rausgefunden, weswegen ich sagen kann, dass es Pointer sind, da die Zahlen Grün waren. 🙄

    Nun zu meiner Frage:

    Gibt es dabei einen "Pointer der Pointer" - also einen Pointer, der sich NIEMALS ändert, wenn ja - wie findet man ihn?

    Vielen Dank schonmal im Voraus!





  • Mir bleibt also nur die Möglichkeit alle Adressen zu speichern, und den Wert auf alle Adressen zu übertragen?



  • Bin mir nicht ganz sicher, was genau du meinst. Der Punkt ist: Es ist rein prinzipiell unmöglich, im Vorhinein zu wissen, an was für einer Adresse der gesuchte Wert zu finden sein wird. Anstatt mit einer absoluten Adresse, müsstest du mit einem Offset relativ zur Basisadresse des jeweiligen Moduls arbeiten...



  • Dort stand etwas von Betriebssystem, ist das Randomizing nur auf Windows+Spiele bezogen? Also sind andere Spiele wie Minecraft, Divinity 2, Risen etc von dem Pointer-Randomizing unbetroffen, sodass EXP immer die Adresse X hat, und die auch 'statisch' ist, in dem Fall?

    Was ich davor damit meinte, war: Alle (Randomized)Pointer herauszufinden und z.B. die Punkte bei Solitär immer zu überschreiben, sprich:

    address = 0x03EA5F4;
    cout << "Wie hoch soll der Wert sein?" << endl;
    cout << "Eingabe: " << flush;
    cin  >> Value;
    WriteProcessMemory(ProcessHandle, (LPVOID)address, &Value, sizeof(int), NULL);
    address = Adresse1
    WriteProcessMemory(ProcessHandle, (LPVOID)address, &Value, sizeof(int), NULL);
    address = Adresse2
    WriteProcessMemory(ProcessHandle, (LPVOID)address, &Value, sizeof(int), NULL);
    ...
    

    usw?



  • zuerst einmal:

    1.randomization bedeutet, dass du nicht vorhersagen kannst, wo der Zeiger liegen wird. Das heißt, es könnte so gut wie jede Addresse sein.

    2. Typischerweise sind alle Speicherbereiche für ein Programmwichtig, an zufälligen Orten rumzuschreiben kann also bedeuten, dass alles passieren kann, vom Spielabsturz bis zu zerstörten Spieldateien/Savegames etc.

    3. Auch Java ist davon betroffen und wahrscheinlich sogar noch in höherem Maße, weil du eine weitere Schicht dazwischen hast, die mit dem Betriebssystem interagiert. Zum Beispiel schiebt der GC lustig Objekte im Speicher hin und her.

    4. Ich habe dir bereits im anderen Thread gesagt, dass das schwer ist. Wäre schön gewesen, du hättest das hier referenziert.

    5. Die Leute, die sowas machen haben viel mehr Ahnung als du und benutzen ganz andere Herangehesweisen. Die Tools die duv erwendest sind nur dazu da, zu analysieren wo mögliche Angriffspunkte sind.



  • Ich weiß was Randomizing / Randomization bedeutet. ô.o

    5. Die Leute, die sowas machen haben viel mehr Ahnung als du und benutzen ganz andere Herangehesweisen. Die Tools die duv erwendest sind nur dazu da, zu analysieren wo mögliche Angriffspunkte sind.

    Ich will doch kein Heavy Trainer machen den ich für ne Mille im Internet verticke, schrieb ich auch nirgendwo, nichtmal Ansatzweise, ich will einfach nur mal sehen, wie man solch Pointer rausfindet, die statisch sind, und sich wirklich >NIE< verändern, wie es auch von den Pointern gesagt wurde. ô.o



  • Solche Pointer gibt es aber nicht.



  • Aber wie funktionieren dann Trainer ausm Internet?
    Die klappen auch immer. ô.o



  • Shortyoo schrieb:

    Aber wie funktionieren dann Trainer ausm Internet?
    Die klappen auch immer. ô.o

    Na anders.
    Ist aber etwas schwer nem Noob zu erklären wie.
    Lern erstmal richtig programmieren. Irgendwann weisst du dann genug, dass du ganz von alleine verstehen solltest wie man das macht.



  • 1.randomization bedeutet, dass du nicht vorhersagen kannst, wo der Zeiger liegen wird. Das heißt, es könnte so gut wie jede Addresse sein.

    Solche Pointer gibt es aber nicht.

    Nein das stimmt so nicht. Es gibt durchaus statische Pointer (in CheatEngine grün). Die haben immer genau das selbe Offset zur Basisadresse. Allerdings ändert sich durch ASLR die Basisadresse und somit auch die absolute Addresse des Pointers.
    Klick mal in Cheatengine unten auf die Addresse. Die ist dort eigentlich immer als

    solitaire.exe+B53F0
    

    eingetragen. Das ist Basisadresse+Offset. Mehr brauchst du eigentlich nicht (wenn es ein statischer Poitner ist).



  • Bei mir steht dort:

    solitaire.exe+BAFA8
    

    Das ändert sich auch nicht, aber es funktioniert nicht, wenn ich es nur so als Pointer stehen habe, da ich noch eine Basisadresse brauche.:D







  • Um zu der Adresse der Punkte zu kommen brauchst du die Base Adresse. (solitaire.exe+BAFA8) dazu addierst du die beiden Offsets (50 und 14) und dann kommst du zu der Adresse der Punkte...
    Die Basisadresse musst du immer wieder neu suchen. Dafür kannst du die Funktionen Module32First bzw. Module32Next verwenden.


Log in to reply