Kies een pagina met handleidingen:
- Grondbeginselen — Informatie over C
- Gereedschap
- Registers
- Eenvoudige instructies
- Voorbeeld 1 — SC CDKey Initial Verification
- Voorbeeld 2 — SC CDKey Shuffle
- Voorbeeld 2b — SC CDKey Final Decode
- The Stack
- Stack Voorbeeld
- Functies
- Voorbeeld 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 and Patching
- Memory Searching
- Voorbeeld 7 — Het schrijven van een cheat voor Starcraft (1.05)
- Voorbeeld 7 Stap 1 — Het weergeven van berichten
- Voorbeeld 7 Stap 1b — Hierboven, w/ func ptrs
- Voorbeeld 7 Definitief
- Voorbeeld 8 — Het verkrijgen van IX86.dll files
- 16-bit Assembly
- Voorbeeld 9 — Keygen voor een 16-bit spel
- Voorbeeld 10 — Een loader schrijven
Deze sectie zal verschillende technieken bespreken die door crackers gebruikt worden om spellen/software te registreren. Ik heb het niet over cd-kraken, omdat ik niet weet hoe dat moet; ik heb het over aanvallen die over het algemeen gebaseerd zijn op een sleutel of registratiecode.
Gemeenschappelijke beveiligingen
De meest voorkomende beveiliging, en degene die hier wordt besproken, is wanneer een programma een registratiesleutel nodig heeft om te ontgrendelen. Meestal is de sleutel gebaseerd op een willekeurige registratiecode die door het programma wordt verstrekt, of op de gebruikersnaam die u invoert.
Ik zal hier enkele definities geven. Merk op dat deze definities van mij zijn, en niet noodzakelijkerwijs overeenkomen met definities die anderen gebruiken. Ze zijn alleen bedoeld om het begrip van deze en volgende secties te vergemakkelijken:
- Een registratiecode is een door een programma gegenereerde code, waarvan de registratiesleutel wordt afgeleid of waarmee wordt gecontroleerd.
- Een registratie-gebruikersnaam of gewoon gebruikersnaam is een gebruikersnaam die een gebruiker invoert. De registratiesleutel is gebaseerd op die gebruikersnaam.
- Een registratiesleutel is de sleutel die wordt gebruikt om een programma te ontgrendelen. Hij kan gebaseerd zijn op een registratiecode, op een registratie-gebruikersnaam, of op helemaal niets.
Het vinden van de plek
Het allereerste voorbeeld gaat over Starcraft’s CDKey verificatie algoritme, maar ik heb het algoritme gegeven. Starcraft’s is de eenvoudigste vorm van verificatie, de sleutel verifieert zichzelf zonder gebruikersnaam of code. De vraag is, hoe vind je het algoritme?
Wel, het ongelukkige antwoord is, het varieert, en het is over het algemeen niet gemakkelijk.
De eerste stap is natuurlijk het programma uit elkaar halen. Daarna moet je, als cracker, proberen een zwak punt in het programma te vinden. Hier zijn verschillende technieken:
- Zoek naar de tekst die om de sleutel vraagt
- Zoek naar de registratie code in het geheugen, en zoek uit waar die wordt opgevraagd
- Voer een code in, laat hem mislukken, zoek dan in het geheugen naar die mislukte code
- Zoek naar alles wat uniek is aan de registratie (kleuren, tekst, dialogen, enz.).
- Zoeken naar de registersleutel die de sleutel opslaat
- Zoeken naar een bestand dat registratie-informatie opslaat
- Zoeken naar de foutmelding wanneer een slechte sleutel wordt gegeven
De laatste techniek is de meest bruikbare, heb ik gevonden. Maar ze allemaal uitproberen, en iets anders proberen dat bij het spel lijkt te passen werkt het beste. In het voorbeeld in de volgende sectie vond ik dat het zoeken naar de tekst die de gebruiker informeert dat de software niet geregistreerd is, goed werkte voor het spel, zoals je later zult zien. Ik kan een tweede voorbeeld doen waar ik zocht naar het bestand dat de sleutel opsloeg, en waar het was gemaakt.
Om Starcraft’s CDKey verifier te vinden, begon ik met het netwerk verkeer, bij de Winsock functie (send() en recv()). Vanaf daar, ben ik teruggegaan om te vinden waar het pakket heen gestuurd wordt dat de Starcraft sleutel valideert met Battle.net. Het was een hoop werk, maar in die tijd was ik aan het leren over Starcraft’s netwerk activiteit, dus het was vooral een neveneffect van wat ik al aan het doen was. Als ik doorga met het schrijven van deze tutorials, zal ik uiteindelijk misschien in zoveel detail treden, maar dat ben ik nog niet van plan.
Kraken van het spel
Als de juiste plek eenmaal is gevonden, is het kraken van een spel vaak heel eenvoudig. Typisch zal een programma de volgende code hebben:
if(keyIsValid) unlock() else displayError()
De assemblage daarvoor zou er zo uitzien:
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:
Zoals besproken in het hoofdstuk over machine code, kunnen de bytes aan de linkerkant de machine code bytes zijn (ik deed ze snel van een referentie blad, dus ze kunnen wel of niet precies juist zijn. Dit programma kan worden gewijzigd door een paar bytes te veranderen, die de code kunnen dwingen om altijd te springen of nooit te springen.
Om de code te dwingen te springen (waardoor, in dit geval, de toets altijd geldig is), wordt de jz vervangen door een jmp (door 74 in eb te veranderen):
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:
Om te voorkomen dat de code springt (waardoor, in dit geval, de toets altijd geldig is), wordt de jz vervangen door een paar nop instructies:
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:
Maak de juiste wijziging, start het spel, en type de code in. Het verwachte resultaat zou moeten optreden!
Het volgende voorbeeld zal dit laten zien op een echt spel (op een spel dat ik hier niet zal noemen, om voor de hand liggende redenen).
Het schrijven van een Keygen
Nog beter dan het kraken van een spel is het schrijven van een keygen voor het spel. De gebruiker voert zijn gebruikersnaam of registratiecode in, en de keygen geeft een geldige sleutel.
In het algemeen vereist dit dat het algoritme volledig wordt ontleed en begrepen. Dan wordt er een kopie van gemaakt in C (of welke taal dan ook) die dezelfde resultaten oplevert. Merk op dat de eerste drie voorbeelden in deze tutorial precies dat doen: de assemblage code terugdraaien naar C. Dus iedereen die deze voorbeelden heeft gevolgd, zou in een goede positie moeten zijn om een keygen te schrijven, die in een latere tutorial zal komen.
Vragen
Voel je vrij om deze sectie aan te passen en vragen te posten, ik zal mijn best doen om ze te beantwoorden. Maar het kan zijn dat je contact met me moet opnemen om me te laten weten dat er een vraag bestaat.