# Levelbasiertes Spiel: Sicherheit ?



## Mujahiddin (4. Dez 2010)

Guten Morgen, alle miteinander!
Es geht hierbei um ein Spiel, welches auf Level basiert ist, man also bei bestimmtem Level bestimmte Features freischalten kann. Dieser Level ist lediglich ein Integer-Wert, der, wenn notwendig, abgefragt wird und somit die freigeschalteten Sachen angezeigt werden und regelmäßig gespeichert wird.
Nun ist die Frage, ob es mit der Sicherheit gut bestellt ist. Es handelt sich hierbei schließlich nur um einen Integer-Wert - ich könnte mir vorstellen, dass es ein Leichtes wäre, mittels Mini-Hacking-Tool diesen Wert auf den höchsten Level-Wert zu setzen, womit alles freigeschaltet wäre. Dies ist aber nicht Sinn und Zweck der Sache und soll mit allen möglichen Mitteln verhindert werden.
Ich habe mir dazu schon einige Gedanken gemacht, herausgekommen ist Folgendes:
Dieses Spiel soll auch Statistiken enthalten, also welches Level man wann erreicht hat, wie lange man dafür gebraucht hat - und dafür gibt es verschiedene Vector<Object>-Objekte. Möglich wäre es, dass aus diesen Vektoren die Länge (vector.size()) ausgelesen wird, welche auch den Level repräsentieren würde. Die Frage ist nur, ist das sicherer? Es macht ja einen Unterschied, ob man einen Integer-Wert von 1 auf 99 setzt oder ob man einem Vektor 99 Objekte hinzufügt, um seinen gewünschten Level zu erreichen. Irre ich mich da? Ist das immer noch nicht sicher genug? Was wäre besser?
Mit freundlichen Grüßen,
Mujahiddin


----------



## madboy (4. Dez 2010)

Mujahiddin hat gesagt.:


> soll mit allen möglichen Mitteln verhindert werden


Verwende C/C++/Assembler. Lässt sich nicht so einfach dekompilieren wie Java.
Speichere den Level-Stand eines Spielers auf einem Server. Übertragung natürlich verschlüsselt.
Verwende eine kommerzielle Lösung zum Verschlüsseln deines Codes (habe mal irgendwo gelesen dass es so was gibt ;-) )

Jetzt bist du auf der sichersten Seite die mir spontan einfällt. Alternative: such dir einen Spielehersteller, biete dem einen Haufen Geld und dir wird bestimmt geholfen. Spielehersteller haben da Erfahrung.

Ich würde dir allerdings raten, zu überlegen ob sich das auch lohnt. Wie schlimm ist es wirklich wenn jemand betrügt und sich höhere Levels freischalten lässt? Verlierst du dadurch Geld? Falls nicht, macht sich jemand seinen Spielspaß kaputt und das war's auch schon


----------



## Mujahiddin (4. Dez 2010)

Meinst du, ich soll das ganze Spiel in C/C++/Assembler umschreiben? Das wäre ein viel zu großer Aufwand.
Einen Server will ich bereits basteln, nur fehlt momentan noch der Webspace und das dazugehörige Know-how. Zudem will ich nicht, dass das Programm nur online läuft, es soll auch offline laufen können - und das Level soll auch offline nicht verändert werden können.
Die Frage ist nur, wie ich das verschlüssle, das sagt mir jetzt recht wenig.
Und eine Firma frage ich sicherlich nicht, ich mach das ja aus Hobby und will das Spiel dann eventuell unter einige Leute bringen - und ich will nicht, dass sich die Mühe, die ich mir mit den Levels und den Freischalt-Aktionen gegeben habe, für die Katz war, bloß weil einer herausfindet, dass man nur ne Zahl auf 99 setzen muss und das dann an die große Glocke hängt. Der Integer wird ja im Speicher festgehalten mittels "int level = xyz" - somit könnte man ihn doch jederzeit ändern, oder gehe ich mit meiner Annahme fehl?
Mit freundlichen Grüßen


----------



## madboy (4. Dez 2010)

Deine Annahme stimmt. Es ist relativ einfach möglich, einen int-Wert im laufenden Betrieb zu ändern.
Worauf ich eigentlich hinaus wollte:
Du hast geschrieben, du willst "mit allen möglichen Mitteln" verhindern dass jemand sich am Level-Stand zu schaffen macht. Eben diese "alle möglichen Mittel" habe ich aufgezählt so weit sie mir eingefallen sind.

Noch mal: was passiert denn schlimmstenfalls wenn jemand das Level verändern kann? Hast du nur ein ungutes Gefühl dabei oder richtige Argumente? Oder willst du einfach lernen, wie du eine gewisse Sicherheit erreichen kannst?

Falls du nur ein ungutes Gefühlt hast, frage dich: wie viele Leute werden dein Spiel spielen? Wie viele davon haben überhaupt Interesse am Cheaten? Wie viele davon können ein .jar dekompilieren? Wie viele mit einem Debugger umgehen?

Willst du lernen, wie du Sicherheit erreichen kannst: versuche mal, dein Spiel zu manipulieren. Dann baue Vorkehrungen dagegen ein und versuche es wieder usw.


----------



## Mujahiddin (4. Dez 2010)

Ich habe nicht viel Ahnung, wie ich das Spiel von Außen manipulieren sollte, sprich: nur Java-Kenntnisse, in C# und C++ bin ich noch kaum - gar nicht bewandert. Aber das hört sich sehr gut an, wüsstest du, wie ich mein Spiel manipulieren könnte? (Ich hatte sowieso vor, C# (als "Umstieg" von Java) und ggf. auch C++ zu lernen, aber ich habe keinen Anhaltspunkt, wo ich irgendwie in die Richtung gerate. Von 0 anfangen ist auch nicht das Wahre, ich kann Java ja sehr gut und sehr vieles ist ähnlich.)
Es ist in erster Linie ein ungutes Gefühl, wenn man es so bezeichnen will. Die höheren Level sind recht schwer zu erlangen und die Mühe für mein Programmieren soll nicht durch eine kleine Zahländerung zunichte gemacht werden. Dekompilieren / Hacken / Programmieren können unter den Leuten, die mein Ziel sein sollen, soweit ich weiß, niemand - aber ich bin mir nicht ganz sicher. Jedoch weiß ich nicht, ob sich im weiteren Verlauf auch noch andere dafür interessieren werden, von denen ich nicht weiß, ob sie diese Sachen können, und ihnen würde ich es auch gerne zukommen lassen.
Ferner will ich eine Top-List (auf einem Server) erstellen, in der sich jeder mit seinen Fortschritten / Statistiken eintragen kann, und wenn irgendwelche Pfuscher mit unlauteren Mitteln ein hohes Level erreichen, so wäre das keineswegs tolerierbar und unfair den anderen gegenüber.
Wie dem auch sei. Mich würde das sehr interessieren, wie ich auf mein Spiel zugreife und Sachen verändere und danach Maßnahmen dagegen ergreife. Wäre sicherlich informativ / belehrend und überaus interessant.


----------



## XHelp (4. Dez 2010)

Blizzard kann sich über solche Dinge gedanken machen, aber hier sind die Fehl am Platz. Alles kann irgendwie manipuliert werden. Leicht oder weniger leicht ist erstmal nebensächlich.
Du kannst ja ein paar simple Vorkehrungen treffen, mehr aber auch nicht. Wenn du auf Level 1 bist, dann musst du ja nicht zwingend "1" speichern, sondern irgendwas lustig verändertes/verschlüsseltes. Dann kannst du es noch mal anders verschlüsseln und woanders abspeichern. Dann kannst du die Werte ständig vergleichen. Dann musst du auch dafür sorgen, dass man an den Quelltext nicht rankommen kann... Und im Endeffekt wirst du 99% der Entwicklungszeit mit sinnlosen Sachen verbringen.
Aber das wird alles nichts bringen, wenn man es drauf anlegt.


----------



## Empire Phoenix (6. Dez 2010)

Einfache regel, never trust the client
-> alles was auf nicht von dir controllierten rechner läuft kann manipuliert werden und du kannst praktisch wenig dagegen tun. 
Was du tun kannst ist lediglich den aufwand erhöhen, bis er auf einem niveau ist, wo die meisten keine Lust mehr dazu haben.
sobald das game decompiliert ist wars dass dann aber auch damit.

Soweit ichw eiß gibts noch (kommerzielle) bytecode verschlüsslungen ect. wie sicher das ist sei dahingestellt, man kann ja die JVM(oder den classloader) manipulieren, spätestens dann bekommt man das ganze entschlüsselt zu sehen (wie sollte sie auch sonst laufen).


----------



## XHelp (6. Dez 2010)

Auch wenn man den Code verschlüsselt muss man den echten Code früher oder später ausführen. Und dann kommt ein böser Bube mit softice und alles ist hin. Wobei z.B. Skype ziemlich allergisch auf softice reagiert, aber auch das lässt sich ändern.


----------

