Wie kann ich Levels als "vollständig" markieren, um Betrug zu verhindern?

8

Meine ersten Gedanken zum Markieren von Ebenen sind, die Informationen nach Abschluss der Ebene einfach in eine Datei zu schreiben und diese zu laden, sobald die App wieder geöffnet wird. Aber wie könnte ich dies vor Manipulationen schützen und Betrug verhindern?

Madmenyo
quelle
"Wie Candy Crush das macht" ist hier nicht zum Thema, daher habe ich diesen Aspekt der Frage entfernt und mich stattdessen auf den Aspekt "Betrug verhindern" konzentriert.
Wenn Sie daran interessiert sind, wie Candy Crush insbesondere mit diesem Problem umgeht
Kevin

Antworten:

19

Das Speichern der Abschlussinformationen in einer lokalen Datei ist eine einfache und durchaus akzeptable Methode. Grundsätzlich wird jedes Spiel dies tun, um den Fortschritt zu verfolgen (in gewisser Weise, obwohl sich die spezifischen Formate für die Daten und den Speichermechanismus unterscheiden).

Der Schutz der Datei vor Manipulationen ist schwieriger. Wenn es keinen zwingenden Grund gibt (kein Vorteil für den Spieler, keine Belohnungen usw.), können Sie normalerweise davonkommen, ohne sich darum zu kümmern.

Aber wenn du es tust darum kümmern und Sie und wenn Sie vernünftigerweise erwarten können, dass Ihre Plattform geschlossen ist (z. B. Konsolen und iOS-Geräte ohne Jailbreak), müssen Sie sich auch keine allzu großen Sorgen machen. Der Benutzer ist normalerweise nicht physisch in der Lage, auf die Datei zuzugreifen, um sie zu manipulieren (vorausgesetzt, Sie verwenden die entsprechenden Betriebssystem-APIs, um die Daten an "privaten" und öffentlichen Speicherorten zu speichern (z. B. Speichern dieser Datei im iCloud Drive des Benutzers unter iOS) ist wahrscheinlich keine gute Idee).

Wenn Sie absolut besorgt sind, dass Manipulationen bis zu dem Punkt vorgenommen werden, an dem dies nicht mehr geschehen darf (z. B. wenn ein Spieler mit mehr abgeschlossenen Levels einen Vorteil erzielen kann), müssen Sie die Datenserverseite speichern. Alles, was clientseitig gespeichert wird, kann letztendlich kompromittiert werden und sollte nicht als vertrauenswürdig eingestuft werden: Es ist der Computer des Benutzers in den Händen des Benutzers. Die Steuerungsdynamik ist einfach nicht zu Ihren Gunsten.

Natürlich ist es auch nicht unbedingt unmöglich, serverseitig gespeicherte Dateien zu hacken, aber es ist viel schwieriger, wenn Sie ein vernünftiges Buchhaltungssystem haben.


quelle
Danke, ich möchte nur nicht, dass es einfach ist, mit den Progres-Dateien zu temperieren. Ich habe weitergelesen und mich gefragt, ob die Preferencespezifische Klasse LibGDXmir helfen kann. Ich könnte einfache Boolesche Werte für die Levels speichern und vielleicht auch mit einem einzigen Highscore.
Madmenyo
@MennoGouw: Wenn wir hier über Android sprechen, sind Dateien, die für die App privat sind, nur zugänglich, wenn das Gerät gerootet ist. Vermutlich verwendet libGDX solche Dateien für Einstellungen.
NJZK2
Sie können auch eine Verschlüsselung verwenden, bei der ein Schlüssel auf Ihrem Server gespeichert ist, die Daten jedoch lokal gespeichert sind. Fordern Sie dann beim Spielstart den Schlüssel an und entschlüsseln Sie die Sicherungsdatei.
Kroltan
1
@Kroltan Aber dann könnten Sie das Gerät während des Betriebs RAM-sichern, den Schlüssel holen und die Datei manipulieren. (In einem Emulator, wenn nötig.)
wchargin
1
Der Benutzer kann auch nur den vom Webserver kommenden Stream ändern, da der Computer des Benutzers den Schlüssel zum Entschlüsseln hat, selbst wenn die Verbindung verschlüsselt ist. Dann muss er nur noch die Werte ändern, zum Beispiel {"finalLevelCompleted":true}. Erledigt.
Kroltan
9

Sie können eine Wiedergabedatei als Arbeitsnachweis erstellen, während der Player spielt. Starten Sie das Spiel, speichern Sie die Startbedingungen einschließlich des Namens des Levels und des Pseudozufalls-Seeds, zeichnen Sie die genauen zeitgestempelten Eingabezustände (Mausbewegungen, Tastendruck oder Tastendruck usw.) auf, die die Eingabeebene Ihres Spiels an die Logikebene weitergibt, und stoppen Sie Aufzeichnung, sobald das Ziel erreicht ist. Sie können ein Eingabeprotokoll mit Run-Length-Codierung (RLE) komprimieren, sodass nur Änderungen in den Schaltflächenzuständen (Drücken, Freigeben und dergleichen) Protokollereignisse verursachen. Anhand der Anfangsbedingungen und des Eingabeprotokolls können Sie die Erfüllung des Ziels überprüfen, indem Sie die Eingaben in die Physik und KI des Spiels wiederholen.

Protokolle wie dieses haben mehrere Anwendungen, die Spielern von Videospielen vertraut sind, insbesondere emulierte Spiele. Spieler können ein Spiel lokal aus einem Protokoll erneut ansehen, um nach Strategiefehlern zu suchen oder mit lokalen Freunden zu prahlen. Der Anziehungsmodus Ihres Spiels kann aus Protokollen für ausgewählte Level bestehen. Das Netplay in Spielen, die die GGPO-Engine verwenden, ist ähnlich aufgebaut, mit einer Verzögerung von einigen Frames zwischen der Eingabe und der Game-Engine, damit die Eingabe des anderen Spielers über das Internet eintreffen kann. Außerdem können Sie von Leaderboard-Teilnehmern verlangen, dass sie das Protokoll hochladen. Anschließend führt Ihr Server es im Schnellvorlauf auf einer abgespeckten Kopie des Spiels ohne Grafik-Engine aus. Um einen Wiederholungsangriff zu verhindern, bei dem ein Spieler das Protokoll eines anderen Spielers hochlädt, können die Informationen, die zum Setzen des Pseudozufallszahlengenerators des Spiels verwendet werden, die Benutzer-ID der Rangliste des Spielers enthalten. Auf diese Weise kann der Server sie vergleichen,

Einige äußerst engagierte Spieler erstellen manuell ein Eingabeprotokoll, das einen Arbeitsnachweis darstellt. Dies wird als "werkzeuggestützter Speedrun" bezeichnet. Wenn Sie TAS nicht in Ihren öffentlichen Bestenlisten haben möchten, können Sie Spiele auf den höchsten Wettbewerbsstufen verlangen, während Sie mit dem Internet verbunden sind. Der Server sendet alle paar Sekunden einen Schlüsselwert, und der Client sendet das Eingabeprotokoll in Echtzeit, als wäre es Netplay, verschlüsselt mit diesem Schlüssel. Dieser Schlüssel ändert sich alle paar Sekunden und in Spielen, die ein zufälliges Element verwenden, wird möglicherweise der Pseudozufallszahlengenerator neu gesetzt. Wenn die anhaltende Verzögerung zwischen dem Senden eines Schlüssels und dem Empfangen der entsprechenden Eingabepakete einige Sekunden überschreitet, können wir davon ausgehen, dass der Benutzer etwas "Lustiges" versucht.

Damian Yerrick
quelle
TAS ist mehr als nur das manuelle Erstellen eines Protokolls, das wiedergegeben werden soll. Es bedeutet, dass das Spiel so manipuliert wurde, dass Sie Zustände speichern und es Frame für Frame spielen können, um jedes Mal die perfekten Aktionen zu erzielen. Es ist nicht dein Punkt, aber es ist erwähnenswert. en.wikipedia.org/wiki/Tool-assisted_speedrun
TankorSmash
3

Wenn Sie dies vollständig auf der Clientseite tun möchten und den von Ihrer Plattform bereitgestellten privaten Speicher nicht als sicher genug betrachten (z. B. wenn für das Abschließen von Levels tatsächlich Geld erforderlich ist), benötigen Sie einen Arbeitsnachweis. Ihre Sicherungsdatei muss Informationen enthalten, die so gestaltet sind, dass das Erstellen der Informationen nur schwer zu berechnen ist, wenn Sie die zugehörige Ebene abgeschlossen haben. Sie können jedoch leicht von einem Dritten überprüft werden, der diese bestimmte Ebene nicht unbedingt abgeschlossen hat (vorzugsweise ohne dass dies erforderlich ist) die Lösung selbst kennen). Je größer der Unterschied in der Schwierigkeit ist, den Arbeitsnachweis vor und nach Abschluss des Levels zu berechnen, desto sicherer ist der Arbeitsnachweis.

Leider muss dieser Arbeitsnachweis so sein, dass er an das Gameplay gebunden ist. Daher gibt es keine generische Möglichkeit, dies für beliebige Spiele zu tun, und Ihre ausführbare Spieledatei darf die Lösung für das Spiel in keiner Weise enthalten, oder auf andere Weise Es ist ganz einfach, den Arbeitsnachweis aus der ausführbaren Datei zu extrahieren. In den meisten Fällen müssen Sie Ihr Gameplay fast immer speziell auf diese spezielle Anforderung abstimmen, damit ein Arbeitsnachweis betrügerisch ist, sodass Sie auch etwas kreative Freiheit verlieren.

Beispiel: Bei einem Sudoku-Spiel könnte der Arbeitsnachweis das fertige Sudoku-Board sein (beachten Sie, dass das Board von einem vertrauenswürdigen Dritten erstellt werden muss, da die meisten Algorithmen zur Generierung von Sudoku-Boards die Lösung vorberechnen müssen, wodurch der Beweis von geschwächt wird Arbeit, wenn es auf dem Client erledigt ist). Oder ein Spiel, bei dem eine große zusammengesetzte Zahl berücksichtigt wird. Der Beweis der Arbeit ist der Hauptfaktor (ich würde ein solches Spiel RSA gegen NSA nennen).

Um wirklich sicher zu sein, muss Ihr Spiel einige zufällige Elemente enthalten, denn wenn Ihr Spiel völlig deterministisch ist, ist es möglich, den Arbeitsnachweis von jemand anderem zu kopieren, der das Level abgeschlossen hat (dies ist ein Wiederholungsangriff).

Das Ziel des Arbeitsnachweises ist es, das Betrügen mindestens so schwierig zu machen wie das Erstellen eines Bots für das Spiel. Um ein Sudoku-Spiel zu betrügen, benötigen Sie einen Sudoku-Löser usw.

Das ist extrem schwer. Wenn es sich um ein Einzelspieler-Spiel handelt, ist es besser, Ihre kreative Freiheit zu bewahren und sich keine Sorgen über Betrug zu machen. Es ist ihr Spiel, sie haben es gekauft und wenn sie betrügen, hat das keinen Einfluss auf Ihr Endergebnis. Oder verwandeln Sie es in ein serverbasiertes Spiel und erledigen Sie alle wichtigen Spielelogiken auf dem Server.

Lie Ryan
quelle
1

Wenn Sie es vorziehen, eine externe Datei zum Speichern von Informationen zu verwenden, und diese sich an einem Ort befindet, der von Benutzern manipuliert werden kann, sollten Sie sich über die Funktionsweise der Verschlüsselung informieren und diese verwenden, um zu verhindern, dass jemand sinnvolle Änderungen an der vornehmen kann Datei. So etwas wie eine Feistel-Chiffre sollte ein guter Ausgangspunkt sein und ausreichen, um jemanden ohne viel Zeit und Know-how daran zu hindern, eine Sicherungsdatei zu ändern. http://en.wikipedia.org/wiki/Feistel_cipher

Abgesehen davon hat Josh den Nagel auf den Kopf getroffen, wenn es um clientseitige und serverseitige Speicherung geht.

Archivierung
quelle
0

Wenn jemand in der Lage ist, die Binärdatei zu durchsuchen und den Algorithmus herauszufinden, können Sie dies nie wirklich verhindern. Machen Sie sich also keine Sorgen.

Verwenden Sie zum Stoppen einfach einen kryptografischen Hash!

Angenommen, Sie haben Folgendes:

function computeHash(levels) {
    code = "";
    for(level in levels) {
       code = hash(code+level+level.isComplete()+"MAGICSALT")
    }
}

Es ist wirklich einfach, aber es bedeutet, dass Sie am Ende der Datei einen Code schreiben müssen, diese Datei dann wie gewohnt analysieren und dies tun müssen computeHash(levelListReadFromFile);

WENN dieser Hash = Code in der Datei gelesen wird, dann ist es sehr wahrscheinlich "legitim". Damit meine ich ... jemand mit einem Hex-Editor wird es nicht knacken, es wird jemanden brauchen, der sich auskennt.

Bevorzugen Sie immer den lokalen Speicher BTW - es sei denn, es handelt sich offensichtlich um ein MMO, möchten die Leute nicht, dass Sie ihre Daten verwenden, in Züge steigen und alle möglichen Dinge tun. Ich hasse Programme, die ohne guten Grund einen Internetzugang benötigen.

Alec Teal
quelle
Downvoter warum ???
Alec Teal