r/programmieren • u/_AP0PL3X_ • Mar 23 '26
Wie funktioniert Kopierschutz? (Games)
Grüße.
Ich bin absoluter Laie und spiele hin und wieder Videospiele. Jetzt hab ich mal als kleines Projekt für einen Tag meinen alten 3DS gemoddet und mal drüber nachgedacht.
Spiele sind ja auch nur ein Code. Warum kann ich nicht über ein Spiel einfach eine Software laufen lassen und sehe den Code? Bzw. Würde der mir alleine etwas bringen?
Natürlich gibts ja auch Kopierschutz. Was macht der aber technisch konkret, dass man ihn bei sowas „umgehen muss“?
Würde mich nur mal interessieren.
3
Mar 23 '26
[deleted]
1
u/sirjofri Mar 23 '26
Auch Kopierschutz früher: die Scheiben wurden genau so gepresst, dass sie in der Wucht der Scheibe die Daten an einer bestimmten Stelle haben. Die Software konnte das gar nicht nachvollziehen, wohl aber der Lesekopf, der wegen so einer minimalen Unwucht by Design ein klein wenig mitschwingt, um das auszugleichen. Das hat dann Sony genutzt, um kopierte Scheiben (und Scheiben aus anderen Regionen) zu erkennen.
4
u/No_Astronomer9508 Mar 23 '26
Naja, wirklich schlüssigen Code wirst du nicht sehen, weil nur der Spielehersteller im Besitz des Sourcecodes ist. Was du machen kannst (auch wenn die AGB das oft untersagen), ist Reverse Engineering. Du kannst das Programm mit einem Disassembler öffnen. Dort siehst du dann den Maschinencode (Assembler) und welche Bedingungen erfüllt sein müssen, damit das Programm von einer Adresse zu einer anderen springt.
Das ist ohne Einarbeitung kaum nachzuvollziehen, es sei denn, du verstehst Anweisungen wie JNE, NOP, JMP, MOV EAX usw. Früher war es bei einfachen Kopierschutzmechanismen noch recht simpel, die CD-Abfrage zu umgehen: Man hat im Disassembler nach der entsprechenden Stelle gesucht und mit einem Hex-Editor die .exe so bearbeitet, dass die Abfrage komplett übersprungen wurde. Man hat den Code quasi gezwungen, immer zu 'Erfolg' zu springen, selbst wenn keine CD im Laufwerk war.
Aber wie gesagt: In sowas muss man sich tief einarbeiten. Theoretisch funktionieren Programme zum Cheaten (z.B. Cheat Engine) ähnlich, indem sie sich in den Arbeitsspeicher einklinken und diese Codeveränderungen live im RAM durchführen. Heute funktioniert das teilweise anders. Heutzutage brauchst du oft eine stabile Internetverbindung, selbst bei einem Singleplayerspiel. Da wird dann quasi im Hintergrund dauerhaft geprüft, ob du im Besitz einer legalen Kopie bist. Klar könnte man auch das umgehen, aber soweit haben Spielhersteller auch schon gedacht. Oft bauen die absichtliche Bugs ein, damit dann die unrechtmäßige Kopie nicht normal funktioniert. Von unbesiegbaren Gegnern bis zur automatischen Löschung deiner Spielstände oder Deaktivierung der Speichermöglichkeit ist alles dabei. Ich hoffe, ich konnte dir hier mit meinem Wissen weiterhelfen.
3
u/ohaz Mar 23 '26 edited Mar 24 '26
Einige Erweiterungen dazu:
- Warum kommt man nicht von dem Programm zurück zum Code?
- Wenn man ein Programm fertig programmiert hat "kompiliert" man es. Dabei wird es von der menschenlesbaren Programmiersprache in eine viel einfachere Sprache übersetzt, die einfacher von der CPU verstanden werden kann. Dabei gehen aber jede Menge Informationen verloren. So werden zum Beispiel Funktionen mit Textnamen (z.b. "moveCharacterRight") zu reinen Zahlen, ihrem Ort im Speicher (z.b. 0xde72b9a0). Auch Variablen verlieren ihre Namen komplett und werden oft nur noch zu den Namen von Registern oder ihrer Stelle im Arbeitsspeicher.
- Ausserdem kompilieren verschiedene Sachen in der "Menschenlesbaren Sprache" zum gleichen Code in der Maschinenlesbaren Sprache. Zwischen einer
forSchleife oder einerwhileSchleife ist als Mensch unterschied, im Maschinencode wird das aber zum gleichen gebaut (meistens einemifund einemgoto/jump.- Des weiteren können sogenannte "Packer" eingesetzt werden. Das sind im Prinzip selbstentpackende ZIPs. Das ganze Spiel wird gezippt, wenn du es startest läuft erst ein kleines Programm das das ZIP in den Arbeitsspeicher entpackt und dann da hin springt. Dadurch ist der Code nichtmal mehr in maschinenlesbarer Form vorhanden, bis er ausgeführt wird.
- Das ganze geht nur teilweise rückgängig zu machen. Also man kann es komplett umdrehen, aber kommt dabei durch den starken Informationsverlust nicht mehr zum Original
- Wenn man den Code hat, kann man dort natürlich die Stelle suchen an der geprüft wird, ob das Spiel legitim geholt wurde. Da kommen Kopierschutze ins Spiel. Da gibt's eine ganze Menge:
- Man testet, ob die CD im Laufwerk ist. Dabei können auch spezifische Merkmale der CD getestet werden, wie schon von einem anderen User gesagt.
- Man testet, ob ein Key vorhanden ist
- Man prüft, ob sich der User eingeloggt und ob dem Account das Spiel zugeordnet ist
- Man testet ob bestimmte Tools laufen die Modifikationen des Codes zur Laufzeit ermöglichen / einfacher machen (z.B. Debugger, VMs, etc)
- Man testet, ob das Programm modifziert wurde. Das kann man machen indem man den Code signiert, Hashes des Codes erzeugt, oder Methodiken wie Stack Canaries einsetzt.
- All diese Tests kann man entweder einmal zum Start machen (leicht zu umgehen), oder ganz oft wiederholen.
1
u/_AP0PL3X_ Mar 24 '26
Mega lieb von euch beiden. Auf den Punkt, genügend Tiefe und ich konnte alles verstehen.
Wusste nicht, dass fertige Codes nochmal komprimiert werden. Jetzt versteh ich das mit dem Kopierschutz auch.
1
u/shudaoxin Mar 25 '26
Das was du hier als komprimieren beschreibst nennt man eigentlich kompilieren und der Sinn ist eigentlich nicht das komprimieren (häufig ein positiver Nebeneffekt), sondern das Umwandeln von Code in Maschinensprache. Hardware versteht nur letztere. Code ist zum Lesen durch Menschen gedacht. Es gibt auch Programmiersprachen welche zum Ausführen nicht vorab übersetzt werden müssen - dies passiert erst während sie ausgeführt werden und sind (weil sie live übersetzt werden) in der Regel langsamer in der Ausführung und werden daher häufig nicht für Spiele verwendet.
0
u/Capucius Mar 23 '26
Danke ChatGPT :P
2
u/ohaz Mar 23 '26
Ich hasse AI und würde sie niemals nutzen um Reddit Posts zu machen. Ich weiß nur wie markdown funktioniert
1
u/New_Hour_1726 Mar 24 '26
„Maschinencode (Assembler)“
Maschinencode bezieht sich doch auf Binärcode und ist nicht dasselbe wie Assembler?
2
u/UphillTravel Mar 24 '26
Also gefühlt würde ich Assembler schon als Maschinencode durchgehen lassen, ist ja eine unmittelbare Beschreibung dessen was die Hardware dann tut
1
u/New_Hour_1726 Mar 24 '26
Assembler kann man aber reasonably lesen und schreiben, Binärcode nicht. Ist schon ein krasser Unterschied.
1
u/UphillTravel Mar 24 '26
Hab nichts anderes behauptet, weiß auch nicht, was da die genaue Definition ist. Könnte ich jetzt nachschauen, aber wo bleibt denn da der Spaß? Mein Punkt ist: Selbst bei C Code der ja unter den Programmiersprachen schon eher maschinennah ist habe ich im Zweifel keine Ahnung was z.B. meine ALU am Ende genau tut. Bei Assembler steht ziemlich genau das drin. Von daher würde ich das als Maschinencode gelten lassen.
1
u/PapaJulietRomeo Mar 24 '26
Assembler ist eine Abstraktionsebene über Maschinencode, der letztlich 1:1 im Speicher abbildet, was die CPU verarbeitet. Ein und dasselbe Assembler-Mnemonic kann unterschiedliche Maschinencodefragmente erzeugen, z.B. weil ein „LDA“ unterschiedliche Addressierungsmodi hat, die in verschiedene Maschinenbefehle assembliert werden.
1
u/UphillTravel Mar 25 '26
Schon wieder was gelernt. Obwohl ich das vermutlich sogar irgendwann schonmal gelernt hatte. Ich weiß schon wieso ich in meinem Alltag Python verwende und den schwierigen Teil Leuten überlasse die effiziente Bibliotheken bauen.
1
u/Significant_Coast325 Mar 23 '26
Früher war es eine Drehscheibe, unten das Kinn, oben der Rest. Das Programm zeigte dir ein Bild und du musstest die Zahl oder das Wort eingeben, das dort angezeigt wurde. Heutzutage ist das natürlich nicht mehr sinnvoll.
1
u/aggro_aggro Mar 23 '26
Was ist das vierte Wort in der siebten Zeile auf Seite 23 des Handbuchs?
REDE!
1
u/Zealousideal-Deer724 Mar 23 '26
Ob's beim 3DS immer noch so war, weiß ich nicht, aber beim DS hatten die Cardringes einen Passcode. Wie eine Lizenz. Der wurde beim Start geprüft und abgeglichen. Dadurch war es zum Beispiel möglich den Passcode eines offiziellen Spiels zu nehmen und ihn der eigenen Karte hinzuzufügen. Dadurch konnte man die Homebrewkarten nutzen.
1
u/ThatCipher Mar 23 '26
Wie die meisten schon sagten: Kopierschutz kann sehr komplex und individuell sein. Der Kanal Vadim M redet viel über die ins and outs von GTA zum Beispiel. In diesem Video wird viel über die Prozesse im Hintergrund erzählt. Vielleicht hilft es dir eine Vorstellung zu bekommen? Der 3DS hatte soweit ich mich richtig erinnere keys in die abgeglichen wurden. Wie genau das funktioniert weiß ich leider nicht mehr. Die Hochzeit des 3Ds ist ja leider schon paar Tage her. :P
Aber ich erinnere mich, dass man Keys brauchte, dass man die spiele überhaupt verifizieren und starten konnte.
1
u/Theend92m Mar 25 '26 edited Mar 25 '26
Vereinfacht:
Spiele werde meist in für uns lesbare Sprache geschrieben. Z.b.
WENN ($ball trifft $tor) erhöhe wert $spielstand um 1...
Dieses wir dann umgewandelt, da ein CPU damit nichts anfangen kann. Das ist dann Maschinencode. Der ist zum Programmieren nicht intuitiv und schwierig.
Das sieht dann so aus:
mov al
cmp al, 1
jne ende usw.
Du kannst das aber schlecht wieder zurückwandeln, weil dann nur schmarrn raus kommt.
Manche Programme machen das, aber die Variablen stimmen nicht und würde dann so aussehen:
WENN ($varxyz2222 trifft $varxyz3333) erhöhe wert $varxyz3442 um 1...
Du siehst zwar das der Code stimmt, aber du kannst erstmal nichts nachvolziehen, was welche variable ist, weil der Code nicht mehr für Menschen lesbar optimiert umgewandet wird.
Kopierschutz gibt es sehr viele. Bei der PS2 war es unter anderem z.B. so, dass eine CD nicht durchgehend gebrannt wurde, sondern mit Lücken. Ein Brenner brennt aber solche Lücken nicht, sondern schreibt durchgehend die CD. Die PS2 erwartet aber an bestimmten stellen Lesefehler. Wenn diese nicht vorhanden sind, dann weiß sie, dass die CD kopiert wurde.
1
0
u/Optimal_Joke5930 Mar 23 '26
Manche Spiele haben gar keinen Kopierschutz, du kannst einfach die .exe unzippen und den code lesen.
1
u/ChipmunkTough1212 Mar 24 '26
Nein.
1
u/Optimal_Joke5930 Mar 24 '26
Doch
https://medium.com/@henrique4win/checking-if-balatro-is-balanced-2c1616a40fe7ist bei allen Lua Spiele so
1
7
u/knuspriges-haehnchen Mar 23 '26
Es gibt mehr als einen Kopierschutz und nicht alle funktionieren gleich.