Ich habe Unity verwendet, um ein 2D-Spiel zu erstellen, das vollständig offline ist (was das Problem ist). Für das Gameplay müssen Sie bestimmte Zeichenfolgen auf bestimmten Ebenen eingeben und Unity wird in DLLs kompiliert, die problemlos rückentwickelt werden können gibt es eine Möglichkeit, diese Zeichenfolgen zu schützen (das Spiel ist offline, sodass ich sie nicht von einer anderen Quelle abrufen kann)?
Das Spiel stützt sich stark auf diese Saiten, und ja, ich bin mir der Verschleierung bewusst, aber ich möchte etwas Robusteres. Und ich weiß, dass der einfache Ausweg darin besteht, alles von einer Datenquelle aus online zu erledigen, aber ich habe mich gefragt, ob das möglich ist.
unity
c#
anti-cheat
TheBinaryGuy
quelle
quelle
strings
Programm darauf richten .Antworten:
Speichern Sie diese Zeichenfolgen nicht, sondern deren (kryptografischen) Hash.
Eine (kryptografische) Hash-Funktion ist wie die Verschlüsselung eine Möglichkeit, eine Zeichenfolge in "Kauderwelsch" (als Hash bezeichnet) umzuwandeln. Im Gegensatz zur Verschlüsselung können Sie die ursprüngliche Zeichenfolge jedoch nicht aus dieser Hash-Datei abrufen (es sei denn, Sie können sie oder den Hash erzwingen) Funktion ist kaputt). Die meisten (wenn nicht alle) Hash-Funktionen verwenden eine Zeichenfolge beliebiger Länge und geben eine Zeichenfolge konstanter Länge zurück (abhängig von der Funktion).
Wie können Sie überprüfen, ob eine vom Benutzer eingegebene Zeichenfolge korrekt ist? Da Sie die gültige Zeichenfolge nicht aus dem Hash abrufen können, können Sie nur die Vermutung des Benutzers mit einem Hash abgleichen und mit dem richtigen Hash vergleichen.
Warnung (von Eric Lippert): VERWENDEN Sie die integrierte Funktion NICHT
GetHashCode
als solche - das Ergebnis kann zwischen verschiedenen .NET-Versionen und -Plattformen variieren, sodass Ihr Code nur auf bestimmten .NET Framework-Versionen und -Plattformen funktioniert.quelle
Was Sie versuchen zu tun, ist sinnlos und sinnlos.
Es ist zwecklos, weil es keine Möglichkeit gibt, Informationen, die sich auf dem Computer des Benutzers befinden, ordnungsgemäß zu verbergen. Jeder, der genug engagiert ist, wird es finden. Sie können es schwieriger machen, aber Sie können es nie verhindern. Wenn Sie es verschlüsseln, müssen Sie den Verschlüsselungsschlüssel und den Algorithmus irgendwo speichern. Unabhängig davon, wie viele Verschlüsselungsebenen Sie hinzufügen, muss die äußerste Ebene immer unverschlüsselt sein, damit Ihr Spiel ausgeführt werden kann.
Es ist auch sinnlos, weil wir im Internetzeitalter leben. Wenn Ihr Spiel nur aus der Ferne populär wird, werden diese Passcodes im gesamten Web veröffentlicht.
Sie können nur darauf vertrauen, dass der Spieler sein Spielerlebnis nicht dadurch ruiniert, dass er nach Informationen sucht, die ihm das Spiel noch nicht mitteilen soll. Die überwiegende Mehrheit der Spieler wird Ihr Spiel sowieso nicht rückentwickeln. Und wenn die wenigen, die über die erforderlichen Fähigkeiten verfügen, dies tun, ist es ihre eigene Schuld.
quelle
Wenn so etwas wirklich gewünscht ist, können Sie anstelle von Hashing die Zeichenfolgen zur Laufzeit aus einem numerischen Eingabewert erstellen.
Der Vorteil ist, dass es, wie von @Philipp hervorgehoben, etwas sinnlos ist, Codes in der ausführbaren Datei zu verstecken, wenn Sie damit rechnen können, dass sie ohnehin im Internet veröffentlicht werden. Ob mit oder ohne Hash, dasselbe Wort, das im Internet gefunden und in das Spiel eingegeben wurde, gibt den gleichen Hash und funktioniert in beide Richtungen.
Außer ... außer wenn der Code eines anderen nicht für Sie funktioniert . Was Sie trivialerweise tun können - nicht 100% manipulationssicher, aber für den Durchschnittsbenutzer einigermaßen umständlich. Alles, was so einfach ist wie der "Online Elven-Namensgenerator" (kann beliebig einfach sein, braucht wirklich nicht viel von einer Markov-Text-Engine, 4-5 Silben aus einer zufälligen Liste zu ziehen, ist gut genug).
Generieren Sie einfach eine etwas benutzerspezifische oder maschinenspezifische Nummer, sie muss nicht einmal absolut eindeutig oder sehr manipulationssicher sein. Etwas, das für die meisten Menschen wahrscheinlich anders ist und sich wahrscheinlich nicht regelmäßig ändert, z. B. der Netzwerkname des Computers, die MAC-Adresse oder die GUID des Systemlaufwerks, unabhängig davon (die GPU-Seriennummer ist möglicherweise sehr schlecht)Idee, da Benutzer wahrscheinlich GPUs aktualisieren). Fügen Sie dazu den numerischen Code hinzu, auf den sich der Entsperrcode bezieht, und geben Sie diesen in Ihren Textgenerator ein. Seien Sie jedoch bereit, Supportanfragen zu beantworten, wenn Spieler zwei Computer verwenden oder ihre Netzwerkkarte wechseln (was ungewöhnlich, aber nicht unmöglich ist). Es könnte ein guter Plan sein, die zufällige ID nur einmal zu generieren und mit den Einstellungen des Spiels zu speichern. Auf diese Weise werden zumindest vorhandene Installationen auf demselben Computer nicht beschädigt, wenn sich etwas ändert.
Oder Sie verwenden einfach die Seriennummer des Spiels, die eindeutig ist und funktioniert, wenn der Benutzer die Hardware wechselt (ironischerweise kann dies jedoch zu Raubkopien führen, da freigegebene Freischaltcodes für Raubkopien funktionieren, aber nicht für legitime Kunden!).
Beachten Sie, dass es nicht unbedingt gut ist, zu verhindern, dass Benutzer betrügen. In einem Offline-Spiel (dh einem Spiel ohne Konkurrenz) ist es normalerweise kein Problem, wenn der Benutzer betrügt und die Codes von irgendwoher erhält, anstatt sie zu spielen. Er betrügt sich nur. Wen interessiert das.
Andererseits ist es eine großartige Gelegenheit, sich zu sehr in den Weg zu stellen, wenn sie wirklich betrügen wollen, um zahlende Kunden völlig zu verärgern .
Also ... bevor Sie etwas auf diese Weise tun, überlegen Sie sich genau, ob Sie das wirklich wollen und was Sie wollen. Möglicherweise ist es gerade gut genug und in der Tat vorzuziehen, von Menschen lesbare Zeichenfolgen zu haben (oder mit xor trivial "unlesbar" zu machen).
quelle
hash(serial + 1)
, um eine Zahl zu erhalten, die dem ersten Code entspricht. Dann speisen Sie das in Ihren Wortgenerator ein, der beispielsweise eine Silbe aus einer Liste von 16 für jeweils 4 Eingabebits zieht. Los geht's, individuelle "Wörter" für jeden User.hash(serial+1)
nach dem Herunterladen berechnethash(serial+1)
? Sobald das Programm heruntergeladen ist, hat der Benutzer Zugriff auf alles, was das Programm tut.hash(serial + 1)
. Na und? Das ist kein Problem. Schauen Sie, wenn jemand ein bis zwei Stunden investiert (wahrscheinlich 6-8 Stunden für einen typischen "Benutzer" ohne Softwareentwickler-Hintergrund), nur um sich selbst zu betrügen, naja ... lassen Sie ihn. Die Sache ist, das funktioniert für eine Person, aber nicht für alle, und es ist nicht wettbewerbsfähig ... also kein Problem.Wenn Sie die Zeichenfolgen nicht zeigen müssen, ist die Hashing-Idee wahrscheinlich der richtige Weg. Wenn Sie sie andererseits dem Benutzer anzeigen müssen, können Sie auf andere Weise verhindern, dass sie direkt in Ihrer DLL angezeigt werden.
Ein Weg, um damit umzugehen, neben dem Verschlüsseln oder anderweitigen Verschleiern der Zeichenfolgen, besteht darin, sie aufzubrechen. Vielleicht haben Sie nur ein alphabetisch sortiertes Wörterbuch aller möglichen Wörter aus allen Zeichenfolgen im Spiel. Dann haben Sie irgendwo ein Array, mit dem Sie die Wörter zu der Zeichenfolge zusammenfügen können, die Sie benötigen, indem Sie das Array mit den Wörtern indizieren. Auf diese Weise hast du nirgendwo im Spiel die kompletten Saiten. Zum Entschlüsseln der Zeichenfolgen ist kein Hauptschlüssel erforderlich. Und die Daten, die ihre Reihenfolge angeben, könnten sich über Ihre gesamte Quelle erstrecken, wenn beispielsweise jede Funktion, die eine Zeichenfolge verwendete, nur ein Array von Indizes vor Ort für die Funktion hatte. Ich bin mir nicht sicher, wie praktisch das in Ihrem speziellen Fall ist, aber es ist eine Möglichkeit, es zu tun.
Möglicherweise besteht die Zeichenfolge sogar aus wenigen Wörtern, die jedoch in unterschiedlicher Reihenfolge angezeigt werden. Beispielsweise benötigen Sie möglicherweise die folgenden 2 Zeichenfolgen:
Ihre Liste der Phrasen würde sowohl "ein Bär" als auch "mein Haus" enthalten, aber Sie hätten eine große Liste anderer Phrasen, die zwischen ihnen eingefügt werden könnten das Puzzle im Spiel (oder was auch immer). Zum Beispiel könnten die Aktionsphrasen "durchgehen", "niederbrennen", "überschieben", "mich beschützen vor", "mich trennen von", "magisch produziert" usw.
Sie können dies in Ihr Spiel einfließen lassen, indem Sie dafür sorgen, dass die Indizes auf etwas basieren, das der Spieler gesammelt oder getan hat. Es würde also nirgendwo im Spiel eine Master-Liste von Indizes geben. Sie werden vom Spieler generiert, der das Spiel spielt.
quelle
strings
gegen das Ausführbare benutzt.