Spiel (halbwegs) hacksicher machen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Spiel (halbwegs) hacksicher machen

    Guten Tag,

    ich weiß, Fragen dieser Art wurden schon hunderte Male gestellt, aber ich bin mir sicher,
    dass ich bezüglich dieser noch nichts gefunden habe.

    Also, es handelt sich um ein Multiplayerspiel, ein Server, mehrere Clients.

    Möglichkeit Nummer 1 wäre, den Client bloß als Steuereinheit hinzustellen, und die Rechenarbeit komplett den Server machen lassen.
    Das würde ein Spiel fast komplett hacksicher machen.

    Ich aber will, dass die Bewegung der Spieler clientseitig passiert.
    Bei Spielen wie z.B. World of Warcraft ist dies auch so gelöst, und es ist trotzdem sehr schwer hackbar.

    Deshalb die Frage, wie kann man den Client so überwachen, dass die Bewegung nicht manipuliert werden kann?

    PS.: sorry wegen der Grammatik- und Rechtschreibfehler, bin am Handy.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Du kannst zB überprüfen ob sich die x,y Koordinaten um größere Werte erhöht haben als eigtl möglich ist, zB xneu > xalt+4
    und nur im Normalfall die Daten weiterleiten.
    Ebsenso mit Mausklicks... etc
    aber wer hackt denn schon solch ein Spiel, es sei denn es würd das nächste WoW oder Wurzelimperium oder was ähnliches werden.

    Aber zB bei Roomspeed 30 können maximal 30 Datenpakete innerhalb kürzster Zeit gesendet werden, erhält der Server mehr, ist was faul.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Michaelp800 schrieb:

    Benutze einen EXE-Kompressor. Der GameMaker ist da leider sehr sensibel. Probiere es einfach aus. Wenn du Glück hast, und die Anwendung nach Kompression noch funktioniert, ist es Manipulationssicher.

    Schwachsinn, nur weil man dann die Exe nicht mehr dekompilieren kann, kann man sie immernoch "hacken".
    Ein Spiel "hacken" tut man, indem man während der Laufzeit den RAM des Spiels manipuliert, da kannst du mit der Exe anstellen, was du willst.
    Beispiel: Man hat 500 Gold, sucht mit einem Programm nach allen Variablen, die auf 500 stehen im RAM, verbraucht 10 Gold im Spiel aus und schaut, welche der oben gefundenen Variablen um 10 kleiner geworden ist. Dann hat man die Goldvariable des Spiels gefunden und setzt sie auf 999999999 oder so irgendwie.
    Das geht mit JEDER Exe, egal was du da draufhaust, man muss eben den Code so schreiben, dass er erkennt, wenn eine Variable sich "falsch" verhält.
  • xGamer336 schrieb:

    Michaelp800 schrieb:

    Benutze einen EXE-Kompressor. Der GameMaker ist da leider sehr sensibel. Probiere es einfach aus. Wenn du Glück hast, und die Anwendung nach Kompression noch funktioniert, ist es Manipulationssicher.

    Schwachsinn, nur weil man dann die Exe nicht mehr dekompilieren kann, kann man sie immernoch "hacken".
    Ein Spiel "hacken" tut man, indem man während der Laufzeit den RAM des Spiels manipuliert, da kannst du mit der Exe anstellen, was du willst.
    Beispiel: Man hat 500 Gold, sucht mit einem Programm nach allen Variablen, die auf 500 stehen im RAM, verbraucht 10 Gold im Spiel aus und schaut, welche der oben gefundenen Variablen um 10 kleiner geworden ist. Dann hat man die Goldvariable des Spiels gefunden und setzt sie auf 999999999 oder so irgendwie.
    Das geht mit JEDER Exe, egal was du da draufhaust, man muss eben den Code so schreiben, dass er erkennt, wenn eine Variable sich "falsch" verhält.


    Die Datei ist durch Kompression sehr wohl "hacksicherer".

    Eine komplette Sicherheit gibt es nun mal nicht. MB-Lock Professional bietet sehr gute und preisgünstige Kopierschutzsysteme an (ich selbst habe die Bundle-Version erworben).

    Damit lassen sich Dokumente, ausführbare Dateien, CDs, DVDs und Videodateien schützen.
    Die Schutzsysteme sind ähnlich oder zum Teil exakt gleich wie SecuRom, SafeDisc und Starforce.
    Der darin enthaltene EXE-Schutz basiert unter anderem auf Kompression. Ein "hacken" ist nun deutlich schwieriger.

    Ein Spiel "hacken" tut man, indem man während der Laufzeit den RAM des Spiels manipuliert, da kannst du mit der Exe anstellen, was du willst.

    Das stimmt. Aber auch da gibt es Verfahren, sich zu schützen. Leider kommen wir da nun schon auf teure kommerzielle Ebene. Deshalb empfehle ich nach wie vor einen EXE-Kompressor, der hoffentlich mit GM kompatibel ist. So kann man zumindest keine Ressourcen einsehen.
  • Michaelp800 schrieb:

    Das stimmt. Aber auch da gibt es Verfahren, sich zu schützen. Leider kommen wir da nun schon auf teure kommerzielle Ebene. Deshalb empfehle ich nach wie vor einen EXE-Kompressor, der hoffentlich mit GM kompatibel ist. So kann man zumindest keine Ressourcen einsehen.


    Der Exe kompressor, verpackt die exe einfach. (wie vorher eben schon gesagt)
    Beim ausführen solch einer "verpackten" exe wird soweit ich weiss, die original exe einfach in den Ram entpackt.
    Am quellcode bzw. an der Variablenhandhabung ändert sich nichts. (Ist ja auch logisch. Sonst würde das Programm nicht mehr funktionieren.)
    Ein exe-kompressor mag evtl das decompilen von ältern GM-games (durch den GM-decompiler) unterbinden
    (obwohl es angeblich möglich sein soll die Game-assets wie GML Codes aus dem RAM auszulesen)
    aber an den hack-möglichkeiten ändert sich nichts.

    Selbst "hochkomplexe" Systeme wie SecuRom können ausgehebelt werden (soweit ich weiss wurde selbst Securom umgangen.)
    Wobei wir hier von Raubkopierschutz sprechen und nicht von direkten "hacking" der Spieledaten. Aber um das mal abzuschliessen:
    Schau dir mal die TripleA Spieleindustrie und deren Raubkopierprobleme an.
    Es kam schon vor, dass ein game bereits 1-2 Tage nach dem Release "gecrackt" wurde.
    Da als indie-entwickler Zeit zu investieren, ist eine reine verschwendung.

    "Hacken" kann man auf zig-tausend Arten. Entweder manipuliert man die Exe, oder man verändert den RAM oder man modifiziert die gesendeten Packete die an den Server geschickt werden.
    (den Ram wird man immer manipulieren können... Es gibt da keine Zugriffsbeschränkung...) Das einzige was man machen kann, ist auf Softwareebene irgendwelche Prüfungen zu implementieren.
    Oder man ist ganz witzig und greift gleich den Zentralen Spieleserver an.

    Man kann das "hacking" sicher hinauszögern, indem man irgendwelche komplexen Systeme implementiert, welche das Backtracking erschweren. (Ist ein zeitlicher als auch finanzieller Aufwand...)
    Früher oder später wird aber trotzdem alles gecknackt werden.
  • LEWA schrieb:

    Da als indie-entwickler Zeit zu investieren, ist eine reine verschwendung.

    Mehr gibt es eigentlich nichts zu sagen.

    Willst du bei Multiplayer-Spielen verhindern, dass sich andere einen unlauteren Vorteil verschaffen, kannst du höchstens auf die Community setzen und einen zentralen Server, der mindestens Accounts verwaltet, am besten aber gleich die Spiele und damit auch einen Großteil der Spiellogik hostet. Das machen Blizzard, Valve und co. nicht anders. Aber so einen Server muss man erstmal haben...
  • @LEWA
    Ich bin so ein Typ, der Hacks etc. nicht zulässt. Wenn dieses Vorhaben fehlschlägt, wird das Projekt gar nicht erst veröffentlicht.
    Ihr hier auf gm-d habt bereits zig Projekte von uns nicht gesehen... rein wegen dem Kopierschutz. Das ändert sich nun dank MB-Lock. :)

    In zukünftigen Projekten muss jeder User seine persönlichen Daten angeben, die dann anschliessend von uns auf Korrektheit und Einzigartigkeit (keine Duplikate) überprüft werden.
  • MewX schrieb:

    Michaelp800 schrieb:

    In zukünftigen Projekten muss jeder User seine persönlichen Daten angeben, die dann anschliessend von uns auf Korrektheit und Einzigartigkeit (keine Duplikate) überprüft werden.

    Auf Einzigartigkeit? Wie das denn bitte?


    Damit ist gemeint, dass ein Produktschlüssel nur auf die eine Person zugelassen ist.

    Weiter werden wir nicht gehen. Wir wollen kein Origin oder uPlay werden. 8o
  • Nun, ein eigens entwickeltes Sicherheitssystem mit eigenen Enkryptionen bringt viel mehr Vor- als Nachteile.
    Durch den Benutzernamen wird ein Code generiert. Dieser Code kann nur einmal angewendet werden. Bei falschem Code gelangt man sofort zum Kundendienst.

    Ich denke, dass man ein Produkt sicher machen kann, indem es online die Daten abfragt. Nachteil: Keine I-NET-Verbindung = keine Registrierung.


    Aber im Ernst: Für solche Kleinprojekte reicht ein normaler Kopierschutz wie MB-Lock vollkommen aus.
  • levarris07 schrieb:


    Möglichkeit Nummer 1 wäre, den Client bloß als Steuereinheit hinzustellen, und die Rechenarbeit komplett den Server machen lassen.
    Das würde ein Spiel fast komplett hacksicher machen.

    Ich aber will, dass die Bewegung der Spieler clientseitig passiert.
    Bei Spielen wie z.B. World of Warcraft ist dies auch so gelöst, und es ist trotzdem sehr schwer hackbar.

    Deshalb die Frage, wie kann man den Client so überwachen, dass die Bewegung nicht manipuliert werden kann?

    PS.: sorry wegen der Grammatik- und Rechtschreibfehler, bin am Handy.


    Du kannst die Befehle (nach vorne bewegen, links, rechts, View verschieben etc.) an den Server senden und lokal beim Client schon vor berechnen, dann merkt der Spieler bei einem guten Ping nicht das das ganze eigentlich über einen Server läuft (Source-Spiele müssten das afair auch so machen (CounterStrike)). Bei einem großen Ping kann es jedoch passieren das der Server den Client immer korrigieren muss was dazu führt das der Spieler ständig irgendwo hinteleportiert wird oder sonst was.

    Der Server kann wenn der Client eine neue Position sendet prüfen ob die neue Position überhaupt erreichbar ist mit dem derzeitigen Speed und keine Collision von oldPosition -> newPosition besteht (Umsetzung mit collision_line z.B.).

    Was ist aber mit Wallhacks, der Server kann nicht einfach herausfinden ob jemand durch Wände sehen kann oder nicht. Hierbei wäre es z.B. möglich nur das zu senden (Gegnerpositionen) was der Client auch wirklich sehen müsste (Frustum berechnen und mit Gegner-BBox prüfen).

    Michaelp800 schrieb:

    Benutze einen EXE-Kompressor. Der GameMaker ist da leider sehr sensibel. Probiere es einfach aus. Wenn du Glück hast, und die Anwendung nach Kompression noch funktioniert, ist es Manipulationssicher.

    Ein EXE-Kompressor bringt einer Anwendung nur das man die .EXE nicht einfach so deassemblieren kann oder beim GM direkt zu decompilen. Hilft aber nicht die EXE nicht doch zu verändern (es gibt Hacks dafür bezahlen Leute viel Geld), da spielen z.B. auch noch viel mehr Komponenten hinzu (von DLLs, zu DirectX/OpenGL, Treiber, Windows, Hardware) und irgendeins davon lässt sich ändern (für ein Wallhack reicht es meistens schon eine manipulierte Direct3D DLL zu benutzen).

    Michaelp800 schrieb:

    Ich denke, dass man ein Produkt sicher machen kann, indem es online die Daten abfragt. Nachteil: Keine I-NET-Verbindung = keine Registrierung.

    Mit WireShark lässt sich das mitschneiden was der Server sendet und mit ein bisschen Domain umleiten (Hosts-Datei bearbeiten reicht da schon) kann man einen eigenen Server aufsetzen der immer "Ja, Key ist korrekt" antwortet. (Ausgehenden von HTTP als Protokoll)

    Um zum Hauptproblem zurück zukehren: es hängt je nach Multiplayerspiel-Typ ab. Ist es ein FPS-, ein Strategiespiel oder irgendwas anderes? Wird es im Coop gespielt (z.B. mit Freunden) oder gegen andere Leute, vielleicht sogar gegen Geld?. Je nach Ernsthaftigkeit sollte man vielleicht sogar auf Third-Party-Produkte setzen (z.B. für das DRM Steam).
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Michaelp800 schrieb:

    Nun, ein eigens entwickeltes Sicherheitssystem mit eigenen Enkryptionen bringt viel mehr Vor- als Nachteile.

    Die Frage ist: Für wen bringt es die Vorteile? ;)

    Ich bin DRM extremst feindlich gesinnt. Auch wenn Unternehmen sich dadurch "absichern" - und dem Kunden
    eigentlich nicht schaden wollen, so tun sie das im Endeffekt. Ich kann mich z.B: gut daran errinnern wie ich Stalker: Clear Sky gekauft habe
    (als DVD) und der verfluchte Kopierschutz den sie verwendet haben die OriginalCD nicht als "original" angesehen hat. -.-
    (Ich musste extra für dieses Spiel einen KOPIERSCHUTZ-TREIBER installieren, damit ich die installation überhaupt starten konnte...)

    Dasselbe mit dieser "dauerhaften Online-verbindung". > Was genau ist der mehrwert für den Spieler? Garkeiner. Es führt zu frust.
    Und der Witz dabei ist: Menschen die das Spiel "gratis" haben möchte, ziehen sich einfach die ISO vom Netz mit einem NO-CD Crack (der von einem Genie programmiert wurde) der noch
    dazu den Online Kopierschutz aushebelt. (Simcity anyone?)
    Das ist eine klare Fail-Fail Situation. Keine der Seiten gewinnt. Entwickler stecken geld in einem Kopierschutz der binnen Tagen ausgehebelt wird und "loyale" Spieler müssen
    sich mit einer Software zufriedengeben die Aufgrund einer "Sicherheitsmaßnahme" hier und da Einschränkungen mit sich bringt. (wie z.B: Das verbieten einer Installation.... > Stalker....)
    Und das ist was mich an der Sache so aufregt.

    Steam bietet da eigentlich eine Passable lösung. (wenn man darüber nachdenkt)
    Man verwendet Steam als Online Platform um Spiele zu kaufen. Diese sind an deinen Account gebunden.
    Steam hat einen kopierschutz bereits miteingebaut. Die Spieler merken das blos nicht, da Steam das im Background (ohne zicken zu machen)
    ganz sauber implementiert.
    Da Frage ich mich immernoch was einige Unternehmen mit diesem Kopierschutzwahn haben.
    Als Beispiel wäre da Trials-Evolution was ich mir über Steam gekauft habe.

    1. Ich muss mich in Steam einloggen um auf meine Spielebibliothek zugriff haben zu können. (Erneut: 1 mal einloggen beim PC start um auf alle Steam games zuzugreifen ist kein Problem)
    2. Spiel Startet den Uplay client in den ich mich auch einloggen muss > WHAT?
    3. Spiel vom Uplay client aus Starten > GEHTS NOCH?

    Wir haben also einen Steamclient mit kopierschutz, der den Uplay client (mit kopierschutz) startet um das Spiel zu starten. > Da hört der Spaß auch auf.

    Ich persöhnlich bin daher eher für DRM freie Games.
    Man sollte sich mal die Entwickler aus Polen (CD Project) als Vorbild nehmen. (Ja, da grinsen sicher einige...)
    Sie haben den Kopierschutz von "The Witcher 2" mit einem Patch entfernt. Seitdem wird das Spiel (da es gepatch ist)
    auch auf CD ohne Kopierschutz ausgeliefert. Auch The Witcher 3 erscheint ohne Kopierschutz.

    Hält das Raubkopierer auf? Nein. Hätte ein Kopierschutz Raubkopierer aufgehalten? Nein.
    Gibt diese Aktion den Spielern das Gefühl das ihnen Vertraut wird und dass den Entwicklern doch was an der Community liegt? Ja.
    Ich bin eher bereit für ein Spiel zu zahlen wenn ich weiss dass ich mich nicht mit einem Kopierschutz umherschlagen muss.
    (Und dass die Entwickler MIR als Käufer vertrauen schenken und mich das Spiel genießen lassen.)

    Als Beispiel:
    Ich habe mir "Amnesia" beim Mediamarkt in Polen zugelegt. (Als DVD). > Hatte keinen Kopierschutz. Und verdammt war das ein gutes Gefühl eine DVD in den Händen zu halten
    von der ich weiss dass ich sie einfach einlegen und starten kann. Dementsprechend verlief die Installation als auch das Spielen tadellos. (Setup starten, 3 mal "weiter" klicken, warten, zocken. > Einfach, ne?)

    Online registrierung und Online zwang kann ich verstehen wenn es sich um ein OnlineSpiel handelt bei der auch die Internetverbindung verwendet wird. (Da macht es ja auch sinn. z.B: Trackmania im Online-Modus)
    Aber für einen Kopierschutz? Nicht mit mir.

    /Edit:
    Stimmt, dass das hier eher Offtopic ist. Mir ist bewusst, das der Kopierschutz nicht das Thema ist welches man besprechen wollte. (Ist eigentlich komplette Themenverfehlung)
    Da wir aber in das ganze "Kopierschutzzeugs" reingeraten sind, wollte ich noch meinen finalen Senf dazugeben.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von LEWA ()

  • xGamer336 schrieb:

    man muss eben den Code so schreiben, dass er erkennt, wenn eine Variable sich "falsch" verhält.


    Oder dafür sorgen, dass solche Suchen im RAM nichts bringen. Zwei Techniken, die mir da spontan einfallen, sind 1.: Daten nicht im Klartext speichern sondern irgendwie salzen oder maskieren, und 2.: Bei jedem Schreibzugriff eine andere Adresse im Speicher wählen.

    Zu 1.:
    Prinzipiell läuft es darauf hinaus, dass man nicht den zu speichernden Wert selbst in den langlebigen (*) Variablen speichert, sondern diesen Wert durch eine Funktion jagt, und beim lesen die Umkehrfunktion aufruft. Man kann z.B. die zu speichernde Zahl mit einem Schlüssel ver-x-odern, was den Vorteil hätte, dass Funktion und Umkehrfunktion identisch sind. Oder man rechnet in Gray-Codes, diese haben die Eigenschaft, dass zwei aufeinanderfolgende Zahlen sich immer um genau ein Bit unterscheiden. Wenn man also eine Variable hat, die einfach nur Hochzählt (1, 2, 3, 4, 5, ...), sieht ein Programm, dass diese Gray-Codes dann als "normale" Binärzahlen interpretiert, die Zahlenfolge (1, 3, 2, 6, 5, ...). Insbesondere die Technik, mit der man nach Werten sucht, die in der GUI nicht exakt angegeben werden (wenn z.B. die die genauen Werte angezeigt werden, sondern man immer nur Balken sieht), nämlich nach wachsenden oder fallenden Werten zu filtern, läuft bei so einer Codierung ins leere, da diese Zahlenfolge immer mal wieder steigt und mal fällt.

    Und was ich vorhin mit salzen meinte, ist die Adaption einer Technik, mit der man eigentlich Passwörter schützen will. Eine mögliche Variante für Ganzzahlen wäre z.B.: Wenn du einen Wert x speichern willst, wähle dir eine einstellige Zufallszahl z > 0, und speicher dann w=x*10*z+z. Um von w wieder auf x zu kommen rechnest du z = w mod 10 und x = (w div 10) / z.

    Zu 2.:
    Wenn du bei jedem Schreibzugriff den Ort im Speicher wechselst, kann man beim Beobachten des Rams nicht mehr herausfinden, wo sich was ändert. Um auf das Beispiel von xGamer336 zurückzukommen: Wenn man diese 10 Gold verbraucht hat, steht im RAM immer noch an der selben stelle 500, an der es vorher auch stand, und an anderer Stelle, an der vorher irgendwas stand, steht dann 490; die 500 zu ändern wird dir dann nichts mehr bringen, da diese Stelle im Speicher erst wieder gelesen wird, wenn das nächste mal drauf geschrieben wurde. Eine mögliche Implementation dieser Technik wäre, am Anfang ein Array anzulegen, in dem man die Werte halten will, und die eigentlichen Variable speichert dann nur noch den Index, wo im Array nun der Wert liegt. und den Inkrementiert man halt bei jedem Schreibzugriff; um Speicher zu sparen sollte dieser fortlaufende Zähler gelegentlich wieder auf 0 gesetzt werden. Für mehrere Variablen kann man nun faul sein, und Pro Variable ein Array anlegen, oder man überlegt sich eine vernünftige Verwaltung, wie man 23 Varialben in einem Array mit 42 Plätzen unterbringt, ohne, dass sie sich gegenseitig stören; dann räumt ein Schreibender Zugriff auf Variable Foo z.B. alte Werte von Variable Bar wieder auf.

    Zusammenfassung: Man muss nicht nach Variablen suchen, die sich falsch verhalten (denn die Kontrollmechanismen lassen sich im Zweifelsfall auch manipulieren), sondern kann seine wichtigen Variablen auch einfach so verstecken, dass man sie nicht so leicht findet.

    (*) Mit langlebig meine ich die Variablen, die ihren Wert über den Spielverlauf behalten sollen, im vergleich zu kurzlebigen Variablen, die nur Zwischenergebnisse von Berechnungen speichern sollen und nach wenigen Zyklen wieder verworfen werden können.

    Ach ja, ich hab hier übrigens das Gefühl, dass einige nicht ganz verstanden haben, worum es geht (möglicherweise ich sogar auch): levarris07 wollte, soweit ich sehe, Möglichkeiten, Manipularionen zur Laufzeit zu verhindern. Das hat mit Kopierschutz herzlich wenig zu tun.
  • MewX schrieb:

    LEWA schrieb:

    Da als indie-entwickler Zeit zu investieren, ist eine reine verschwendung.

    Mehr gibt es eigentlich nichts zu sagen.

    Willst du bei Multiplayer-Spielen verhindern, dass sich andere einen unlauteren Vorteil verschaffen, kannst du höchstens auf die Community setzen und einen zentralen Server, der mindestens Accounts verwaltet, am besten aber gleich die Spiele und damit auch einen Großteil der Spiellogik hostet. Das machen Blizzard, Valve und co. nicht anders. Aber so einen Server muss man erstmal haben...


    Naja, die gesamte Spiellogik zu hosten ist mit GML recht schwer.
    Ich werde sachen wie Geld usw. natürlich schon Serverside verwalten, aber ich habe vor z.B. die Bewegung Clientside zu lassen.
    Das erspart sehr viel rechenleistung.

    Die Idee von CAS, Variablen zu verändern, sodass sie auf der Oberfläche ganz anders aussehen, find ich relativ genial.

    Auch das Thema, ein Spiel zu cracken, wurde angesprochen.
    Davor hab ich wenig Angst, da das Spiel gratis sein wird :)
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von levarris07 ()

  • Benutzer online 1

    1 Besucher