Vælg venligst en side med tutorial:
- Fundamentals — Information about C
- Tools
- Registers
- Simple Instructions
- Example 1 — SC CDKey Initial Verification
- Example 2 – SC CDKey Initial Verification
- – SC CDKey Shuffle
- Eksempel 2b — SC CDKey Final Decode
- The Stack
- Stack Example
- Functions
- Example 3 — Storm.dll SStrChr
- Samlingsoversigt
- Maskinkode
- Eksempel 4 — Knusning af stakken
- Knusning af et spil
- Eksempel 5 — Knusning af et spil
- Eksempel 6 — Skrivning af en keygen
- .dll Injection og patching
- Hukommelsessøgning
- Eksempel 7 — Skrivning af en snydekoder til Starcraft (1.05)
- Eksempel 7 Trin 1 — Visning af meddelelser
- Eksempel 7 Trin 1b — Ovenfor, m/ func ptrs
- Eksempel 7 Afsluttende
- Eksempel 8 — Få IX86.dll-filer
- 16-bit Assembly
- Eksempel 9 — Keygen til et 16-bit spil
- Eksempel 10 — Skrivning af en loader
Dette afsnit vil gennemgå flere teknikker, der bruges af crackere til at registrere spil/software. Jeg nævner ikke cd-cracks, fordi jeg ikke ved, hvordan man laver dem; jeg nævner snarere angreb, der generelt er baseret på en nøgle eller registreringskode.
Fælles beskyttelser
Den mest almindelige beskyttelse, og den, der diskuteres her, er, når et program kræver en registreringsnøgle for at blive låst op. Normalt er nøglen enten baseret på en tilfældig registreringskode, der leveres af programmet, eller baseret på det brugernavn, du indtaster.
Jeg vil opregne nogle definitioner her. Bemærk, at disse definitioner er mine, og vil ikke nødvendigvis svare til de definitioner, som andre bruger. De skal blot gøre det lettere at forstå dette og de følgende afsnit:
- En registreringskode er en kode genereret af et program, som registreringsnøglen er afledt af eller kontrolleret i forhold til.
- Et registreringsbrugernavn eller bare brugernavn er et brugernavn, som en bruger indtaster. Registreringsnøglen er baseret på dette brugernavn.
- En registreringsnøgle er den nøgle, der bruges til at låse et program op. Den kan være baseret på en registreringskode, på et registreringsbrugernavn eller slet ikke være baseret på noget som helst.
Finding the Spot
Det allerførste eksempel gennemgår Starcrafts CDKey-verificeringsalgoritme, men jeg har leveret algoritmen. Starcraft’s er den enkleste form for verifikation, nøglen verificerer sig selv uden brugernavn eller kode. Spørgsmålet er, hvordan finder man algoritmen?
Jamen, det uheldige svar er, at det varierer, og det er generelt ikke nemt.
Det første skridt er naturligvis at adskille programmet. Derefter skal man som cracker forsøge at finde et svagt punkt i programmet. Her er flere teknikker:
- Søg efter den tekst, der beder om nøglen
- Søg efter registreringskoden i hukommelsen, og find ud af, hvor der er adgang til den
- Indtast en kode, få den til at mislykkes, og søg derefter i hukommelsen efter den mislykkede kode
- Søg efter alt unikt ved registreringen (farver, tekst, dialoger osv.).
- Søg efter den registreringsnøgle, der gemmer nøglen
- Søg efter en fil, der gemmer registreringsoplysninger
- Søg efter fejlmeddelelsen, når der er givet en dårlig nøgle
Den sidste teknik er den mest brugbare, har jeg fundet frem til. Det virker dog bedst at prøve dem alle, og prøve alt andet, der synes at passe til spillet. I eksemplet i næste afsnit fandt jeg ud af, at det fungerede godt for spillet at søge efter den tekst, der informerer brugeren om, at softwaren er uregistreret, som du vil se senere. Jeg vil måske lave et andet eksempel, hvor jeg søgte efter den fil, der gemte nøglen, og hvor den blev oprettet.
For at finde Starcrafts CDKey-verifikator, startede jeg med netværkstrafikken, ved Winsock-funktionen (send() og recv()). Derfra gik jeg tilbage for at finde hvor den pakke sendes, der validerer Starcraft-nøglen med Battle.net. Det var meget arbejde, men på det tidspunkt var jeg ved at lære om Starcrafts netværksaktivitet, så det var mest en sideeffekt af det, jeg allerede var i gang med. Hvis jeg fortsætter med at skrive disse tutorials, vil jeg måske på et tidspunkt komme så meget i detaljer, men det har jeg ingen planer om endnu.
Spillet knækkes
Når det rigtige sted er fundet, er det ofte meget nemt at knække et spil. Typisk vil et program have følgende kode:
if(keyIsValid) unlock() else displayError()
Asamlingen til det ville se sådan ud:
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:
Som diskuteret i afsnittet om maskinkode, kan bytes til venstre være maskinkodebytes (jeg lavede dem hurtigt fra et referenceark, så de er måske eller måske ikke helt korrekte. Dette program kan ændres ved at ændre et par bytes, som enten kan tvinge koden til at hoppe altid eller hoppe aldrig.
For at tvinge koden til at hoppe (hvilket i dette tilfælde vil gøre nøglen altid gyldig), erstattes jz med en jmp (ved at ændre 74 til eb):
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:
For at forhindre koden i at hoppe (hvilket i dette tilfælde vil gøre nøglen altid gyldig), erstattes jz med et par nop-instruktioner:
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:
Før den relevante ændring, kør spillet, og indtast en hvilken som helst kode. Det forventede resultat skulle opstå!
Det næste eksempel vil vise dette på et faktisk spil (på et spil, som jeg af indlysende årsager ikke vil nævne her).
Skrivning af en keygen
Et endnu bedre end at cracke et spil er at skrive en keygen til det. Brugeren indtaster sit brugernavn eller sin registreringskode, og keygen’en udsender en gyldig nøgle.
Generelt kræver dette, at algoritmen er fuldt ud reverse engineered og forstået. Derefter laves en kopi af den i C (eller et andet sprog), som giver de samme resultater. Bemærk, at de tre første eksempler i denne tutorial gør netop dette: de vender assemblerkoden tilbage til C. Så enhver, der rent faktisk har fulgt dem, burde være i en god position til at skrive en keygen, hvilket vil komme i en senere tutorial.
Spørgsmål
Føl dig fri til at redigere dette afsnit og skrive spørgsmål, jeg vil gøre mit bedste for at besvare dem. Men det kan være nødvendigt at du skal kontakte mig for at fortælle mig, at der findes et spørgsmål.