Frage zu Pointern



  • Hallo, bei manchen Spielen ist es ja so das wenn man das Spiel startet das die Lebenspunkte Adresse immer wo anderes nach jedem Programm start steht.

    Wie kann man sowas implementieren?
    Hier in meinem Beispiel ändert sich die Pointer Adresse nachdem Programmstart einfach nicht die bleibt immer gleich.

    Wie ist das bei den Spielen implementiert so das die Adresse sich immer ändert?

    #include <iostream>
    using namespace std;
    int main()
    {
    
    int addr = 1;
    int **p2=0;
    
    char a;
    int *p=0;
    
    while(1)
    {
            p  = &addr;
            p2 = &p;
            cout<< dec << **p2 << "  p2 addr: " << hex << &p2 <<endl;
            system("PAUSE");
            addr++;
    }
    
    }
    


  • Das hängt eben davon ab, was zwischen den zwei Programmstarten sonst für Programme gestartet wurden und wo im Adressspeicher gerade Platz ist. Ich glaube kaum, dass die Spieleentwickler das forciert haben.

    Wieso willst Du so etwas künstlich implementieren? Das erscheint mir wenig sinnvoll.


  • Mod

    Eisflamme schrieb:

    Das hängt eben davon ab, was zwischen den zwei Programmstarten sonst für Programme gestartet wurden und wo im Adressspeicher gerade Platz ist.

    Nein. Vielleicht auf Amiga DOS oder ähnlichem, aber nicht in einem halbwegs modernem System.

    Ich glaube kaum, dass die Spieleentwickler das forciert haben.

    Doch, das wird schon so sein. Das ist Grundlage eines Cheatschutzes.

    Wieso willst Du so etwas künstlich implementieren? Das erscheint mir wenig sinnvoll.

    Ja, ich würde auch erst einmal die Grundlagen lernen.

    Wenn das Betriebssystem es anbietet, kann man Techniken wie ASLR benutzen, dann bekommt man die zufällige Adresse quasi geschenkt. Wenn dies nicht in Frage kommt, spekuliere ich mal (ich weiß nicht, was genau die machen):
    1. Allereinfachste Möglichkeit: Beim Start eine zufällige Menge Speicher dynamisch anfordern, kritische Datenstrukturen dann ebenfalls dynamisch anfordern. Dies ist sehr primitiv und bietet bloß einen festen, aber bei jedem Lauf zufälligen, Offset zu allen Adressen.
    2. Eigene Speicherverwaltung aufsetzen. Ist bei vielen anspruchsvollen Spielen vermutlich sowieso nicht so ungewöhnlich, da man diese dann auf die Anforderungen des Spiels optimieren kann, anstatt die eher allgemein gehaltenen Standardmethoden zu nutzen. Dann kann man gleich auch noch eine zufällige Verwürfelung der Adressen einbauen.



  • Egal, was und wie viel ich zwischen den Programmstarts starte/mache die Adresse bleibt immer gleich.

    Das muss dann wohl mit was anderem zusammenhängen ...

    Warum ich sowas implementieren will? Naja, weil es mir halt interessiert.



  • Ja, ASLR das sagt mir was.

    SeppJ schrieb:

    Allereinfachste Möglichkeit: Beim Start eine zufällige Menge Speicher dynamisch anfordern,

    Ich glaub damit kann ich meine Spielerei umsetzen.^^

    Danke



  • Oh, okay, sorry für die Fehlinformation!

    Aber wovon hängt es dann ab, wo im Speicher eine Adresse anfängt? Ich meine, ich kann ja 100 kleine Programme schreiben, werden die dann irgendwo registriert und erhalten fix einen Speicherblock? Oder wird auf irgendeine Weise nur die Runtime registriert, die einen fixen Speicherbereich hat? In letzterem Fall würden ja z.B. zwei MSVC10-Programme dann trotzdem jeweils andere Adressen haben.

    Oder beziehen sich die Adressen relativ zum lokalen Adressspeicher des Programms, sozusagen als Offset?



  • Eisflamme schrieb:

    Oder beziehen sich die Adressen relativ zum lokalen Adressspeicher des Programms, sozusagen als Offset?

    Stichwort: virtuelle Speicherverwaltung
    http://en.wikipedia.org/wiki/Virtual_address_space



  • Ups, natürlich. Alles Mal gelernt, aber vergessen, da nicht genutzt. Traurig ist's 😞

    Danke!



  • Wenn es dir darum geht, das Cheaten zu erschweren solltest du die relevanten Daten irgendwie verschlüsseln. Das muss kein ausgeklügeltes Verfahren sein, erschwert aber den Einsatz von Tools wie z.B. Cheat Engine.


Log in to reply