Archivio storico · Reverse engineering · Spiegazione dettagliata

«How to Crack» — Lezione 1: un approccio

Una lettura guidata del primo testo delle lezioni di +ORC (gennaio 1996): che cosa sostiene, come ragiona, quali concetti tecnici dà per scontati e dove il testo è discutibile o impreciso.

In breve

Il documento è l’introduzione di un corso, scritto in inglese, sul cracking dei programmi DOS dei primi anni Novanta: individuare dove un programma controlla una limitazione — tempo, numero di avvii, data, password, disco — e capire come eludere quel controllo. Il valore storico e didattico non sta nelle istruzioni, ormai legate a un’epoca scomparsa, ma nel metodo: osservare un programma senza il codice sorgente, formulare ipotesi, verificarle, accorgersi degli errori e correggere il tiro.

Questa pagina non ricopia il testo e non lo trasforma in una guida operativa. Spiega le idee, i meccanismi hardware e software coinvolti e le debolezze del ragionamento. L’originale resta consultabile nel file ORC_1.DOC.

1. Che cosa è il testo

Si presenta come «Lesson #1 — An approach» di «How to Crack — The +ORC Lessons». L’autore usa la sigla +ORC e firma l’esempio pratico con la data gennaio 1996. Il tono è volutamente provocatorio: polemizza con i programmatori «commerciali», con chi progetta le protezioni e con la società che, secondo lui, subordina tutto al denaro.

Va distinto ciò che è spiegazione tecnica da ciò che è presa di posizione. Quando l’autore sostiene che le protezioni non evolvono davvero, ma ripetono vecchi trucchi, formula una tesi che si può discutere; non è una verità tecnica dimostrata nel documento.

2. La tesi iniziale: partire da programmi vecchi

Il consiglio di apertura è pedagogico: per imparare, bisogna cominciare da applicazioni vecchie con protezioni vecchie. Il motivo è che le tecniche di base sono più leggibili: programmi piccoli, poche funzioni, meno livelli di astrazione. Imparate quelle, secondo l’autore, si riconoscono più facilmente anche gli schemi moderni, spesso variazioni di idee già note.

È il ragionamento di chi impara a suonare partendo da brani semplici: non perché siano più importanti, ma perché mostrano la struttura senza coprirla di complessità.

I quattro requisiti

3. Le sette famiglie di protezione

Il testo classifica i programmi da studiare in sette categorie, dalla più semplice alla più elaborata. È una tassonomia utile perché separa che cosa viene controllato.

CategoriaChe cosa limitaPerché l’autore la considera più o meno facile
1. PasswordL’accesso richiede una parola d’ordine.La verifica tende a essere un confronto isolato.
2. Numero o durata d’usoIl programma si ferma dopo un certo numero di avvii o minuti.Richiede di trovare contatori e confronti, ma lo schema è ricorrente.
3. DataIl programma funziona soltanto prima di una scadenza.Il controllo dipende dalla data di sistema.
4. Funzioni disattivateAlcune funzioni sono presenti ma bloccate.A volte basta capire quale condizione le abilita; altre volte il codice manca.
5. Disco o CD-ROMIl programma controlla un supporto originale.Viene considerata una protezione molto aggirabile.
6. Componenti cifratiUna delle precedenti, ma con codice offuscato o auto-modificante.Aggiunge ostacoli di lettura, non necessariamente una logica nuova.
7. AltroSchemi che non rientrano nelle categorie precedenti.Sono i casi dove le regole generali valgono meno.

Nel resto della lezione l’autore usa soprattutto la seconda categoria: una demo che permette di giocare per due minuti.

4. Dove trovare «materiale di studio»

L’autore osserva che le riviste con CD-ROM allegati contenevano molte versioni dimostrative e che i giochi, per le loro dimensioni ridotte, mostrano protezioni relativamente sofisticate in file facili da esplorare. Il ragionamento è tecnico: cercare un controllo in un singolo eseguibile piccolo è più semplice che cercarlo in grandi collezioni di moduli.

Qui il testo diventa anche problematico. Parla di usare per sempre programmi in prova, di distribuirli e, più avanti, di applicare le stesse conoscenze a servizi remoti e perfino a sistemi bancari. Sono affermazioni che non vanno lette come raccomandazioni: l’elusione di una protezione, la distribuzione di copie o l’accesso non autorizzato a sistemi possono violare norme sul diritto d’autore o penali, secondo il caso e il Paese.

5. Il caso di studio: una demo a tempo limitato

L’esempio è una versione dimostrativa di un gioco di biliardo del 1994, distribuita su CD allegati a riviste nel 1995. Dopo circa due minuti compare una schermata che invita ad acquistare il programma completo. Il problema posto è: dove, nel codice, il programma decide che il tempo è scaduto?

5.1 Il metodo: confrontare fotografie della memoria

Invece di leggere subito migliaia di istruzioni, l’autore propone di osservare gli effetti. Si registra lo stato della memoria in momenti diversi, senza toccare il programma, e si confrontano le fotografie. Le celle che cambiano mentre il tempo passa sono candidate a essere contatori. È una strategia molto generale: ridurre un problema enorme alle poche posizioni che si comportano in modo coerente con l’ipotesi.

L’ambiente è quello di un debugger residente in DOS, che permette di fermare l’esecuzione, ispezionare memoria e registri, confrontare vettori di interruzione. Il testo ironizza con il momento «zen»: guardare i dati, aspettare che il disegno diventi riconoscibile.

5.2 Primo tentativo: la costante di ricarica

Il primo indizio è una posizione che viene ricaricata con il valore esadecimale 3C, cioè 60 in decimale, e poi decrementata fino a zero. L’autore la interpreta come il contatore dei «passi» che compongono un secondo: quando arriva a zero, il programma sottrae un secondo al tempo disponibile.

L’idea sembra ragionevole: aumentando il valore di ricarica, ogni «secondo» dovrebbe durare più a lungo. Il testo la presenta però come un esempio di ragionamento apparentemente corretto che non risolve il problema.

5.3 Secondo tentativo: le posizioni gemelle

La modifica non produce alcun effetto perché la ricerca trova due posizioni con la stessa sequenza di byte. Secondo l’interpretazione proposta dall’autore, la seconda funge da controllo o specchio e può correggere la prima; il documento non fornisce però un’analisi completa che dimostri tale rapporto. L’autore lo usa per ricordare che una ricerca con più risultati va letta per intero, non fermandosi al primo.

Quando entrambe sono cambiate, il gioco sembra più lento — e proprio qui arriva la lezione più importante.

5.4 Il vero errore: confondere l’indicatore con la causa

Dopo la modifica, il tempo mostrato sullo schermo scorre più lentamente. Ma la schermata di fine prova compare comunque, dopo circa 28 secondi di tempo visibile. Il contatore modificato governava ciò che l’utente vede, non la condizione che decide la scadenza. Il programma conosceva il tempo reale in un altro modo.

È una distinzione che vale ben oltre il cracking: nel debugging, nelle misure fisiche e nell’analisi dei dati, cambiare un indicatore non equivale a cambiare il fenomeno che esso rappresenta.

6. L’interruzione del timer, spiegata

Per capire il passaggio successivo servono alcune nozioni dell’architettura dei PC DOS.

Il programma di prova aveva «agganciato» direttamente INT 08h, non INT 1Ch. L’autore ne conclude, con ragione, che quel punto fosse un buon sospettato: se un software intercetta il timer, può contare il tempo con una propria routine.

Una parentesi: disattivare il timer

Il testo spiega anche che è possibile mascherare l’interruzione del timer scrivendo in una porta del controllore, fermando l’avanzamento dell’orologio DOS. È un esperimento didattico che mostra come l’hardware possa essere governato direttamente. L’autore avverte però che con il timer fermo altri componenti si comportano male: per esempio il motore del floppy può restare acceso.

Nel caso della demo la tecnica non basta, perché il programma non dipende soltanto dal tick standard. La parentesi serve quindi a due scopi: insegnare un meccanismo e mostrare che una tecnica interessante non è necessariamente quella giusta per il problema.

7. La soluzione trovata e il suo significato

Dopo aver cercato a lungo nei gestori delle interruzioni senza trovare la protezione, l’autore torna ai dati raccolti. Nota due posizioni in cui un valore cambia lentamente, mentre quello vicino percorre rapidamente l’intero ciclo: l’autore li interpreta come i byte basso e alto di un unico contatore a 16 bit. Non viene riprodotta una traccia completa che permetta di verificare ogni passaggio di questa identificazione.

Il calcolo che gli permette di prevedere il valore limite è semplice: 60 passi al secondo per 120 secondi dà 7200, cioè 1C20 in esadecimale. Cercando quel numero nel codice trova un confronto seguito da un salto condizionale: se il contatore è inferiore al limite, il gioco continua; altrimenti viene richiamata la routine della schermata di scadenza.

La lezione è che il valore giusto non si indovina soltanto guardando i dati: si deduce da ciò che già si è capito del sistema. Quando i numeri tornano, l’ipotesi diventa molto più credibile.

Perché «effetti» e non «protezione»

Il primo principio enunciato è: se puoi eliminare gli effetti di una protezione, non cercare oltre. Ha senso per chi lavora con un obiettivo pratico; meno se si studia il meccanismo per capirlo. L’autore lo contraddice parzialmente nel suo stesso esempio, perché senza la comprensione del vero controllo la prima correzione non funzionava.

Una modifica «debole» e una «radicale»

Il testo distingue fra l’alterare il limite, che concede più tempo, e l’annullare la condizione del confronto, che elimina la scadenza. Raccomanda per i limiti temporali un intervento delicato, rimandando la ragione a una lezione successiva che non è presente nel documento. Questa parte è quindi incompleta: l’affermazione viene dichiarata, ma non giustificata.

8. Osservazioni sulla precisione del testo

Una lettura attenta mostra alcune imprecisioni nei numeri. Non cambiano il metodo, ma è importante non copiarle come fatti.

9. Il secondo percorso: guardare all’indietro

L’autore descrive un metodo alternativo: osservare le istruzioni eseguite subito prima della schermata di scadenza. In una fase ripetitiva, lo stesso schema compare molte volte; poi, quando scatta il limite, l’esecuzione prende una strada diversa. Il punto in cui la sequenza cambia indica dove la decisione viene presa.

Lo giudica però instabile: dipende dal momento in cui si ferma il programma e dalla distanza fra controllo e schermata. È un buon esempio di compromesso fra metodo rapido e metodo affidabile.

10. Quando non serve fare nulla

La parte finale ricorda il caso di una demo che conteneva, nei fatti, componenti della versione completa. L’autore vuole mostrare che talvolta la limitazione è fragile non per una tecnica brillante, ma per superficialità del produttore.

Il passaggio ha un significato più ampio: prima di decidere che un sistema richiede analisi sofisticata, conviene verificare quali risorse siano già disponibili e a quali condizioni funziona davvero.

11. Il contesto storico e legale

Il documento nasce nell’epoca delle comunità sotterranee di reverse engineering, dei newsgroup e dei remailer anonimi. L’indirizzo anon.penet.fi, citato per ricevere le lezioni mancanti, era un servizio finlandese di posta pseudonima: venne chiuso nell’agosto 1996 dopo pressioni giudiziarie. Cronaca del 31 agosto 1996.

Questa pagina è un commento storico e didattico, non un’autorizzazione a eludere licenze, distribuire copie o accedere a sistemi altrui. Gli eventuali esperimenti vanno limitati a software proprio o a esercizi predisposti e autorizzati. La disponibilità di una demo non equivale, da sola, al permesso di modificarla o redistribuirla.

12. Che cosa può imparare oggi un lettore

Glossario essenziale

Debugger
Strumento che permette di fermare un programma, osservarne memoria e registri e seguirne l’esecuzione.
Esadecimale
Sistema numerico in base 16, molto usato nei calcolatori. 3C vale 60 e 1C20 vale 7200.
Interruzione
Evento che sospende temporaneamente il programma e trasferisce il controllo a una routine specifica.
Gestore o ISR
La routine che risponde a una interruzione.
Hook
Aggancio con cui un programma sostituisce o affianca un punto di controllo del sistema.
Nag screen
Schermata che invita insistentemente ad acquistare il programma o a registrarlo.
Salto condizionale
Istruzione che sceglie quale percorso seguire in base al risultato di un confronto.

Leggi il documento originale: ORC_1.DOC