Tutorial sul linguaggio assembly

Scegli una pagina di tutorial:

  • Fondamenti — Informazioni sul C
  • Strumenti
  • Registri
  • Istruzioni semplici
  • Esempio 1 — Verifica iniziale SC CDKey
  • Esempio 2 — SC CDKey Shuffle
  • Esempio 2b — SC CDKey Decodifica Finale
  • Lo Stack
    • Esempio di Stack
  • Funzioni
  • Esempio 3 — Storm.dll SStrChr
  • Riassunto dell’assembly
  • Codice macchina
  • Esempio 4 — Distruggere lo stack
  • Craccare un gioco
  • Esempio 5 — Craccare un gioco
  • Esempio 6 — Scrivere un keygen
  • .dll Injection and Patching
  • Ricerca della memoria
  • Esempio 7 — Scrivere un cheat per Starcraft (1.05)
    • Esempio 7 Passo 1 — Visualizzare i messaggi
    • Esempio 7 Passo 1b — Sopra, con func ptrs
    • Esempio 7 Finale
  • Esempio 8 — Ottenere IX86.dll
  • Assembly a 16 bit
  • Esempio 9 — Keygen per un gioco a 16 bit
  • Esempio 10 — Scrivere un loader

Questa sezione esaminerà diverse tecniche usate dai cracker per registrare giochi/software. Non menziono i cd-crack, perché non so come farli; piuttosto, menziono attacchi che sono generalmente basati su una chiave o un codice di registrazione.

Protezioni comuni

La protezione più comune, e quella discussa qui, è quando un programma richiede una chiave di registrazione per sbloccare. Di solito, la chiave è basata o su un codice di registrazione casuale fornito dal programma, o basato sul nome utente inserito.

Ecco alcune definizioni qui. Notate che queste definizioni sono mie, e non corrispondono necessariamente alle definizioni usate da altri. Sono semplicemente per rendere più facile la comprensione di questa e delle sezioni successive:

  • Un codice di registrazione è un codice generato da un programma, da cui la chiave di registrazione deriva o con cui viene controllata.
  • Un nome utente di registrazione o semplicemente nome utente è un nome utente che un utente inserisce. La chiave di registrazione è basata su quel nome utente.
  • Una chiave di registrazione è la chiave usata per sbloccare un programma. Può essere basata su un codice di registrazione, su un nome utente di registrazione o su niente.

Trovare il punto

Il primissimo esempio riguarda l’algoritmo di verifica CDKey di Starcraft, ma ho fornito l’algoritmo. Quello di Starcraft è il tipo di verifica più semplice, la chiave si verifica da sola senza un nome utente o un codice. La domanda è: come si fa a trovare l’algoritmo?

Beh, la risposta spiacevole è che varia, e generalmente non è facile.

Il primo passo è ovviamente smontare il programma. Dopo di che, come cracker, devi cercare di trovare un punto debole nel programma. Ecco diverse tecniche:

  • Cercate il testo che richiede la chiave
  • Cercate il codice di registrazione nella memoria, e scoprite dove si accede ad esso
  • Inserite un codice, fatelo fallire, poi cercate nella memoria quel codice fallito
  • Cercate qualsiasi cosa unica sulla registrazione (colori, testo, dialoghi, ecc.).
  • Cerca la chiave di registro che memorizza la chiave
  • Cerca un file che memorizza le informazioni di registrazione
  • Cerca il messaggio di errore quando viene data una chiave sbagliata

L’ultima tecnica è la più utile, ho trovato. Tuttavia, provarle tutte e provare qualsiasi altra cosa che sembra adattarsi al gioco funziona meglio. Nell’esempio della prossima sezione, ho trovato che cercare il testo che informa l’utente che il software non è registrato ha funzionato bene per il gioco, come vedrete più avanti. Potrei fare un secondo esempio in cui ho cercato il file che memorizza la chiave, e dove è stato creato.

Per trovare il verificatore di CDKey di Starcraft, ho iniziato con il traffico di rete, alla funzione Winsock (send() e recv()). Da lì, ho fatto un passo indietro per trovare dove viene inviato il pacchetto che convalida la chiave di Starcraft con Battle.net. È stato un sacco di lavoro, ma all’epoca stavo imparando a conoscere l’attività di rete di Starcraft, quindi è stato soprattutto un effetto collaterale di quello che stavo già facendo. Se continuo a scrivere questi tutorial, potrei alla fine entrare nei dettagli, ma non ho ancora intenzione di farlo.

Cracking del gioco

Una volta trovato il punto giusto, craccare un gioco è spesso molto facile. Tipicamente, un programma avrà il seguente codice:

 if(keyIsValid) unlock() else displayError()

L’assembly per questo sarebbe simile a:

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:

Come discusso nella sezione sul codice macchina, i byte a sinistra possono essere i byte del codice macchina (li ho fatti velocemente da un foglio di riferimento, quindi possono essere o meno esattamente corretti. Questo programma può essere modificato cambiando un paio di byte, che possono forzare il codice a saltare sempre o saltare mai.

Per forzare il codice a saltare (che, in questo caso, renderà il tasto sempre valido), il jz è sostituito da un jmp (cambiando 74 in 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:

Per evitare che il codice salti (che, in questo caso, renderà il tasto sempre valido), il jz è sostituito da una coppia di istruzioni 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:

Fate le modifiche appropriate, eseguite il gioco e digitate qualsiasi codice. Dovrebbe verificarsi il risultato atteso!

Il prossimo esempio mostrerà questo su un gioco reale (su un gioco che non nominerò qui, per ovvie ragioni).

Scrivere un Keygen

Ancora meglio che craccare un gioco è scrivere un keygen per esso. L’utente inserisce il suo nome utente o il codice di registrazione, e il keygen produce una chiave valida.

Generalmente, questo richiede che l’algoritmo sia completamente invertito e compreso. Poi se ne fa una copia in C (o in qualsiasi altro linguaggio) che produce gli stessi risultati. Notate che i primi tre esempi in questo tutorial fanno proprio questo: ritrasformare il codice assembly in C. Quindi chiunque li abbia seguiti dovrebbe essere in una buona posizione per scrivere un keygen, che verrà in un tutorial successivo.

Domande

Sentitevi liberi di modificare questa sezione e postare domande, farò del mio meglio per rispondere. Ma potrebbe essere necessario contattarmi per farmi sapere che esiste una domanda.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.