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? ?
networking
multiplayer
security
anti-cheat
User093203920
quelle
quelle
Antworten:
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.
quelle
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:
quelle
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.
quelle
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.
quelle