Browser- und Handyspiele haben normalerweise globale Highscore-Tabellen. Es ist auch üblich, dass diese Tabellen Punktzahlen von 2.147.483.647 enthalten - wobei die Benutzer den Webservice-Aufruf herausgefunden haben, der Punktzahlen meldet, und ihn zum Aufzeichnen einer fiktiven Punktzahl verwendet haben.
Für einfache Puzzlespiele können wir uns dagegen wehren, indem wir eine Aufzeichnung aller Bewegungen des Spielers (und aller zufälligen Startwerte, die zur Erzeugung des Levels verwendet werden) mit dem Aufruf zur Ergebnismeldung hinzufügen. Das gesamte Spiel kann dann auf dem Server reproduziert und verifiziert werden.
Für etwas Größeres als Pac-Man wird dies jedoch schnell unmöglich.
Wie kann sonst ein solches Betrügen verhindert werden?
mobile
web
security
leaderboards
anti-cheat
teedyay
quelle
quelle
Antworten:
Das interne System, das wir für Moblox (später durch OpenFeint ersetzt) verwendet haben, funktionierte folgendermaßen:
Um das System zu knacken, müsste man diesen magischen Faden finden. Es ist mit Reverse Engineering möglich, aber schmerzhaft.
OpenFeint, ScoreLoop und CocosLive verwenden denselben Trick, jedoch mit HTTPS. Sehr einfach zu implementieren.
quelle
Während Sie Recht haben, dass es bei komplexen Spielen nicht immer möglich ist, vollständige Wiederholungen an den Server zu senden, kann ein ähnliches System verwendet werden, indem der Server den Client regelmäßig (und halb zufällig) nach einem Teil seines Zustands fragt, während der Spiel läuft.
In einem FPS könnten Sie beispielsweise jede Minute fragen: "Wie viele Kills haben Sie?", "Wo sind alle Feinde?" Usw. Wenn der Client nicht mit einer vernünftigen Antwort auf eine Herausforderung in a zurückkommt Angemessene Zeit, sie betrügen.
Dies funktioniert natürlich nur, wenn das Spiel während der gesamten Spielsitzung online ist. Da das Ziel hier darin besteht, in eine Online-Bestenliste hochgeladen zu werden, halte ich das für vernünftig. Werfen Sie den Spieler nicht aus dem Spiel, wenn er falsch antwortet, sondern lassen Sie ihn nicht in die Punkteliste.
Ich würde Sie jedoch ermutigen, das Senden von Wiederholungen zu überdenken. Alles, was Sie wirklich brauchen, ist die anfängliche Zufallseingabe und die Eingabe mit Zeitstempel. Das sollte eigentlich höchstens ein paar hundert KB sein. Viele Arcade-Spiele tun dies bereits, um Wiederholungen für die Überprüfung der Spieler zu speichern. Es mag nicht trivial sein, wenn Ihr Server diese überprüft, aber es verhindert alle Arten von Betrug, mit Ausnahme von Botting.
quelle
Sie können den offensichtlichsten Missbrauch einschränken, indem Sie die höchsten Ergebnisse in der Top-Score-Tabelle überwachen. Abhängig von Ihrem Spiel haben Sie möglicherweise eine "perfekte Punktzahl", über der jede Punktzahl betrügerisch sein muss. Wenn nicht, können Sie die niedrigste "unmögliche Punktzahl" berechnen. Kann der Spieler 10 Schüsse pro Sekunde abschießen, das Spiel dauert 1 Minute und jeder getötete Gegner ist 100 Punkte wert? Dann muss jede Punktzahl höher als 60.000 betrügerisch sein.
Sie können das Problem auch beheben, indem Sie einige Metadaten senden. Nicht die gesamte Spielgeschichte, wie Sie beschreiben, sondern nur die Komponenten, aus denen sich die Punktzahl zusammensetzt. Sprich: Erziele 60000 Punkte, töte 500 Gegner und erhalte einen Bonusgegenstand. Sie können dann einfache Überprüfungen durchführen. Dies ist "Sicherheit durch Dunkelheit" und daher überhaupt nicht sicher, hilft jedoch dabei, die naivsten Angreifer auszuschalten.
quelle
Letztendlich können Sie nur unglaublich hohe Punktzahlen ausschließen, da der Rest (per Definition) nur unplausibel ist und somit ein legitimer (und großartiger) Spieler sein könnte.
Andernfalls müssen Sie sich auf Verschleierungstechniken verlassen (z. B. Verschlüsselung und Senden anderer Statistiken, die über die reine Punktzahl hinausgehen).
Sie können den Spielstand auch in regelmäßigen Abständen senden, während das Spiel gespielt wird, wodurch das Betrügen noch komplexer wird. Der Server kann also entscheiden, ob das Spiel lange genug gespielt wurde, um einen bestimmten Spielstand zu gewährleisten, und sicherstellen, dass genügend Zwischenberichte vorliegen wurden während der Spielzeit empfangen (schaffe es einfach nicht 100% oder der Zug, der auf meinem Heimweg in einen Tunnel fährt, führt dazu, dass ich das Telefon aus dem Fenster werfe).
Letztendlich wird jemand einen Weg finden, es zu brechen, also töte dich nicht selbst und versuche, sie aufzuhalten.
quelle
Ich habe vor einiger Zeit eine schnelle / schmutzige Highscore-Tabelle zu einem meiner Projekte hinzugefügt und bin überhaupt nicht mit Internetsicherheit / usw. vertraut. Es stellte sich als fehlerhaft heraus. Überraschenderweise hatte ich mit fast 1.200.000 aufgenommenen Noten nur fünf oder sechs Mal eine Reihe von offensichtlich falschen Noten, die ganz oben auf dem Brett lagen. Die meisten Partituren sahen im Spiel sogar eher wie eine Panne aus, als wie ein echtes "Hacken".
Ich denke, ein wichtiger Punkt ist: Stellen Sie sicher, dass das Punktesystem Ihres Spiels luftdicht ist , oder führen Sie zumindest eine wirklich gute Machbarkeitsprüfung durch. Dieses Spiel, von dem ich spreche, war ein 48-Stunden-Eintrag von Ludum Dare, daher war es nicht das stabilste, was es gibt. Aber im Großen und Ganzen denke ich, dass es oft wahrscheinlicher ist, dass der Gelegenheitsspieler einen Ingame-Fehler entdeckt / ausnutzt als jemanden direkt die Bestenliste "hacken" zu lassen.
Das heißt, ich arbeite gerade an einer Neufassung dieses Projekts, und ich werde alles tun, um die Verschleierung zu verhindern. Ich werde nicht zu sehr ins Detail gehen, aber ich habe im Grunde genommen alle Bewertungen einen Schlüsselwert basierend auf einer Reihe von Zufallswerten und Hashing und einer magischen Zeichenkette, dann jede Bewertung, die diese Prüfung besteht und hoch genug ist, um das tatsächliche Ergebnis zu erzielen. " Die Bestenliste von Top X muss eine weitere Validierungsrunde bestehen (diesmal mit einem auf der Serverseite generierten ablaufenden Schlüsselwert und gründlicheren Durchführbarkeitsprüfungen).
Ich würde auch raten, eine Art Paket-Tracer zu verwenden, um zu testen, welche Art von Dingen sichtbar sind (ich habe ursprünglich eine viel einfachere Überprüfung durchgeführt, die bedeutete, dass jemand die http-Anfrage eines hochgeladenen Scores mit einem Paket-Tracer finden und duplizieren konnte, ohne es zu wissen die magische Saite oder irgendetwas anderes (bedeutete, dass Sie zuerst eine legitime Punktzahl brauchten, aber Sie konnten Duplikate dieser Punktzahl senden, so oft Sie wollten ..)). Ich habe das mit Wireshark getestet.
Huh, das ist ein bisschen lang geworden, aber hoffentlich hilft es ...
quelle
Ich bin kein Experte auf diesem Gebiet, aber wenn ich Sie wäre, würde ich versuchen, die Partitur mit einem in Ihren Code eingebetteten Schlüssel zu verschlüsseln. Diese Personen müssen Reverse Engineering anstelle des für die Webservices verwendeten Klartexts auf Ihren Code anwenden.
quelle
Speedruns zeichnen im Grunde genommen jeden Tastendruck auf, und sie zeichnen über ein GANZES Spiel auf. Also, ja, du kannst das ganze Spiel aufnehmen, es ist nicht unmöglich. Jeder andere Weg, dies zu tun, ist durch Reverse Engineering zu knacken (ich kann es nicht genug betonen: Sie erhöhen nicht die Sicherheit, Sie erhöhen die Dunkelheit).
Selbst wenn Sie dies auf diese Weise tun, könnten sie tatsächlich einen Speedrun einreichen. Sie können nichts dagegen tun.
quelle
Während Sie dabei sind, stellt sich die Frage, ob ein Highscore einfach ein Spieler ist, der einen Exploit gefunden hat. hoch positiv werden ... oder einfach nur ein Spieler, der eine bestimmte Spielbedingung findet, wie einen sicheren Platz auf dem Brett, an dem er einfach nur sitzen kann und sich keine Sorgen machen muss, auf unbestimmte Zeit zu verlieren.
Um den Unterschied zwischen einem Hack und einem Spiel-Exploit zu erkennen, wäre es gut, zumindest einige Spieldaten hochzuladen. Zumindest hilft es Ihnen, die Exploits zu beheben.
Bei einigen Spielen (insbesondere rundenbasierten Spielen) können Sie das Spiel tatsächlich über den Server spielen lassen, wobei die gesamte Spiellogik auf der Serverseite vorhanden ist und der Client nur eine Schnittstelle ist. Dies erschwert nicht nur das Hacken von Punkten erheblich, sondern ermöglicht es Ihnen auch, alle Spieleraktionen auf dem Server einfach zu protokollieren und so jedes Spiel jederzeit zu wiederholen. Mir ist klar, dass dies für so etwas wie einen zuckenden Action-Shooter unpraktisch sein kann.
quelle
Machen Sie alle Zufälligkeiten aus einem Startwert und speichern Sie die Eingabe für jeden Frame. Wann immer Sie einen Highscore haben (sagen wir Top 50), senden Sie den Startwert und die vollständige Eingabe an den Server. Spielen Sie das Spiel erneut auf dem Server und aktualisieren Sie die Bestenliste, wenn Sie einen Highscore erzielen.
Wenn Sie dies aufgrund der Größe der Anforderung für anspruchsvollere Spiele für nicht durchführbar halten, sehen Sie sich dieses Beispiel an.
Angenommen, das Spiel hat einen 8-Tasten-Eingang (1 Pad und 4 Tasten) und läuft mit 60 fps. Eine einstündige Spieleingabe kann mit 3,6 KB ohne Komprimierung übertragen werden. Ihre Sitzung wird wahrscheinlich weniger als eine Stunde dauern, und die Komprimierung sollte dies um ein Vielfaches verringern, da die Eingaben des Benutzers sehr redundant sind.
Die Herausforderung besteht darin, das Spiel deterministisch, spielbar und auf dem Server ausführbar zu machen.
quelle
Nie zuvor implementiert, aber ...
Senden Sie die Ergebnisse schrittweise mit Zeitstempeln. Auf diese Weise können Sie protokollieren, wie oft sich die Punktzahl verbessert hat, und das "Momentum" des Highscores verfolgen.
Sie würden dann Meilensteine / Kriterien für Ihre Ergebnisse festlegen.
Zum Beispiel: Eine Punktzahl von mehr als 20.000 kann nicht in den ersten 20 Sekunden eines Spiels erreicht werden. Eine Punktzahl größer als 250.000 kann nicht ohne einen Eintrag größer als 200.000 eintreffen.
Dies ist nicht genau das Gleiche wie das Senden eines Spielstatus, liegt jedoch in der Nähe.
Nebeneffekt: Denken Sie an alle nützlichen Spielstatistiken, die Sie dadurch erhalten würden. Jemand würde wahrscheinlich gutes Geld dafür bezahlen.
quelle