Ich spreche von einem Actionspiel ohne obere Punktzahlbegrenzung und ohne Möglichkeit, die Punktzahl auf dem Server durch Wiederholen von Zügen usw. zu überprüfen.
Was ich wirklich brauche, ist die stärkste Verschlüsselung, die in Flash / PHP möglich ist, und eine Möglichkeit, zu verhindern, dass Leute die PHP-Seite anders als über meine Flash-Datei aufrufen. Ich habe in der Vergangenheit einige einfache Methoden ausprobiert, um mehrere Anrufe für eine einzelne Punktzahl zu tätigen, eine Prüfsummen- / Fibonacci-Sequenz usw. zu vervollständigen und die SWF mit Amayeta SWF Encrypt zu verschleiern, aber sie wurden schließlich alle gehackt.
Dank der Antworten von StackOverflow habe ich jetzt weitere Informationen von Adobe gefunden - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html und https://github.com/mikechambers/as3corelib - was ich glaube kann für die Verschlüsselung verwenden. Ich bin mir nicht sicher, ob ich damit CheatEngine umgehen kann.
Ich muss die besten Lösungen für AS2 und AS3 kennen, wenn sie unterschiedlich sind.
Die Hauptprobleme scheinen Dinge wie TamperData- und LiveHTTP-Header zu sein, aber ich verstehe, dass es auch fortgeschrittenere Hacking-Tools gibt - wie CheatEngine (danke Mark Webster)
Antworten:
Dies ist ein klassisches Problem bei Internet-Spielen und -Wettbewerben. Ihr Flash-Code arbeitet mit Benutzern zusammen, um eine Punktzahl für ein Spiel zu bestimmen. Benutzer sind jedoch nicht vertrauenswürdig und der Flash-Code wird auf dem Computer des Benutzers ausgeführt. Du bist SOL. Sie können nichts tun, um einen Angreifer daran zu hindern, hohe Punktzahlen zu erzielen:
Flash ist noch einfacher zurückzuentwickeln, als Sie vielleicht denken, da die Bytecodes gut dokumentiert sind und eine Hochsprache (Actionscript) beschreiben. Wenn Sie ein Flash-Spiel veröffentlichen, veröffentlichen Sie Ihren Quellcode, egal ob Sie weiß es oder nicht.
Angreifer steuern den Laufzeitspeicher des Flash-Interpreters, sodass jeder, der weiß, wie man einen programmierbaren Debugger verwendet, jederzeit eine beliebige Variable (einschließlich der aktuellen Punktzahl) oder das Programm selbst ändern kann.
Der einfachste mögliche Angriff auf Ihr System besteht darin, den HTTP-Verkehr für das Spiel über einen Proxy auszuführen, den Highscore-Save abzufangen und ihn mit einem höheren Score erneut abzuspielen.
Sie können versuchen, diesen Angriff zu blockieren, indem Sie jeden gespeicherten Highscore an eine einzelne Instanz des Spiels binden, indem Sie beispielsweise beim Start des Spiels ein verschlüsseltes Token an den Client senden. Dies könnte folgendermaßen aussehen:
(Sie können auch ein Sitzungscookie verwenden, um den gleichen Effekt zu erzielen.)
Der Spielcode gibt dieses Token mit dem Highscore-Save an den Server zurück. Ein Angreifer kann das Spiel jedoch trotzdem erneut starten, einen Token erhalten und diesen Token dann sofort in einen erneut gespielten Highscore-Save einfügen.
Als Nächstes geben Sie nicht nur ein Token oder ein Sitzungscookie ein, sondern auch einen Sitzungsschlüssel mit hoher Punktzahl. Dies ist ein 128-Bit-AES-Schlüssel, der selbst mit einem im Flash-Spiel fest codierten Schlüssel verschlüsselt ist:
Bevor das Spiel den Highscore veröffentlicht, entschlüsselt es den Highscore-Verschlüsselungs-Sitzungsschlüssel, was es tun kann, weil Sie den Highscore-Verschlüsselungs-Sitzungsschlüssel-Entschlüsselungsschlüssel in die Flash-Binärdatei fest codiert haben. Sie verschlüsseln den Highscore mit diesem entschlüsselten Schlüssel zusammen mit dem SHA1-Hash des Highscores:
Der PHP-Code auf dem Server überprüft das Token, um sicherzustellen, dass die Anforderung von einer gültigen Spielinstanz stammt, entschlüsselt dann den verschlüsselten Highscore und stellt sicher, dass der Highscore mit dem SHA1 des Highscores übereinstimmt (wenn Sie diesen Schritt überspringen Entschlüsselung führt einfach zu zufälligen, wahrscheinlich sehr hohen, hohen Punktzahlen.
Jetzt dekompiliert der Angreifer Ihren Flash-Code und findet schnell den AES-Code, der wie ein schmerzender Daumen hervorsteht, auch wenn er nicht in 15 Minuten mit einer Speichersuche und einem Tracer aufgespürt würde ("Ich weiß Meine Punktzahl für dieses Spiel ist 666, also lasst uns 666 im Speicher finden und dann jede Operation abfangen, die diesen Wert berührt - oh schau, der Highscore-Verschlüsselungscode! "). Mit dem Sitzungsschlüssel muss der Angreifer nicht einmal den Flash-Code ausführen. Sie schnappt sich einen Spielstart-Token und einen Sitzungsschlüssel und kann einen beliebigen Highscore zurücksenden.
Sie sind jetzt an dem Punkt angelangt, an dem die meisten Entwickler einfach aufgeben - geben oder nehmen Sie sich ein paar Monate Zeit, um sich mit Angreifern herumzuschlagen, indem Sie:
Verwürfeln der AES-Tasten mit XOR-Operationen
Ersetzen von Schlüsselbyte-Arrays durch Funktionen, die den Schlüssel berechnen
Streuung gefälschter Schlüsselverschlüsselungen und Highscore-Postings in der gesamten Binärdatei.
Das ist alles meistens Zeitverschwendung. Es versteht sich von selbst, dass SSL Ihnen auch nicht helfen wird. SSL kann Sie nicht schützen, wenn einer der beiden SSL-Endpunkte böse ist.
Hier sind einige Dinge, die den Highscore-Betrug tatsächlich reduzieren können:
Erfordern Sie eine Anmeldung, um das Spiel zu spielen, lassen Sie die Anmeldung ein Sitzungscookie erstellen und lassen Sie nicht zu, dass mehrere ausstehende Spiele in derselben Sitzung oder mehrere Sitzungen gleichzeitig für denselben Benutzer gestartet werden.
Lehnen Sie Highscores von Spielsitzungen ab, die weniger als die kürzesten jemals gespielten realen Spiele dauern (für einen differenzierteren Ansatz versuchen Sie, Highscores für Spielsitzungen, die weniger als 2 Standardabweichungen unter der mittleren Spieldauer dauern, unter Quarantäne zu stellen). Stellen Sie sicher, dass Sie die Spieldauer auf der Serverseite verfolgen.
Ablehnen oder Quarantäne von Highscores von Anmeldungen, die das Spiel nur ein- oder zweimal gespielt haben, so dass Angreifer für jede von ihnen erstellte Anmeldung eine "Papierspur" mit angemessen aussehendem Spielverlauf erstellen müssen.
"Heartbeat" punktet während des Spiels, sodass Ihr Server das Wachstum der Punktzahl über die Lebensdauer eines Spiels sieht. Lehnen Sie Highscores ab, die keinen vernünftigen Score-Kurven folgen (z. B. Springen von 0 auf 999999).
"Snapshot" -Spielstatus während des Spiels (z. B. Munitionsmenge, Position im Level usw.), den Sie später mit den aufgezeichneten Zwischenergebnissen abgleichen können. Sie müssen nicht einmal eine Möglichkeit haben, Anomalien in diesen Daten zu erkennen. Sie müssen es nur sammeln, und dann können Sie zurückgehen und es analysieren, wenn die Dinge faul aussehen.
Deaktivieren Sie das Konto eines Benutzers, der eine Ihrer Sicherheitsüberprüfungen nicht besteht (z. B. indem Sie jemals einen verschlüsselten Highscore senden, bei dem die Validierung fehlschlägt).
Denken Sie jedoch daran, dass Sie hier nur Highscore-Betrug abschrecken. Es gibt nichts Sie tun können , um zu verhindern , wenn. Wenn in Ihrem Spiel Geld auf dem Spiel steht, wird jemand jedes System besiegen, das Sie sich ausgedacht haben. Das Ziel ist nicht, diesen Angriff zu stoppen ; Es geht darum, den Angriff teurer zu machen, als nur richtig gut im Spiel zu werden und es zu schlagen.
quelle
Möglicherweise stellen Sie die falsche Frage. Sie scheinen sich auf die Methoden zu konzentrieren, mit denen sich die Spieler in der Highscore-Liste nach oben bewegen, aber das Blockieren bestimmter Methoden geht nur so weit. Ich habe keine Erfahrung mit TamperData, daher kann ich nicht mit ihm sprechen.
Die Frage, die Sie stellen sollten, lautet: "Wie kann ich überprüfen, ob die eingereichten Ergebnisse gültig und authentisch sind?" Die spezifische Art, dies zu tun, ist spielabhängig. Bei sehr einfachen Puzzlespielen können Sie die Punktzahl zusammen mit dem spezifischen Startstatus und der Reihenfolge der Züge, die zum Endzustand geführt haben, senden und das Spiel dann auf der Serverseite mit denselben Zügen erneut ausführen. Bestätigen Sie, dass die angegebene Punktzahl mit der berechneten Punktzahl übereinstimmt, und akzeptieren Sie die Punktzahl nur, wenn sie übereinstimmt.
quelle
Eine einfache Möglichkeit, dies zu tun, besteht darin, einen kryptografischen Hash Ihres Highscore-Werts zusammen mit der Punktzahl selbst bereitzustellen. Wenn Sie beispielsweise die Ergebnisse über HTTP GET veröffentlichen: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095
Bei der Berechnung dieser Prüfsumme sollte ein gemeinsames Geheimnis verwendet werden. Dieses Geheimnis sollte niemals über das Netzwerk übertragen werden, sondern sowohl im PHP-Backend als auch im Flash-Frontend fest codiert werden. Die obige Prüfsumme wurde erstellt, indem der Zeichenfolge " secret " die Punktzahl " 500 " vorangestellt und durch md5sum ausgeführt wurde.
Obwohl dieses System einen Benutzer daran hindert, beliebige Punktzahlen zu veröffentlichen, verhindert es nicht einen "Wiederholungsangriff", bei dem ein Benutzer eine zuvor berechnete Kombination aus Punktzahl und Hash erneut veröffentlicht. Im obigen Beispiel würde eine Punktzahl von 500 immer dieselbe Hash-Zeichenfolge erzeugen. Ein Teil dieses Risikos kann durch Einfügen weiterer Informationen (z. B. eines Benutzernamens, eines Zeitstempels oder einer IP-Adresse) in die zu hashende Zeichenfolge verringert werden. Dies verhindert zwar nicht die Wiedergabe von Daten, stellt jedoch sicher, dass ein Datensatz nur für einen einzelnen Benutzer gleichzeitig gültig ist.
Um zu verhindern, dass Wiederholungsangriffe auftreten, muss eine Art Challenge-Response-System erstellt werden, z. B. das folgende:
Bitte beachten Sie, dass die Sicherheit einer der oben genannten Techniken beeinträchtigt wird, wenn das gemeinsame Geheimnis dem Benutzer jemals zugänglich ist
Alternativ könnte ein Teil dieses Hin und Her vermieden werden, indem der Client gezwungen wird, über HTTPS mit dem Server zu kommunizieren, und sichergestellt wird, dass der Client so konfiguriert ist, dass er nur Zertifikaten vertraut, die von einer bestimmten Zertifizierungsstelle signiert sind, auf die Sie allein Zugriff haben .
quelle
Ich mag, was tpqf gesagt hat, aber anstatt ein Konto zu deaktivieren, wenn Betrug entdeckt wird, implementieren Sie einen Honeypot, damit sie bei jeder Anmeldung ihre gehackten Ergebnisse sehen und nie ahnen, dass sie als Troll markiert wurden. Google für "phpBB MOD Troll" und Sie werden einen genialen Ansatz sehen.
quelle
In der akzeptierten Antwort erwähnt tqbf, dass Sie einfach eine Speichersuche nach der Bewertungsvariablen durchführen können ("Meine Bewertung ist 666, also suche ich nach der Nummer 666 im Speicher").
Daran führt ein Weg vorbei. Ich habe hier eine Klasse: http://divillysausages.com/blog/safenumber_and_safeint
Grundsätzlich haben Sie ein Objekt, um Ihre Punktzahl zu speichern. Im Setter multipliziert es den Wert, den Sie übergeben, mit einer Zufallszahl (+ und -), und im Getter dividieren Sie den gespeicherten Wert durch den Zufallsmultiplikator, um das Original zurückzugewinnen. Es ist einfach, hilft aber dabei, die Speichersuche zu stoppen.
Schauen Sie sich auch das Video von einigen Leuten an, die hinter der PushButton-Engine stehen und über einige der verschiedenen Möglichkeiten sprechen, wie Sie Hacking bekämpfen können: http://zaa.tv/2010/12/the-art-of-hacking-flash- Spiele / . Sie waren die Inspiration hinter der Klasse.
quelle
Ich habe eine Art Workaround gemacht ... Ich hatte ein Give, bei dem die Punktzahlen erhöht wurden (Sie erhalten immer +1 Punktzahl). Zuerst habe ich angefangen, nach der Zufallszahl zu zählen (sagen wir 14), und als ich die Punktzahlen anzeigte, zeigte ich nur die Punktzahlen var minus 14. Dies war also so, wenn die Cracker zum Beispiel nach 20 suchen, werden sie es nicht finden (es) wird 34 im Speicher sein). Zweitens, da ich weiß, was der nächste Punkt sein soll ... habe ich die Adobe-Kryptobibliothek verwendet, um den Hash für den nächsten Punkt zu erstellen. Wenn ich die Punktzahlen erhöhen muss, überprüfe ich, ob der Hash der inkrementierten Punktzahlen gleich dem Hash ist, der sein sollte. Wenn der Cracker die Punkte im Speicher geändert hat, sind die Hashes nicht gleich. Ich führe eine serverseitige Überprüfung durch und wenn ich vom Spiel und vom PHP verschiedene Punkte erhalten habe, weiß ich, dass es sich um Betrug handelte. Hier ist ein Ausschnitt aus meinem Code (ich verwende die Adobe Crypto Libraty MD5-Klasse und das zufällige Kryptografiesalz. CallPhp () ist meine serverseitige Validierung).
Mit dieser Technik + SWF-Obfustikation konnte ich die Cracker stoppen. Wenn ich die Ergebnisse an den Server sende, verwende ich außerdem meine eigene kleine Verschlüsselungs- / Entschlüsselungsfunktion. So etwas in der Art (serverseitiger Code nicht enthalten, aber Sie können den Algorithmus sehen und in PHP schreiben):
Dann schicke ich die Variable zusammen mit anderen Fake-Vars und sie geht einfach verloren ... Es ist eine Menge Arbeit für ein kleines Flash-Spiel, aber wo es um Preise geht, werden manche Leute einfach gierig. Wenn Sie Hilfe benötigen, schreiben Sie mir eine PM.
Prost, Ico
quelle
Die Verschlüsselung mit einem bekannten (privaten) umkehrbaren Schlüssel wäre die einfachste Methode. Ich bin nicht ganz auf AS, daher bin ich mir nicht sicher, welche Arten von Verschlüsselungsanbietern es gibt.
Sie können jedoch auch Variablen wie die Spiellänge (wieder verschlüsselt) und eine Klickzahl angeben.
Alle Dinge wie diese können rückentwickelt werden. Werfen Sie also eine Menge Junk-Daten ein, um die Leute vom Geruch abzuhalten.
Bearbeiten: Es könnte sich auch lohnen, in einigen PHP-Sitzungen zu spielen. Starten Sie die Sitzung, wenn sie auf Spiel starten klicken und (wie der Kommentar zu diesem Beitrag sagt) die Uhrzeit protokollieren. Wenn sie die Punktzahl einreichen, können Sie überprüfen, ob sie tatsächlich ein offenes Spiel haben und nicht zu früh oder zu groß eine Punktzahl einreichen.
Es könnte sich lohnen, einen Skalar zu erarbeiten, um zu sehen, wie hoch die maximale Punktzahl pro Sekunde / Minute des Spiels ist.
Keines dieser Dinge ist nicht zu umgehen, aber es wird helfen, eine Logik zu haben, die nicht im Flash enthalten ist, wo die Leute sie sehen können.
quelle
Nach meiner Erfahrung wird dies am besten als Social-Engineering-Problem und nicht als Programmierproblem betrachtet. Anstatt sich darauf zu konzentrieren, das Betrügen unmöglich zu machen, sollten Sie sich darauf konzentrieren, es langweilig zu machen, indem Sie die Anreize zum Betrügen entfernen. Wenn der Hauptanreiz beispielsweise öffentlich sichtbare Highscores sind, kann das einfache Anlegen einer Verzögerung beim Anzeigen von Highscores das Betrügen erheblich reduzieren, indem die positive Rückkopplungsschleife für Betrüger entfernt wird.
quelle
Sie können keinen Daten vertrauen, die der Client zurückgibt. Die Validierung muss auf der Serverseite durchgeführt werden. Ich bin kein Spieleentwickler, aber ich mache Business-Software. In beiden Fällen kann Geld beteiligt sein, und die Leute brechen die Verschleierungstechniken auf der Kundenseite.
Senden Sie die Daten möglicherweise regelmäßig an den Server zurück und führen Sie eine Überprüfung durch. Konzentrieren Sie sich nicht auf Client-Code, auch wenn dort Ihre Anwendung lebt.
quelle
Wann immer Ihr Highscore-System auf der Tatsache basiert, dass die Flash-Anwendung nicht verschlüsselte / nicht signierte Highscore-Daten über das Netzwerk sendet, können diese abgefangen und manipuliert / wiedergegeben werden. Daraus folgt die Antwort: Verschlüsseln (anständig!) Oder kryptografisches Signieren von Highscore-Daten. Dies erschwert es zumindest den Leuten, Ihr Highscore-System zu knacken, da sie den geheimen Schlüssel aus Ihrer SWF-Datei extrahieren müssen. Viele Leute werden wahrscheinlich genau dort aufgeben. Auf der anderen Seite genügt eine einzelne Person, um den Schlüssel zu extrahieren und irgendwo zu veröffentlichen.
Echte Lösungen erfordern mehr Kommunikation zwischen der Flash-Anwendung und der Highscore-Datenbank, damit diese überprüfen kann, ob eine bestimmte Punktzahl etwas realistisch ist. Dies ist wahrscheinlich kompliziert, je nachdem, welche Art von Spiel Sie haben.
quelle
Es gibt keine Möglichkeit, es vollständig nicht hackbar zu machen, da es einfach ist, SWFs zu dekompilieren, und ein erfahrener Entwickler-Hacker könnte dann Ihren Code nachverfolgen und herausfinden, wie Sie ein verschlüsseltes System umgehen können, das Sie möglicherweise verwenden.
Wenn Sie einfach verhindern möchten, dass Kinder mithilfe einfacher Tools wie TamperData betrügen, können Sie einen Verschlüsselungsschlüssel generieren, den Sie beim Start an die SWF übergeben. Verwenden Sie dann http://code.google.com/p/as3crypto/ , um den Highscore zu verschlüsseln, bevor Sie ihn an den PHP-Code zurückgeben. Entschlüsseln Sie es dann am Serverende, bevor Sie es in der Datenbank speichern.
quelle
Sie sprechen über das sogenannte "Client Trust" -Problem. Weil der Client (in diesem Geld ein SWF, der in einem Browser ausgeführt wird) etwas tut, für das er entwickelt wurde. Speichern Sie eine hohe Punktzahl.
Das Problem ist, dass Sie sicherstellen möchten, dass "Save Score" -Anfragen von Ihrem Flash-Film kommen und nicht von einer beliebigen HTTP-Anfrage. Eine mögliche Lösung hierfür besteht darin, ein vom Server zum Zeitpunkt der Anforderung generiertes Token (unter Verwendung von Flasm ) in die SWF zu codieren, das der Anforderung beiliegen muss, um eine hohe Punktzahl zu speichern. Sobald der Server diese Punktzahl gespeichert hat, ist das Token abgelaufen und kann nicht mehr für Anforderungen verwendet werden.
Der Nachteil dabei ist, dass ein Benutzer nur einen Highscore pro Ladevorgang des Flash-Films einreichen kann. Sie müssen ihn zwingen, die SWF zu aktualisieren / neu zu laden, bevor er erneut für einen neuen Score spielen kann.
quelle
Normalerweise füge ich dem Highscore-Eintrag "Geisterdaten" der Spielsitzung hinzu. Wenn ich also ein Rennspiel mache, füge ich die Wiederholungsdaten hinzu. Sie haben häufig bereits die Wiedergabedaten für die Wiedergabefunktion oder die Ghost Racing-Funktion (gegen Ihr letztes Rennen spielen oder gegen den Geist von Typ 14 in der Rangliste spielen).
Das Überprüfen ist sehr manuell, aber wenn das Ziel darin besteht, zu überprüfen, ob die Top-10-Einträge in einem Wettbewerb legitim sind, kann dies eine nützliche Ergänzung des Arsenals an Sicherheitsmaßnahmen sein, auf die andere bereits hingewiesen haben.
Wenn das Ziel darin besteht, die Highscores-Liste bis zum Ende der Zeit online zu halten, ohne dass sich jemand sie ansehen muss, bringt Ihnen dies nicht viel.
quelle
Ein neuer beliebter Arcade-Mod sendet Daten vom Flash an PHP, zurück an Flash (oder lädt sie neu) und dann zurück an PHP. Auf diese Weise können Sie alles tun, um die Daten zu vergleichen, und Post-Daten- / Entschlüsselungs-Hacks und dergleichen umgehen. Eine Möglichkeit, dies zu tun, besteht darin, dem Flash 2 zufällige Werte von PHP zuzuweisen (die Sie nicht erfassen oder sehen können, selbst wenn Sie einen Echtzeit-Flash-Daten-Grabber ausführen). Verwenden Sie dazu eine mathematische Formel, um die Punktzahl mit den Zufallswerten zu addieren, und überprüfen Sie sie dann mit die gleiche Formel, um es umzukehren, um zu sehen, ob die Punktzahl mit ihr übereinstimmt, wenn es am Ende schließlich zum PHP geht. Diese Zufallswerte sind niemals sichtbar, ebenso wenig wie die Transaktion und wenn dies der Fall ist.
Dies scheint eine ziemlich gute Lösung zu sein, wenn Sie mich fragen, sieht jemand Probleme mit der Verwendung dieser Methode? Oder mögliche Wege, um das zu umgehen?
quelle
Ich denke, der einfachste Weg wäre, jedes Mal, wenn das Spiel eine hinzuzufügende Punktzahl registriert, eine Funktion wie RegisterScore (Punktzahl) aufzurufen und sie dann zu codieren, zu verpacken und als Zeichenfolge an ein PHP-Skript zu senden. Das PHP-Skript würde wissen, wie man es richtig dekodiert. Dies würde alle Aufrufe direkt an das PHP-Skript stoppen, da jeder Versuch, eine Punktzahl zu erzwingen, zu einem Dekomprimierungsfehler führen würde.
quelle
Es ist nur möglich, die gesamte Spiellogik auf der Serverseite zu belassen, die die Punktzahl auch intern ohne Wissen des Benutzers speichert. Aus wirtschaftlichen und wissenschaftlichen Gründen kann die Menschheit diese Theorie nicht auf alle Spieltypen anwenden, außer auf rundenbasierte. Zum Beispiel ist es rechenintensiv und schwierig, die Physik auf der Serverseite zu halten. Selbst wenn man Schach spielt, kann jeder das KI-Schachspiel dem Gegner anpassen. Daher sollten bessere Multiplayer-Spiele auch Kreativität auf Abruf enthalten.
quelle
Es ist nicht wirklich möglich zu erreichen, was Sie wollen. Auf die Interna der Flash-App kann immer teilweise zugegriffen werden , insbesondere wenn Sie wissen, wie man Dinge wie CheatEngine verwendet. Unabhängig davon , wie sicher Ihre Website- und Browser-Serverkommunikation ist, ist sie dennoch relativ einfach zu überwinden.
quelle
Es könnte eine gute Idee sein, über AMFPHP mit dem Backend zu kommunizieren . Es sollte zumindest die Faulen davon abhalten, die Ergebnisse über die Browserkonsole zu pushen.
quelle