Verhindern Sie Mehrspieler-Betrug


10

Ich bin fast fertig mit der Entwicklung eines kleinen Multiplayer-Spiels im Indie-Stil. Während ich beabsichtige, Leuten zu erlauben, im Einzelspieler-Modus zu betrügen, ist dies im Mehrspieler-Modus offensichtlich nicht akzeptabel. Kennt jemand Möglichkeiten, um zu verhindern, dass der durchschnittliche Joe so etwas wie Cheat-Engine verwendet, um Teile des Spiels zu modifizieren? Ich plane derzeit, dass der Client alle paar Sekunden einen MD5-Hash jeder Einstellungsdatei, die das Spiel verwendet (als XML gespeichert), zur Überprüfung auf den Spieleserver hochlädt. Kann ich jedoch alles tun, um Dinge wie Speichereditoren usw. Zu stoppen? ?


2
Ich würde diesen Artikel, Erstellen von Multiplayer-Spielen - Sicherheit , für einige Multiplayer-APIs empfehlen , aber die Ideen sind gut und gelten immer noch
Cyral

Antworten:


8

Wenn Sie sich Sorgen über lokal geänderten Code machen, wie können Sie dann sicher sein, dass jemand Ihren Benachrichtigungscode nicht einfach geändert hat, um eine statische Liste von MD5-Hashes zu senden, die Sie auch erwarten? Tatsächlich benötigen Sie dazu nicht einmal eine Code-Änderung, sondern nur einen ziemlich einfachen Proxy (vorausgesetzt, kein SSL, aber selbst das könnte mit etwas mehr Aufwand gefälscht werden).

Die einzige Möglichkeit, das zu tun, was Sie wollen, besteht darin, einen Server zu haben und dem Client einfach überhaupt nicht zu vertrauen. Alle Berechnungen sollten auf dem Server durchgeführt und alle Aktionen als zumindest einigermaßen möglich überprüft werden. Lassen Sie den Client beispielsweise nicht sagen, dass er auf eine Seite der Karte wechseln möchte, wenn Sie wissen, dass er sich vor einem Moment auf der anderen Seite befand. Ohne einen Server in der Mitte, der alles tut, was für das Spiel wichtig ist, ist es unmöglich , nicht zu schummeln, denn jemand, der klug ist, wird es immer tunFinden Sie einen Weg um alles herum, was Sie in den Client einbauen können. Selbst mit einem ist es immer noch möglich, wenn Sie nicht über die verschiedenen Möglichkeiten nachdenken, die Situation leicht zu manipulieren. Zum Beispiel die zuvor erwähnte Bewegungsvalidierung: Wenn Sie eine einfache Punkt-zu-Punkt-Berechnung durchführen, können sich Personen möglicherweise immer noch durch Wände teleportieren.

Die Frage ist also, wie durchschnittlich ist "durchschnittlicher Joe"? Sie haben bereits Code-Bearbeitung und Speicher-Editoren erwähnt. Das liegt über dem, was ich persönlich als Durchschnittsniveau betrachten würde, und wenn Sie sich über dieses Niveau Sorgen machen möchten, ist ein separater vertrauenswürdiger Server erforderlich, der das ganze schwere Heben übernimmt, und der Client wird sich darauf beschränken, im Wesentlichen nur Anzeige- und Eingabegeräte zu sein.


2
@ user185812: Es ist normalerweise eine gute Idee, mindestens einige Stunden zu warten, bevor eine akzeptierte Antwort markiert wird. Während ich persönlich denke, dass meine Antwort ziemlich gut ist (ich bin voreingenommen), werden andere wahrscheinlich mehr Input haben und eine akzeptierte Antwort zu sehen, ist oft eine Abschreckung für andere, um zu antworten.
Matthew Scharley

@ MatthewScharley - keine Sorge. ;)
Martin Sojka

11

Der Kunde ist in den Händen des Feindes. ( Die Gesetze des Online World Design )

Die einzige Möglichkeit, die meisten Cheats zu schlagen, besteht darin, den Client als "Thin Client" zu haben, dh nur als Eingabe- und Ausgabegerät zu fungieren und ihm niemals mehr Informationen zu geben, als er genau benötigt.

Dadurch wird die Automatisierung nicht gestoppt, und das passive Sammeln und Analysieren von Informationen wird nicht gestoppt. Sie können Ihr Spiel jedoch so gestalten, dass diese keine wesentlichen Auswirkungen haben.

Dies wird nicht verhindern, dass sich Menschen gegenseitig über fehlerhafte Nachrichten hacken, auf die sich der Server stützt. Ihr Client muss sich vor Nachrichten vom Server schützen, genauso wie Sie Ihre Websites vor SQL-Injection-Angriffen schützen würden.

Da Sie denselben Client auch für das Einzelspieler-Spiel verwenden möchten, besteht eine Lösung darin, einen lokalen Server in einem separaten Prozess / Thread auszuführen und ihn intern als Client / Server-Einstellung zu behandeln. Die "Cheats" würden dann auf der Serverseite funktionieren. Minecraft macht etwas Ähnliches, obwohl es keineswegs das erste Spiel ist, das die Spiel-Engine so von seiner Oberfläche trennt.

Vorgeschlagene Literatur:


2

In einem einfachen Multiplayer-Spiel funktioniert das Betrügen in der Art von Cheat-Engine einfach nicht. Die Clients senden nur die Daten und die Aktionen, für die Sie sie entworfen haben. Normalerweise ist das nicht viel mehr als das, was der Spieler "getan" hat, z. B. in welche Richtung er läuft, wenn er schießt und so weiter. Die Änderungen, die er am Speicher vornimmt, wirken sich also nur auf sein eigenes Spiel aus, aber die anderen Spieler sehen keine Änderung, eine sogenannte Desync. Die meisten Spiele erkennen solche Desyncs und entfernen den desynchronisierten Spieler aus dem Spiel.

Jetzt gibt es auch andere Möglichkeiten zu betrügen, aber hier geht es darum, wie Ihr Spiel gestaltet ist.

Um sich vor den einfachsten Hacks zu schützen, bei denen Netzwerknachrichten gefälscht werden, sollte der Server diese Pakete auf ihre Richtigkeit überprüfen. "Der Typ hat gerade 5 Bildschirme gesprungen? Das ist unmöglich, Paket zu verweigern." (Beachten Sie, dass Sie auch die vollständig synchronisierte Route wählen können - das bedeutet, dass alles synchronisiert ist und nur "Welche Tasten hat der Player gedrückt?" - Art von Nachrichten werden gesendet -, wodurch gefälschte Netzwerknachrichten vom Design her unbrauchbar werden.)

Die letzte Art des Betrugs im Mehrspielermodus sind Sichtbarkeits-Hacks, bei denen der Client so geändert wird, dass dem Spieler Daten angezeigt werden, die er nicht kennt. Beispiele hierfür sind nicht der Nebel des Krieges, die Fähigkeit, durch Wände zu schauen, eine Minikarte oder andere Dinge anzuzeigen. Diese sind unmöglich zu verhindern.


Ich bin nicht einverstanden mit den Sichtbarkeits-Hacks. Könnten diese nicht verhindert werden, indem dem Kunden keine Informationen gegeben werden, bis sein Charakter davon Kenntnis hat? Versteh mich nicht falsch, das ist vielleicht kein gutes Design. Aber das ist etwas anderes als unmöglich zu verhindern.
Xuincherguixe

@xuincherguixe Ich denke, es ist unter bestimmten Umständen unmöglich. Zum Beispiel spielen beide Clients unter derselben IP und demselben Port. In diesem Fall ist es nur der gute Wille eines Kunden, der ihn daran hindert, Daten zu lesen, die für den anderen bestimmt sind.
Wodzu

1

Um grundlegende Cheat Engine-Hacks zu verhindern, die die Werte Ihrer Variablen manipulieren, müssen Sie diese Werte ausblenden. In der Regel wird die Cheat Engine verwendet, um den Speicherort interessanter Variablen (z. B. die Menge an Gold oder das Leben oder die Upgrade-Stufe einer Fähigkeit) zu ermitteln, indem nach dem bekannten Wert dieser Variablen gesucht wird, mehr vom Spiel gespielt wird und der Wert dazu veranlasst wird ändern, dann würde Cheat Engine eine neue Suche aus dem Ergebnis der vorherigen Suche nach dem neuen Wert durchführen. Auf diese Weise kann der Cheater den Speicherort des Werts vergrößern. Jetzt kann er den Wert dieses Speicherorts mithilfe der Cheat Engine ändern.

Zum Beispiel habe ich 245 GOLD ... mit Cheat Engine suche ich nach 245 und finde viele Speicherplätze. Dann spiele ich noch etwas und bringe mein Gold auf 314, suche dann in der vorherigen Suchausgabe nach dem Wert 314 und finde leicht den Speicherort für GOLD.

Um dies zu verhindern, muss der tatsächliche Wert niemals an einem Speicherort gespeichert werden. Zum Beispiel speichere ich den Wert in einem Objekt, das den tatsächlichen Wert bei Bedarf berechnen muss, wenn er benötigt wird. Nehmen wir also an, der Spieler hat 245 GOLD. Wenn sie nach einem Speicherort mit dem Wert 245 suchen, finden sie möglicherweise viele, aber keiner von ihnen ist der Speicherort, an dem der Goldwert tatsächlich gespeichert ist, dh weil Sie den Wert 245 für Gold nicht speichern. Wenn das Spiel wissen muss, wie viel Gold es hat, fragt es das Objekt, das den Wert dafür enthält, und berechnet es bei Bedarf.

Die Frage ist nun: Wie genau speichern Sie einen Wert so, dass er nicht angezeigt wird? Das wird etwas knifflig und hässlich und ich bin mir sicher, dass es viele Möglichkeiten gibt, dies zu tun. Was ich gerne mache, ist ein boolesches Array (oder Byte-Array) zu speichern. Die Länge des Arrays kann beliebig sein, aber sagen wir, es ist 13. Dann haben Sie einen Zähler, der angibt, wie oft 13 in diesen tatsächlichen Wert geht. Wenn wir also 245 darstellen wollen, hätte der Zähler einen Wert von 18. Jetzt würden für das Array alle Booleschen Werte für den Rest von 245/13 auf true gesetzt ... im Grunde genommen der Modul. In diesem Fall sind das 11, sodass die ersten 11 Booleschen Werte im Array auf true und der Rest auf false gesetzt werden. Um den Wert abzurufen, müssen Sie lediglich den Zähler mit der Array-Länge multiplizieren und dann 1 für jeden Booleschen Satz auf true addieren (beim ersten false anhalten). Jetzt würde die Nummer 245 niemals irgendwo gespeichert werden und es wäre schwierig, den Speicherort zu finden, der manipuliert werden müsste, um die Goldmenge zu ändern. Möglicherweise möchten Sie die Array-Länge auf verschiedene Größen einstellen (möglicherweise zufällig eine Zahl zwischen einem vernünftigen Bereich auswählen), wenn dieses Objekt erstellt wird.

BEARBEITEN: Dies ist nützlich für Multiplayer und Einzelspieler. Es gibt Betrug, der auch im Mehrspielermodus ausgeführt werden kann, bei dem die Werte in den Paketen geändert werden können. Dies würde verschiedene Techniken erfordern, um dies zu verhindern, wie das Signieren jedes Pakets.


1
Um Betrug zu verhindern, berechnen Multiplayer-Spiele normalerweise alles auf dem Server. Wenn Sie also einen Wert auf dem Client oder in einem an den Server gesendeten Paket ändern, ändert sich nichts am tatsächlichen Spiel. Trotzdem ist der Rest der Antwort interessant.
Vaillancourt

@AlexandreVaillancourt Guter Punkt. Ich bin besorgt darüber, die CPU des Servers zu blockieren und Signaturen zu berechnen. Ich möchte den Server schnell halten, indem ich nur Pakete zwischen den beiden Spielern weitergebe, aber ich werde jetzt, da Sie darauf hingewiesen haben, genauer hinschauen.
Jose Martinez

Wenn Sie nur die Eingaben vom Client an den Server senden, müssen Sie nicht jedes Paket signieren. Sobald die Eingabe auf dem Server keinen Sinn ergibt, werden sie entweder einfach abgelehnt oder der Client wird wegen Betrugs rausgeschmissen. Der Server berechnet den nächsten Status des Spiels und sendet dann den neuen Status an alle Spieler. So wird normalerweise Betrug vermieden (Sie werden solche Bots nicht los, aber zumindest vermeiden Sie gelegentliches Betrügen durch die Spieler). .
Vaillancourt

1
Um dies zu vermeiden, lassen Sie den Server das neue Leben aktualisieren und senden das neue Leben dann an den Client. Alles wird auf dem Server berechnet und die Clients sind einfach "dumme Terminals" für alle wichtigen Dinge: Der Client ist dafür verantwortlich, die Eingaben vom Player zu erfassen ("zum Zeitpunkt T auf x, y geklickt", "getroffen" Taste X zum Zeitpunkt T "), sendet sie an den Server und empfängt den neuen Status vom Server (" der Spieler befindet sich jetzt an Position X, Y "," der Spieler hat das Leben ZZZ ") und zeigt ihn dem Spieler an.
Vaillancourt

1
Damit kann der Betrüger (Mann in der Mitte) alles, was er will, mit den Paketen durcheinander bringen. Dies ändert nicht den Status des Spiels auf dem Server, da der Server sicherstellt, dass die Eingabe gültig ist ("hmm, der Client hat geklickt." an fünf verschiedenen Stellen innerhalb der letzten 0,03 Sekunden ist das nicht normal, lasst uns diese Klicks ablehnen ") und die gesamte Simulation selbst ausführen .
Vaillancourt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.