Highscore speichern; Hash/Checksum; boost;



  • Hallo zusammen,

    Edit: Ich bin gerade am probieren und versuche dem Problem auf die Spur zu kommen. Es hat sich herausgestellt, dass Code wie:

    boost::hash<std::string> str_hash;
    std::ofstream ost("highscore.txt");
    ost << str_hash("<highscore>");
    

    funktioniert und eine Zahl in die Datei schreibt. Hab aber eine Ahnung, wieso es beim Anderen nicht geht.

    ich möchte gerne im Rahmen eines Spiels einen Highscore Wert (ganzzahliger, positiver Integer) in eine txt Datei speichern.

    Um "Schummeln" zu verhindern, möchte ich zusätzlich (z.B. in der nächsten Zeile) etwas Speichern, das für den Highscore Wert in der Praxis so gut wie einzigartig ist (wenn meine Kenntnisse mich nicht irren nennt man sowas hash/checksum).

    Ich speichere also den Highscore und das andere Ding in die Datei. Wenn ich jetzt den Highscore auslesen möchte, erzeuge ich wieder so ein "Ding" vom highscore und vergleiche es mit dem "Ding", das schon in der Datei steht.

    Sind die beiden nun nicht identisch, weiß ich, dass jemand den Highscore verändert hat.

    Soweit mal meine Theorie. In der Praxis klappt das Ganze garnicht (ich bekomme "invalid highscore", obwohl ich nichts an der Datei ändere, und immernoch <highscore> in der 1. Zeile steht). Mein Code:

    void saveHighscore() {
        // sichergehen, dass die Datei existiert
        std::ofstream ost("highscore.txt");
        ost.close();
        // <highscore> als Dummy Wert schreiben, in die Zeile drunter den Hash
        std::fstream file("highscore.txt");
        file << "<highscore>\n";
        std::string hs;
        std::getline(file, hs);
    
        boost::hash<std::string> string_hash;
        file << string_hash(hs);
    }
    
    // das ist nur, weil mir bei std::stoi das Programm auf unerklärliche Weise "abstürtzt"
    int stringToInt(std::string str) {
        std::istringstream stream { str };
        int i;
        stream >> i;
        return i;
    }
    
    void readHighscore() {
        // highscore und "Ding" einlesen
        std::ifstream file("highscore.txt");
        std::string checksum;
        std::string highscore;
        std::getline(file, highscore);
        std::getline(file, checksum);
    
        // nur zu Testzwecken
        std::cout << "highscore: " << highscore << std::endl;
        std::cout << "checksum: " << checksum << std::endl;
    
        // vergleichen
        boost::hash<std::string> string_hash;
        int read = string_hash(highscore);
        if (read != stringToInt(checksum)) std::cout << "invalid highscore.\n";
    }
    

    Ich weiß jetzt nicht, ob irgendwo bei den ganzen Konvertierungen was kaputt geht, oder ob ich hier sowieso falsch bin, weil ich ein komplett falsches Verständnis von der ganzen Sache habe.

    So sieht übrigens dann die txt Datei aus, ich finde das allein ist schon seehr komisch:

    <highscore>
    ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
    

    Ich hoffe jemand kann mir da weiterhelfen, insbesondere würde mich interessieren, warum es so verdammt komisch aussieht, wenn ich den Hash in die Datei schreibe. Ich hatte mir vorgestellt, dass das nur irgendeine Zahl ist (z.B. 1465476235256).

    Die Ausgabe in der Konsol sieht auch entsprechend komisch aus, aber anders:

    highscore: <highscore>
    checksum: =============================================================================================================================================================================== (usw.; Das '=' steht hier für ein anderes Sonderzeichen, welches so ähnlich aussieht: ═)
    

    LG
    HarteWare



  • Ich weiß nicht wie, aber da habe ich mich selbst getrolled. Habs jetzt zum Laufen bekommen. Falls sich jemand erklären kann, wie ich zu meinen komischen Resultaten kam, der teile es mir bitte hier ebenfalls mit.
    😕 😕 😕



  • Der Hash wurde wohl als Pointer interpretiert und der hat eben auf diese komische Zeichenkette gezeigt.



  • 'Í' hat in CodePage 1252 den Wert 0xCD.
    Und 0xCD ist der Wert den MSVC verwendet um neu angeforderten (=nicht initialisierten) Speicher anzufüllen.

    D.h. wenn du das machst

    char buffer[1024];
    std::cout << buffer;
    

    Dann bekommst du lauter 'Í' ausgegeben. Und möglicherweise ne Access-Violation - kommt drauf an was hinter buffer noch steht.

    Andere gängige Füllwerte sind z.B. hier beschrieben:
    http://stackoverflow.com/questions/370195/when-and-why-will-an-os-initialise-memory-to-0xcd-0xdd-etc-on-malloc-free-new

    ps: Gilt natürlich nur wenn der Debug-Heap verwendet wird. Ansonsten gilt das was der C++ Standard sagt, also dass das Verhalten des Programms in so einem Fall undefiniert ist.



  • Wow, das ist wirklich sehr interessant. Ja, das war im Debug-Mode, soweit ich mich erinnern kann.

    Keine Ahnung wie ich das hinbekommen habe... Das hätte mich bis ins unendliche frustriert, wenn dieses Problem sich nicht wie durch ein Wunder von allein gelöst hätte (ich habe von Grund auf schritt für schritt das Ding neu gemacht und danach ging es, wie erwartet).

    Vielen Dank für eure Mühen und dass ihr etwas Licht auf die Sache geworfen habt.

    LG
    HarteWare



  • Wenn du das Schummeln noch etwas mehr erschweren möchtest, dann solltest du nicht nur den Hash des Highscores berechnen sondern noch ein Paar geheime Bytes dazu packen. Außerdem ist boost::hash eigentlich für Hash Maps gedacht und nicht um irgendwas abzusichern. Dafür gibt es kryptographische Hash Funktionen wie z.B. SHA1. Wenn man es dann wirklich richtig machen will nutzt man HMAC. Dann hängt die Sicherheit nur noch davon ab wie gut du die geheimen Bytes in deinem Programm verstecken kannst. Für ein einfaches Spiel aber vermutlich Overkill.



  • Hi,

    vielen Dank für deine Antwort.

    Das habe ich schon irgendwo gelesen, dass gerne mal hash/checksum unter einen Hut gebracht werden.

    Das mit den "geheimen bytes" macht für mich irgendwie Sinn. Ich meine, wenn der "hacker" weiß, welchen Algorithmus ich verwende, kann er ja auch einfach die checksum für das gefälschte erzeugen.

    Mich würde interessieren, was die Leute immer meinen, wenn sie von "im Programm verstecken" reden.

    // Ist das hier versteckt?
    checksum = checksum_from(foo + bar + "geheim")
    
    // oder das?
    char c[7] = "geheim";
    // ...
    
    // oder so?
    char* ch = new char[6];
    ch[0] = 'g';
    ch[1] = 'e';
    ch[2] = 'h';
    ch[3] = 'e';
    ch[4] = 'i';
    ch[5] = 'm';
    // ...
    
    // oder einfach eine wahllose Zahl/Char anfügen?
    checksum = checksum_from(foo + bar + to_string(1234));
    

    Google ist auch nicht gerade hilfreich, wenn ich nach "C++ bytes im Programm verstecken" suche.

    Aber ja, realistisch gesehen, ist sowas schon wieder overkill für mein Projekt, es ging mir lediglich darum, dass keiner einfach nur eine text Datei zu öffnen braucht und sofort den top-highscore geknackt hat.

    Mir gehts dabei eher um das Dazulernen^^

    LG
    HarteWare


  • Mod

    HarteWare schrieb:

    Google ist auch nicht gerade hilfreich, wenn ich nach "C++ bytes im Programm verstecken" suche.

    Die Welt spricht Englisch. Ist nun einmal so.

    Google: c++ hide strings in executable



  • SeppJ schrieb:

    HarteWare schrieb:

    Google ist auch nicht gerade hilfreich, wenn ich nach "C++ bytes im Programm verstecken" suche.

    Die Welt spricht Englisch. Ist nun einmal so.

    Google: c++ hide strings in executable

    danke für deine Antwort.

    Auf den Gedanken bin ich dann auch gekommen, bei deiner Suche waren dann nochmal mehr Ergebnisse dabei, als bei mir (ich habe statt executable 'program' und 'source code' probiert).

    Bin mir jetzt nicht sicher, ob etwas wie

    auto val = 0x1234
    

    ausreichen würde, als "geheime(s) byte(s)", oder ob man lieber einen String verschlüsselt speichern sollte. (und ob das dann die präferierte Variante wäre für z.B. irgendeinen key). So Dinge wie in mehrere Strings aufteilen und dann wieder zusammenfügen find ich irgendwie nicht so dolle...

    Wie dem auch sei, für die praktische Anwendung ist das im Moment für mich sowieso "overkill", aber es wäre halt ganz interessant irgendwie...

    LG


  • Mod

    HarteWare schrieb:

    Bin mir jetzt nicht sicher, ob etwas wie

    auto val = 0x1234
    

    Zahlen sind für den Compiler nur Zahlenwerte, unabhängig von der Darstellung. Ob du 0x1234, 4660, 2*2330, 4661-1 oder was anderes schreibst, es wird jedes Mal der gleiche Code erzeugt. Du musst schon die gleichen Prinzipien benutzen wie bei der Zeichenkettenverschlüsselung, also den "richtigen" Wert erst zur Laufzeit berechnen. Wer aber in der Lage ist, in deinem übersetzten Programm den Wert 4660 zu finden, der ist auch in der Lage, diese "Verschlüsselung" zu knacken. Denn schließlich ist das Finden der Zahl 4660 nicht so einfach, wie mit dem Editor das Programm zu öffnen und nach lesbaren Zeichenketten zu gucken. Man muss dazu das Programm deassemblieren, den Assemblercode verstehen können und dann die richtigen Zahlen in dem Programm finden.


  • Mod

    So etwas hatten wir doch schonmal, nicht? FWIW, für C++14 könnte es so aussehen:

    #include <algorithm>
    #include <initializer_list>
    
    template <typename Char>
    constexpr Char rot13(Char ch) {
    	for (auto base : {'a', 'A'})
    		if (ch >= base && ch <= base+26)
    			return (ch-base+13)%26+base;
    	return ch;
    }
    
    template <typename Char, std::size_t N>
    struct StrambleProxy {
    	Char arr[N];
    
    	operator Char const*() {
    		static bool done;
    		if (!done && (done=true))
    			std::transform(arr, arr+N, arr, rot13<Char>);
    		return arr;
    	}
    };
    
    template <typename Char, Char... ch>
    constexpr auto operator"" _rot13() {
    	StrambleProxy<Char, sizeof...(ch)+1> str = {ch...};
    	for (auto& c : str.arr)
    		c = rot13(c);
    	return str;
    }
    

    GCC, zumindest seit Version 5.1, beinhaltet den originalen String lediglich in der Form von ASCII Werten:

    auto operator"" _rot13<char, (char)65, (char)66, (char)67, (char)68, (char)69>()
    

    (http://goo.gl/3jgIXn)



  • Hi,

    vielen Dank für deine Antwort Arcoth.

    Ich glaub ich hab irgendwo schonmal davon gelesen... irgendwas mit "security through obscurity" 😃 (sollte jetzt eine witzige Anspielung auf mein mangelndes Verständnis für den Code sein).

    Ich hab aber noch eine andere, ganz wichtige, Frage: Was, wenn ich vorhabe meine Software open-source zu machen? Dann bringt das doch alles nichts, oder? Auch nicht irgend eine nette "Zauberei". Weil jeder könnte ja sehen, wie das gemacht wird.

    Kann ich überhaupt bei einem open-source Spiel einen halbwegs großen Aufwand erzeugen, der für das "hacken" einer online highscoreliste nötig wäre?

    LG
    HarteWare

    P.S.: Wenn es stört, dass ich im C++ unterforum nun eine etwas andere Frage aufwerfe, die nicht direkt mit C++ zu tun hat, kann ich auch gern nochmal in einem anderen Subforum einen Thread aufmachen. Aber irgendwie gehört es ja schon zu diesem Thema.


  • Mod

    HarteWare schrieb:

    Kann ich überhaupt bei einem open-source Spiel einen halbwegs großen Aufwand erzeugen, der für das "hacken" einer online highscoreliste nötig wäre?

    Ja. Online machen 🙂 .


  • Mod

    @SeppJ: Sätze sollte man entweder mit einem Smiley oder mit einem Satzzeichen beenden, aber beides hintereinander sieht falsch aus - außer der Smiley folgt dem Satzzeichen.

    Hello World! 🙂

    Hello World 🙂

    Hello World 🙂 !

    Welcher von diesen Sätzen sieht am hässlichsten aus?


  • Mod

    Logik geht eben vor Ästhetik, bis die Gesellschaft für deutsche Sprache sich der korrekten Interpunktion von Smileys widmet (also so um das Jahr 2150 herum).



  • @Arcoth:
    Wie wär's mit...

    Hello World! :)!

    :D?



  • SeppJ schrieb:

    HarteWare schrieb:

    Kann ich überhaupt bei einem open-source Spiel einen halbwegs großen Aufwand erzeugen, der für das "hacken" einer online highscoreliste nötig wäre?

    Ja. Online machen 🙂 .

    Wie jetzt, online machen? Ich machs doch online. Oder meinst Du jetzt als HTML5 Game im Browser oder was 😕 ?


  • Mod

    HarteWare schrieb:

    SeppJ schrieb:

    HarteWare schrieb:

    Kann ich überhaupt bei einem open-source Spiel einen halbwegs großen Aufwand erzeugen, der für das "hacken" einer online highscoreliste nötig wäre?

    Ja. Online machen 🙂 .

    Wie jetzt, online machen? Ich machs doch online.

    Erzähl mal mehr. Bis jetzt hast du bloß nach Textdateien gefragt.



  • Ich habe eine Website gehostet, auf dem Server lagert ein PHP skript, an welches man einen POST request mit dem Highscore schicken kann, woraufhin dieses den Highscore der Datenbank hinzufügt.

    Jetzt könnte ich ja aber auch einfach ein Programm schreiben, welches ebenfalls einen solchen POST Request sendet, aber mit gefälschtem highscore. Mein PHP Skript weiß aber nicht, dass der Request nicht tatsächlich vom Spiel kam. Auch wenn ich noch irgendein Passwort hinzufüge (grob gesagt) - wenn es open-source ist, könnte das andere Programm das ja auch alles imitieren, oder?



  • Dazu muss das Programm nicht open-source sein, das geht auch so. Selbst mit TLS kannst du nicht verhindern, dass jemand falsche Daten an den Server sendet.

    Der Server spielt deshalb auch das Spiel und zwar mit den Eingabedaten, die vom Client kommen. Falls der Server zum selben Ergebnis kommt, dann ist der Highscore gültig. Falls also jemand trotzdem den Highscore manipulieren will, dann muss er schon einen Bot dafür schreiben.


Anmelden zum Antworten