Frage Wie können Sie verhindern, dass falsche Highscores auf einer globalen Highscore-Liste erscheinen?


Angenommen, Sie entwickeln ein PC-Spiel, das hohe Punktzahlen verfolgt. Zusätzlich zu den lokalen Werten wird ein globaler Highscore-Server eingerichtet, auf den das Spiel über das Internet zugreift. Spieler sollten in der Lage sein, ihre Highscores direkt nach dem Abschluss eines Spiels oder später von ihrer lokalen Highscore-Liste an die globale Highscore-Liste zu senden. Dies muss ein häufiges Problem sein; Arcade-Spiele auf modernen Spielekonsolen verfügen oft über eine globale Highscore-Liste, die so funktioniert.

Meine Frage läuft darauf hinaus: Wie können Sie verhindern, dass jemand gefälschte Highscores einreicht? Oder, anders ausgedrückt, wie kann der globale Highscore-Server sicher sein, dass ein eingereichter Punktestand tatsächlich durch einen Durchlauf im Spiel erzeugt wurde?

Je mehr ich darüber nachdachte, desto mehr halte ich es für ein unlösbares Problem.

Was Sie normalerweise tun würden, um zu überprüfen, ob eine Nachricht von einer bestimmten Quelle stammt, ist, dass die Quelle die Nachricht digital signiert. Sie könnten das in diesem Fall sicherlich tun, aber das eigentliche Problem ist, dass der Spieler, indem er die Software hat, auch den privaten Schlüssel der Software hat. Egal, wie verschleiert es sein könnte, es kann reverse engineered oder sogar einfach aus dem Gedächtnis gezupft werden.

Eine andere Option wäre, eine Wiederholung des Spiels des Spielers an den Highscore-Server zu senden, der die Wiederholung schnell ausführen und überprüfen würde, ob der eingereichte Spielstand mit dem Ergebnis der Wiederholung übereinstimmt. Dies löst das Problem nicht, aber es macht es sicherlich schwieriger, einen gefälschten Highscore zu fälschen, wenn Sie auch eine sehr komplexe Wiederholung produzieren müssen, die es "beweist".

Ist das ein Problem, das eine Lösung hat, oder ist es wirklich unlösbar? Gibt es Techniken, die von Entwicklern von Heimspielkonsolen verwendet werden, um diese Art von Exploits zu verhindern, oder sind sie einfach darauf angewiesen, dass die Konsole verhindert, dass nicht autorisierter Code ausgeführt wird?


12
2018-05-08 02:01


Ursprung


Antworten:


Für ein PC-Spiel, bei dem der Punktestand vom Client generiert wird, ist dies kein lösbares Problem, da der Client von Natur aus nicht vertrauenswürdig ist.

Das einzige, was Sie versuchen können, ist, dass es für jemanden schwieriger wird, eine falsche Punktzahl einzureichen.

Einige Gedanken:

  • Schützen Sie den In-Memory-Score. Sie können APIs wie verwenden CryptProtectMemory um den Punktestand im Speicher zu verstecken - ein einfacher Speicherschreibvorgang wird nicht funktionieren. Mit einem angehängten Debugger oder über das Einfügen von Code in Ihren Prozess könnten sie jedoch immer noch den Score ändern. Sie können verschiedene Schemata untersuchen, um zu versuchen, Debugger zu besiegen.

  • Schützen Sie die Punkte auf dem Weg zum Server. Sie können die Daten, die an den Dienst gesendet werden, wie Sie vorschlagen, verschlüsseln, aber da die nicht vertrauenswürdige Partei die Kontrolle über den Schlüssel hat, ist dies lediglich eine Verschleierung und bietet keinen soliden Schutz.

  • Validieren Sie das Ergebnis im Service. Ich würde es verabscheuen, dies zu tun, abgesehen von sehr einfachen Kontrollen. Ein Fehler führt dazu, dass Sie gültige Bewertungen ablehnen. Es wird unmöglich sein, zwischen Betrügern und starken Spielern zu unterscheiden.

An dieser Stelle müssen Sie sich wirklich fragen, ob sich die Entwicklungsarbeit wirklich lohnt. Was passiert, wenn jemand ein ungültiges Ergebnis veröffentlicht? Was verlierst du eigentlich? Ich würde das Nötigste tun, um mich vor einem Kind mit einem einfachen Skript zu schützen. Ie., haben Sie nicht Ihre Punktzahl Einreichung nur sein:

http://myservice.com/submitscore.aspx?PlayerName=Michael&Score=999999999

Ich würde einfach einen einfachen Schutz im Speicher gegen gelegentliche Snoops verwenden, einige einfache Verschleierung auf dem Draht (Hash die Punktzahl mit einem Server-Cookie) und fertig sein.


6
2018-05-08 02:21



"Eine andere Option wäre, eine Wiederholung des Spiels des Spielers mitzuschicken ... Das löst das Problem nicht"

"Ja wirklich?" Warum nicht?

"Sie müssen auch eine sehr komplexe Wiederholung produzieren, die" [die Partitur] "beweist."

Schlägst du vor, dass jemand die Wiederholung fälschen könnte? Gründe eine Super-High-Score-Lösung, ohne das Spiel tatsächlich zu spielen? Fake die Zeitstempel und alles? Ziehe ein Donald Crowhurst?

Warum nicht einfach das Spiel spielen, anstatt zu versuchen, ein Protokoll des Spiels zu fälschen?

Oder ... wenn es so einfach ist, eine Geschichte des Spiels zu fälschen, die zu einem super Highscore führt, ist das Spiel vielleicht falsch gestaltet. Wenn das Spiel "hart" ist, muss die Person alle richtigen Entscheidungen treffen. Wenn das Spiel einfach ist, dann spiegelt das Ergebnis nicht die Entscheidungen des Spielers wider und ist faktierbar.

Denk darüber so. Wählen Sie ein beliebiges Spiel oder Sport. Jemand sagt, dass - sagen wir - die Schweiz in einem Yacht-Rennen Neuseeland besiegt hat. Du würdest sie herausfordern, indem du nach Details über den Veranstaltungsort, die Boote, die Teams und die einzelnen Rennen suchst, um dich davon zu überzeugen, dass es wahr ist. Natürlich könnten sie es vortäuschen, aber wenn sie eine Fülle von Details über das Rennen haben, dann ... wie ist das nicht "Beweis"?


6
2018-05-08 02:37



Dies ist meines Wissens unlösbar.

Ich habe viele Leute gesehen, die versuchen, den Verschlüsselungsschlüssel zu verschleiern. Ich habe gesehen, dass ein paar Leute andere Plausibilitätschecks haben, wie die verstrichene Zeit oder die verbleibenden Feinde. Ich habe noch nie eine gesehen, die eine Wiederholung sendet, obwohl es natürlich möglich ist.

In einer Website, die nicht veröffentlicht wird, richten sie eine gefälschte Sende-High-Score-Routine ein, die leicht zu finden ist. Wenn ein Täter es verwendet, wird seine IP-Adresse automatisch von zukünftigen Updates gesperrt.


5
2018-05-08 02:05



Vergessen Sie das kryptographische Problem; Wenn dein Code auf dem lokalen Computer gehackt werden kann, wie hältst du jemanden davon ab, einen verrückten Highscore künstlich zu setzen und ihn dann mit dem bestehenden vertrauenswürdigen Mechanismus zu übertragen?

Bis Sie Vertrauen in den Code selbst herstellen können, wird ein Kryptomechanismus für die Kommunikation nicht das eigentliche Problem sein.


1
2018-05-08 02:10



Senden Sie den Hash der (Software + eine zufällige Salz) zusammen mit der Punktzahl. Überprüfen Sie diesen Hash mit dem Server. Wenn es übereinstimmt (was bedeutet, dass die Software unverändert ist), akzeptieren Sie es. Ansonsten kommt das Ergebnis von einer "modifizierten" Version des Spiels. Lehne es ab. Das zufällige Salz sollte sich jedes Mal ändern, wenn der Hash generiert wird (aktuelle sys-Zeit oder so)

Überprüfen Sie Quake III Arena Quellcode. Ihre Version war ziemlich narrensicher. Leider kann ich mich nicht mehr an den Link erinnern.


-2
2018-05-08 03:32