Tutorial de limbaj de asamblare

Vă rugăm să alegeți o pagină de tutorial:

  • Fundamente — Informații despre C
  • Instrumente
  • Registre
  • Instrucțiuni simple
  • Exemplul 1 — Verificarea inițială a CDKey-ului SC CDKey
  • Exemplul 2 — SC CDKey Shuffle
  • Exemplul 2b — SC CDKey Decodare finală
  • Stiva
    • Exemplul stivei
  • Funcții
  • Exemplul 3 — Furtună.dll SStrChr
  • Rezumat asamblare
  • Cod mașină
  • Exemplul 4 — Spargerea stivei
  • Spargerea unui joc
  • Exemplul 5 — Spargerea unui joc
  • Exemplul 6 — Scrierea unui keygen
  • .dll Injection and Patching
  • Memory Searching
  • Exemplul 7 — Scrierea unui cheat pentru Starcraft (1.05)
    • Exemplul 7 Pasul 1 — Afișarea mesajelor
    • Exemplul 7 Pasul 1b — Mai sus, cu func ptrs
    • Exemplul 7 Final
  • Exemplul 8 — Obținerea IX86.dll
  • 16-bit Assembly
  • Exemplul 9 — Keygen pentru un joc pe 16 biți
  • Exemplul 10 — Scrierea unui loader

Această secțiune va trece în revistă mai multe tehnici folosite de crackeri pentru a înregistra jocuri/software. Nu menționez spargerile de cd-uri, pentru că nu știu cum să le fac; mai degrabă, menționez atacurile care se bazează, în general, pe o cheie sau un cod de înregistrare.

Protecții comune

Cea mai comună protecție, și cea discutată aici, este atunci când un program necesită o cheie de înregistrare pentru a se debloca. De obicei, cheia se bazează fie pe un cod de înregistrare aleatoriu furnizat de program, fie pe numele de utilizator pe care îl introduceți.

Voi enumera câteva definiții aici. Rețineți că aceste definiții sunt ale mele și nu vor corespunde neapărat cu definițiile folosite de alții. Ele sunt pur și simplu pentru a ușura înțelegerea acestei secțiuni și a secțiunilor următoare:

  • Un cod de înregistrare este un cod generat de un program, din care cheia de înregistrare este derivată sau față de care este verificată.
  • Un nume de utilizator de înregistrare sau pur și simplu nume de utilizator este un nume de utilizator pe care îl introduce un utilizator. Cheia de înregistrare se bazează pe acel nume de utilizator.
  • O cheie de înregistrare este cheia folosită pentru a debloca un program. Se poate baza pe un cod de înregistrare, pe un nume de utilizator de înregistrare sau nu se poate baza pe nimic.

Finding the Spot

Primul exemplu trece în revistă algoritmul de verificare CDKey din Starcraft, dar eu am furnizat algoritmul. Cel de la Starcraft este cel mai simplu tip de verificare, cheia se verifică singură, fără un nume de utilizator sau un cod. Întrebarea este, cum găsești algoritmul?

Bine, răspunsul nefericit este că variază și, în general, nu este ușor.

Primul pas este, evident, să dezasamblați programul. După aceea, ca un cracker, trebuie să încerci să găsești un punct slab în program. Iată câteva tehnici:

  • Căutați textul care solicită cheia
  • Căutați codul de înregistrare în memorie și aflați unde este accesat
  • Introduceți un cod, faceți să eșueze, apoi căutați în memorie acel cod eșuat
  • Căutați orice este unic în legătură cu înregistrarea (culori, text, dialoguri, etc.).
  • Căutați cheia de registru care stochează cheia
  • Căutați un fișier care stochează informații despre înregistrare
  • Căutați mesajul de eroare atunci când se dă o cheie greșită

Ultima tehnică este cea mai utilă, am găsit-o eu. Cu toate acestea, încercându-le pe toate și încercând orice altceva care pare să se potrivească jocului funcționează cel mai bine. În exemplul din secțiunea următoare, am descoperit că căutarea textului care informează utilizatorul că software-ul este neînregistrat a funcționat bine pentru joc, după cum veți vedea mai târziu. S-ar putea să fac un al doilea exemplu în care să caut fișierul care a stocat cheia și unde a fost creat.

Pentru a găsi verificatorul CDKey al lui Starcraft, am început cu traficul de rețea, la funcția Winsock (send() și recv()). De acolo, am mers înapoi pentru a găsi unde este trimis pachetul care validează cheia Starcraft cu Battle.net. A fost multă muncă, dar la vremea respectivă învățam despre activitatea de rețea a Starcraft, așa că a fost în mare parte un efect secundar a ceea ce făceam deja. Dacă voi continua să scriu aceste tutoriale, s-ar putea ca în cele din urmă să intru în atâtea detalii, dar nu am deocamdată planuri în acest sens.

Cracking the Game

După ce se găsește locul potrivit, spargerea unui joc este adesea foarte ușoară. De obicei, un program va avea următorul cod:

 if(keyIsValid) unlock() else displayError()

Asamblatorul pentru acesta ar arăta astfel:

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:

Așa cum am discutat în secțiunea despre codul mașină, octeții din stânga pot fi octeții de cod mașină (i-am făcut rapid de pe o foaie de referință, așa că pot fi sau nu exact corecți. Acest program poate fi modificat prin schimbarea a câtorva octeți, care pot forța codul să sară întotdeauna sau să nu sară niciodată.

Pentru a forța codul să sară (ceea ce, în acest caz, va face ca tasta să fie întotdeauna valabilă), jz este înlocuit cu un jmp (prin schimbarea lui 74 în 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:

Pentru a împiedica codul să sară (ceea ce, în acest caz, va face ca tasta să fie întotdeauna valabilă), jz este înlocuit cu o pereche de instrucțiuni nop:

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:

Faceți modificarea corespunzătoare, rulați jocul și introduceți orice cod. Ar trebui să apară rezultatul așteptat!

Următorul exemplu va arăta acest lucru pe un joc real (pe un joc pe care nu-l voi numi aici, din motive evidente).

Scrierea unui keygen

Mai bine decât să spargi un joc este să scrii un keygen pentru el. Utilizatorul își introduce numele de utilizator sau codul de înregistrare, iar keygen-ul scoate o cheie validă.

În general, acest lucru necesită ca algoritmul să fie în întregime inversat și înțeles. Apoi se face o copie a acestuia în C (sau orice alt limbaj) care produce aceleași rezultate. Rețineți că primele trei exemple din acest tutorial fac exact acest lucru: transformă codul de asamblare înapoi în C. Astfel, oricine le-a urmat efectiv ar trebui să fie într-o poziție bună pentru a scrie un keygen, ceea ce va veni într-un tutorial ulterior.

Întrebări

Simțiți-vă liber să editați această secțiune și să postați întrebări, voi face tot posibilul să le răspund. Dar este posibil să fie nevoie să mă contactați pentru a mă anunța că există o întrebare.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.