Bitte wählen Sie eine Tutorial-Seite:
- Grundlagen — Informationen über C
- Werkzeuge
- Register
- Einfache Anweisungen
- Beispiel 1 — SC CDKey Initial Verification
- Beispiel 2 — SC CDKey Shuffle
- Beispiel 2b — SC CDKey Final Decode
- Der Stack
- Stack Beispiel
- Funktionen
- Beispiel 3 — Storm.dll SStrChr
- Assembly Summary
- Machine Code
- Example 4 — Smashing the Stack
- Cracking a Game
- Example 5 — Cracking a game
- Example 6 — Writing a keygen
- .dll Injection und Patching
- Memory Searching
- Beispiel 7 — Schreiben eines Cheats für Starcraft (1.05)
- Beispiel 7 Schritt 1 — Anzeigen von Meldungen
- Beispiel 7 Schritt 1b — Oben, mit func ptrs
- Beispiel 7 Final
- Beispiel 8 — Erhalten von IX86.dll Dateien
- 16-bit Assembly
- Beispiel 9 — Keygen für ein 16-bit Spiel
- Beispiel 10 — Schreiben eines Loaders
In diesem Abschnitt werden verschiedene Techniken besprochen, die von Crackern benutzt werden, um Spiele/Software zu registrieren. Ich erwähne keine CD-Cracks, weil ich nicht weiß, wie man die macht; ich erwähne eher Angriffe, die im Allgemeinen auf einem Schlüssel oder einem Registrierungscode basieren.
Gängige Schutzmechanismen
Der häufigste Schutzmechanismus, der hier besprochen wird, besteht darin, dass ein Programm zum Freischalten einen Registrierungsschlüssel benötigt. Normalerweise basiert der Schlüssel entweder auf einem zufälligen Registrierungscode, der vom Programm bereitgestellt wird, oder auf dem von Ihnen eingegebenen Benutzernamen.
Ich werde hier einige Definitionen auflisten. Beachten Sie, dass diese Definitionen von mir stammen und nicht unbedingt mit den Definitionen übereinstimmen, die andere verwenden. Sie dienen lediglich dem besseren Verständnis dieses und der folgenden Abschnitte:
- Ein Registrierungscode ist ein von einem Programm erzeugter Code, von dem der Registrierungsschlüssel abgeleitet oder mit dem er verglichen wird.
- Ein Registrierungsbenutzername oder einfach nur Benutzername ist ein Benutzername, den ein Benutzer eingibt. Der Registrierungsschlüssel basiert auf diesem Benutzernamen.
- Ein Registrierungsschlüssel ist der Schlüssel, der zum Freischalten eines Programms verwendet wird. Er kann auf einem Registrierungscode, auf einem Registrierungsbenutzernamen oder auf gar nichts basieren.
Finden der Stelle
Das allererste Beispiel geht auf den CDKey-Verifizierungsalgorithmus von Starcraft ein, aber ich habe den Algorithmus zur Verfügung gestellt. Starcraft ist die einfachste Art der Verifizierung, der Schlüssel verifiziert sich selbst, ohne einen Benutzernamen oder Code. Die Frage ist, wie man den Algorithmus findet?
Nun, die unglückliche Antwort ist, dass es variiert und es im Allgemeinen nicht einfach ist.
Der erste Schritt ist natürlich, das Programm zu disassemblieren. Danach muss man als Cracker versuchen, eine Schwachstelle im Programm zu finden. Hier sind einige Techniken:
- Suche nach dem Text, der zur Eingabe des Schlüssels auffordert
- Suche nach dem Registrierungscode im Speicher und finde heraus, wo auf ihn zugegriffen wird
- Gib einen Code ein, lass ihn fehlschlagen und suche dann im Speicher nach dem fehlgeschlagenen Code
- Suche nach allem, was an der Registrierung einzigartig ist (Farben, Text, Dialoge usw.).
- Suche nach dem Registrierungsschlüssel, der den Schlüssel speichert
- Suche nach einer Datei, die Registrierungsinformationen speichert
- Suche nach der Fehlermeldung, wenn ein falscher Schlüssel eingegeben wird
Die letzte Technik ist die nützlichste, die ich gefunden habe. Allerdings funktioniert es am besten, alle Techniken auszuprobieren und alles andere zu versuchen, was dem Spiel zu entsprechen scheint. In dem Beispiel im nächsten Abschnitt habe ich festgestellt, dass die Suche nach dem Text, der den Benutzer darüber informiert, dass die Software nicht registriert ist, für das Spiel gut funktioniert, wie Sie später sehen werden. Vielleicht mache ich ein zweites Beispiel, bei dem ich nach der Datei suche, in der der Schlüssel gespeichert ist, und wo er erstellt wurde.
Um den CDKey-Prüfer von Starcraft zu finden, begann ich mit dem Netzwerkverkehr, und zwar mit der Winsock-Funktion (send() und recv()). Von dort aus bin ich zurückgegangen, um herauszufinden, wo das Paket gesendet wird, das den Starcraft-Schlüssel mit dem Battle.net validiert. Es war eine Menge Arbeit, aber zu der Zeit lernte ich gerade etwas über die Netzwerkaktivitäten von Starcraft, also war es hauptsächlich ein Nebeneffekt dessen, was ich bereits tat. Wenn ich mit dem Schreiben dieser Tutorials fortfahre, werde ich vielleicht irgendwann so ins Detail gehen, aber das habe ich noch nicht vor.
Das Spiel knacken
Wenn man die richtige Stelle gefunden hat, ist das Knacken eines Spiels oft sehr einfach. Normalerweise hat ein Programm den folgenden Code:
if(keyIsValid) unlock() else displayError()
Das Assemblerprogramm sieht dann so aus:
85 xx test keyIsValid, keyIsValid74 06 jz errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Wie im Abschnitt über Maschinencode beschrieben, können die Bytes auf der linken Seite die Maschinencode-Bytes sein (ich habe sie schnell von einem Referenzblatt abgetippt, daher können sie nicht ganz korrekt sein. Dieses Programm kann geändert werden, indem man ein paar Bytes ändert, die den Code entweder dazu zwingen, immer oder nie zu springen.
Um den Code zum Springen zu zwingen (was in diesem Fall dazu führt, dass die Taste immer gültig ist), wird das jz durch ein jmp ersetzt (indem 74 in eb geändert wird):
85 xx test keyIsValid, keyIsValideb 06 jmp errore8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Um zu verhindern, dass der Code springt (was in diesem Fall dazu führt, dass die Taste immer gültig ist), wird das jz durch ein Paar nop-Anweisungen ersetzt:
85 xx test keyIsValid, keyIsValid90 nop90 nope8 xx xx xx xx call unlockeb 06 jmp done error:e8 xx xx xx xx call displayError done:
Machen Sie die entsprechende Änderung, starten Sie das Spiel und geben Sie einen beliebigen Code ein. Das erwartete Ergebnis sollte eintreten!
Das nächste Beispiel zeigt dies an einem tatsächlichen Spiel (das ich hier aus offensichtlichen Gründen nicht nennen werde).
Schreiben eines Keygens
Noch besser als ein Spiel zu knacken ist es, einen Keygen für das Spiel zu schreiben. Der Benutzer gibt seinen Benutzernamen oder Registrierungscode ein, und der Keygen gibt einen gültigen Schlüssel aus.
In der Regel erfordert dies, dass der Algorithmus vollständig zurückentwickelt und verstanden wird. Dann wird eine Kopie davon in C (oder einer anderen Sprache) erstellt, die die gleichen Ergebnisse liefert. Beachten Sie, dass die ersten drei Beispiele in diesem Tutorial genau das tun: den Assemblercode in C zurückverwandeln. Wer sie befolgt hat, sollte also in der Lage sein, einen Keygen zu schreiben, der in einem späteren Tutorial folgen wird.
Fragen
Fühlen Sie sich frei, diesen Abschnitt zu bearbeiten und Fragen zu stellen, ich werde mein Bestes tun, um sie zu beantworten. Es kann aber sein, dass ihr mich kontaktieren müsst, um mir mitzuteilen, dass eine Frage existiert.