Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

13.08.2010, 22:54

Cheatsicherer Online-Highscore

Hallo,

Nach langer Abwesenheit habe ich mal wieder den Weg zurück zur Spieleprogrammierung und diesem Forum gefunden :)

Ich bin gerade dabei ein neues Hobbyprojekt zu planen und stehe vor dem Problem eines einfachen manipulationssicheren online Highscores.
Nehmen wir einfach mal an, es soll nur die Punktzahl und ein Name am Ende einer Runde zum Server geschickt werden und dort gespeichert werden. Dann ist es ja absolut kein Problem einfach während des Spiels auf den Speicher zuzugreifen und seine erreichte Punktezahl zu ändern, ohne, dass das Spiel dies mitbekommt (wenn keine Vorkehrungen getroffen wurden).

Mir sind jetzt drei Lösungen für das Problem eingefallen, mit denen ich aber nicht wirklich zufrieden bin:

1. Client-Server-Architektur: Nur Anfragen an den Server schicken, und alles dort überprüfen lassen. Für den Multiplayermodus möglicherweise akzeptabel, für Singeplayer aber eigentlich nicht, da dann 1. immer eine Internetanbindung vorhanden sein muss, 2. der server unnötig belastet wird.

2. Anlegen eines logs (Replay) der einzelnen Events im game, welches am Ende mitübertragen wird und welches dann nochvollzogen werden kann um die Punktzahl zu berechnen. Die Replaymöglichkeit wäre eigentlich ein nettes Nebenprodukt, trotzdem bedeutet auch das viel Arbeit und ich habe noch keine Vorstellung davon, wie groß ein solches Replay werden könnte. Die Übertragung zum Server könnte lange dauern.

3. Verschleierung des Punktwertes, bzw. alternative Speicherung. Beispielsweise die angezeigte Punktzahl immer aus einem div+mod wert berechnen lassen. Am ende des Spiels würde man dann die Punkte erneut aus den div+mod werten berechnen und diese dann übertragen. Eine reine Änderung des angezeigten wertes würde also nichts nützen. Allerdings denke ich, dass auch solche Methoden für einen etwas geübteren "Hacker" relativ schnell zu knacken sind.

Wie würdet ihr sowas schummelsicher gestalten? Weiß jemand wie kommerzielle spiele sich vor solchem speichermanipulationen schützen?

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

2

13.08.2010, 23:35

Also,
ich habe mich für die 3. Variante entschieden...

Mein Ansatz: Ich addiere zu dem Wert eine beliebige Zufallszahl (kann auch negativ sein) und speichere diese getrennt.
Der Cheater hat nun keine chance mehr, den wert zu finden und zu verändern, da nach jeder änderung der zufallswert aktualisiert wird ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

13.08.2010, 23:38

Ich denke 1 und 2 sind die sichersten. Auch wenn nicht Fälschungssicher. Man könnte ja theoretisch die Spielzüge auch manupulieren. Macht das ganze praktisch aber wahrscheinlich nahezu unmöglich.

3 funktioniert nicht wirklich. Ich habe das mal für ein Spiel (Efftris) gemacht und das Problem ist, dass man beim Knacken ganz einfach dort hin geht, wo der Wert wieder hergestellt und gesendet wird. Im Speicher nicht mehr zu finden (meine Punkte ändern sich da in der gespeicherten Form alle halbe Sekunde), aber das ist auch gar nicht nötig, wenn man mit einem Debuger das ganze anschaut.

Ich würde wahrscheinlich Variante 2 nehmen. Oder zumindest so ähnlich. Du musst ja nicht alles reproduzieren können, sondern könntest je nach dem auch mit nur Schlüsselpositionen arbeiten. Bei dem Fall von Tetris könnte man z.B die Anzahl der Reihen, die man hatte mitsenden. Da muss man natürlich auch noch schauen, dass das nicht zu einfach ist, denn sonst könnte man das auch einfach von Hand ausrechnen und den Punktewert dann einfach dementsprechend anpassen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

13.08.2010, 23:41

@CBenni::O
Wie ich bereits gesagt habe ist das auch gar nicht nötig (erstens) und zweitens kann man mit einem Decompiler relativ gut herausfinden was du für Operationen machst. Aber den Aufwand muss man sich gar nicht erst machen.
Wenn man das nun attackieren will, dann wartet man einfach solange bis der Wert gesendet werden möchte und in dem Moment greifst du als Cheater ein und veränderst den Wert bevor du überhaupt dazu kommst den zu senden. Das geht sehr einfach, wenn man ein wenig mit einem Debuger, wie OllyDbg arbeiten kann.

Die Nr. 3 reduziert lediglich die Leute weg, die nur einen Trainer benutzen können. (ok das sind wahrscheinlich schon recht viele)

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

5

13.08.2010, 23:43

drakon hat recht - beim absenden der Punkte kann das ein Problem werden...

Aber im laufenden Spiel ist diese methode (3) vermutlich am besten ;)

es gibt auch methoden, dass man die gewünschten punkte mit einer hash-funktion verschlüsselt und per orientiertes brute-force am anderen ende wieder recovert... Dieser Ansatzt ist leider ziemlich langsam ;)

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

13.08.2010, 23:48

Jain. Irgendwo greifst du ja schliesslich auch während des Spieles auf den Stand zu und genau da kann man auch noch rein gehen. Man schaut einfach wo der Wert angezeigt wird (irgendeine WriteToScreen oder so) und dann geht man da Stück für Stück zurück woher der Wert kommt. Dann schaut man sich den Assemblercode dazwischen an und findet raus, was der macht und schon kann man den Wert auch berechnen und an die Speicherstelle schreiben. Der Aufwand ist natürlich je nach verwendeter Verschleierungsfunktion nicht unerheblich, aber möglich.

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

7

14.08.2010, 00:27

Ich würde die Punktezahl verschlüsseln. Der Schlüssel soll dabei vom Server übermittelt werden und genau 1x gültig sein. Dann werden die Daten verschlüsselt übertragen, der Server weiß ja, was das Passwort ist, rechnet alles in Klartext um und löscht das Passwort.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

14.08.2010, 09:37

Code mit einem bisher ungeknackten Exe-Packer verschleiern, die Werte intern mit Offsets speichern, damit zumindest der Heap nicht durchsuchbar ist, dann vor dem Senden die Werte ordentlich verschlüsseln und auf dem Server wieder entschlüsseln.
Für die meisten Games wird das reichen, da ist der Aufwand für 'nen Cracker viel größer als der Nutzen. Schon allein ein richtig guter Packer verdirbt vielen (denen, die nur Trainer und Loader schreiben können, aber von Unpacking keine Ahnung haben) den Spaß.
Generell ist natürlich die Frage, wie populär das Game denn mal wird und wie groß die Wahrscheinlichkeit, dass es wirklich jemand cracken will. Ich denke gerade im Freeware/Hobby-Bereich ist es relativ unwahrscheinlich, dass sich jemand (mal von mir abgesehen, ich halte das fast für 'ne Art persönlichen e-Sport) diese Mühe macht und da reicht es vermutlich beim Senden eine simple Verschlüsselung zu benutzen, damit der einfachste Weg des online-Highscore-Cheatens (nämlich Fake-Pakete an den Server) erschwert wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

9

14.08.2010, 10:41

ist es relativ unwahrscheinlich, dass sich jemand (mal von mir abgesehen, ich halte das fast für 'ne Art persönlichen e-Sport) diese Mühe macht
erst sagst du, es ist relativ unwahrscheinlich, dass sich jemand die Mühe macht und eine Sekunde später nennst du dich selbst als möglichen Angreifer... ein bisschen widersprüchlich :D

und ich denke auch nicht, dass es sehr populär sein wird, trotzdem will ich aber, dass es etwas halbwegs vernünftiges wird und ich vielleicht sogar noch ein bisschen was dabei lerne :)

Danke schonmal soweit für eure Tipps, an die Übertragung selbst hatte ich z.B. noch garnicht gedacht. (also das ändern der pakete)

Könntest du mir einen bisher ungeknackten exe-packer nennen? und das Prinzip mit den Offsets kurz näher erläutern? Also wie man das implementiert und wieso es den Heap schützt.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

14.08.2010, 11:30

Offsets hat CBenni::O hier schon ganz gut beschrieben.

Ungeknackt kenne ich nur eins... bzw. haben das nur ein paar Koreaner geschafft und die sagen niemandem wie. Ich glaube das war eine der neueren Versionen von VMProtect. Ansonsten gute Packer, da reichlich hart zu entpacken - in Reihenfolge der Härte absteigend sortiert:
- VMProtect v2+
- Themida
- ASProtect v3+
- PECompact 2.78/2.79/2.80
VMProtect habe ich ja schon beschrieben, bei Themida kenne ich nur wenige [weltweit], die es schon entpacken konnten, ASProtect is auch ziemlich kniffelig.
Für letzteren gibt es angeblich immer mal wieder Unpacker-Tools, die wenigsten funktionieren aber tatsächlich in der praktischen Anwendung.
Einen 100%igen Schutz wird es nie geben, aber man kann zumindest allen Script-Kiddis oder "Hobby-Hackern" mit den obigen Dingen echt den Tag versauen :D Und die anderen, die es können, die überlegen sich, ob der Nutzen den Aufwand rechtfertigt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige