Archivio storico · Reverse engineering · Spiegazione dettagliata

Lezione 4: le protezioni a tempo

Come funzionano prove a scadenza e contatori di utilizzi, che cosa mostrano i due casi studiati e perché il progetto di queste protezioni è fragile.

In breve

La quarta lezione riguarda le protezioni a tempo: prove che scadono dopo un numero di giorni, a una data fissa, dopo alcuni minuti o dopo un numero di avvii. Il testo analizza due programmi shareware del 1995-1996, poi riporta il lavoro di studenti della +HCU su una versione a 16 bit e una a 32 bit dello stesso prodotto.

Questa pagina spiega come funzionano questi schemi, che cosa fa ogni caso e quali debolezze di progetto emergono. Il documento contiene anche ricette precise per aggirare i limiti: qui non le riporto, né come sequenze di byte né come passaggi da ripetere.

1. Le quattro famiglie

Nome nel testoChe cosa limitaChe cosa deve ricordare il programma
CinderellaUn periodo (per esempio 30 giorni) dalla prima installazioneLa data di inizio
Best beforeUna data fissaQuasi nulla: basta la data di scadenza
CountdownMinuti o secondi per ogni avvioIl tempo trascorso nella sessione
Quiver («faretra»)Un numero di utilizziUn contatore

L'autore ammette che il contatore non dipende dal tempo, ma lo include perché la struttura è simile. Il punto comune è che un programma che deve ricordare quanto ha già concesso deve conservare uno stato tra un avvio e l'altro. Quello stato è la parte più delicata del sistema.

2. Primo caso: un database con due limiti

Il programma del 1995 si disattiva dopo 90 giorni o 25 sessioni, a seconda di quale limite arrivi prima. L'eseguibile è piccolo (8.912 byte) perché contiene soprattutto la protezione. L'applicazione vera sta in una DLL molto più grande, caricata solo se i controlli vengono superati.

Come viene letto

  1. Si cercano i testi. Parole come «demo», «expire» o «evaluation» portano ai messaggi mostrati alla scadenza.
  2. Si risale ai confronti. Ogni messaggio è preceduto da una condizione. Il programma non usa il numero 25 ma una coppia di valori: la differenza tra 0x66 (102) e 0x4D (77) è 25. Chi cerca soltanto 25 non lo trova.
  3. Si osserva dove cambia lo stato. Confrontando un file prima e dopo alcune esecuzioni si scopre che il contatore è un byte nascosto nella DLL, senza cambiare la data del file.
  4. Si separano i meccanismi. Contatore e confronto tra date sono due protezioni distinte e richiedono analisi distinte.

Il limite di 90 giorni

Il confronto usa un valore a 32 bit, diviso in due parole a 16 bit. La soglia è 0x0076A700, cioè 7.776.000: i secondi di 90 giorni (90 × 86.400). Il testo scrive «A700 = 42572», ma in decimale A700 vale 42.752: è un refuso. Il programma ricava le date dai servizi DOS e converte l'anno in giorni complessivi.

Il comportamento distruttivo

Dopo la scadenza il programma cancella la DLL principale senza avviso. Il testo lo presenta come curiosità. Per chi studia software sconosciuto è anche un avvertimento pratico: va eseguito in un ambiente isolato, perché può danneggiare dati.

3. Secondo caso: scadenza, funzioni ridotte e sblocco

Il secondo prodotto è una suite di tre strumenti diagnostici scritta nell'agosto 1996. Il testo lo descrive con quattro proprietà: scade dopo 21 giorni (0x15), ha funzioni disattivate, è «ridotto» e può essere sbloccato con una chiave elettronica ricevuta dopo la registrazione. In questo caso la protezione non è nell'eseguibile principale ma in due DLL di supporto.

Il problema dell'orologio

Un controllo del tipo «oggi è dopo la data iniziale più 21 giorni» si elude riportando indietro l'orologio. L'autore descrive la contromisura: una posizione che può solo crescere, come un diodo. Se il programma rileva una data oltre il limite, segna la scadenza come definitiva. Tornare alla data reale non la cancella.

Dove viene ricordato lo stato

Secondo il testo, il programma distribuisce informazioni in tre luoghi: un file nascosto nella cartella di Windows, una riga nel file di configurazione di sistema e una voce nel registro. I valori hanno la forma di identificativi con un numero centrale che cambia nel tempo. È una tecnica di ridondanza: reinstallare il programma non basta, perché i resti precedenti indicano che la prova è già stata usata.

Come si arriva alla funzione di sblocco

Le tracce più utili non sono nelle stringhe del codice ma nelle risorse delle finestre. Uno strumento per le risorse mostra le finestre di dialogo, i loro pulsanti e gli identificatori numerici. Cercando lo stesso numero nel disassemblato si arriva al codice che legge la chiave inserita e al messaggio di conferma. Lo stesso metodo individua due versioni della finestra «Informazioni»: una per gli utenti registrati e una per chi usa la prova.

4. Il lavoro degli studenti

Dopo la lezione di +ORC, il documento riporta contributi della +HCU. Qui conviene separare ciò che mostrano come metodo dalle modifiche applicate.

L'esperimento sulla durata di 21 giorni non è del tutto concluso: gli studenti ammettono di non aver atteso tre settimane per essere certi di tutti i casi limite. È un'importante precisazione scientifica: un test breve con date simulate non dimostra ogni comportamento reale.

5. Il «punto cavo»: un'unica decisione

La parte più istruttiva è la conclusione dei due contributori. Dopo aver studiato file, registro e date, scoprono che molte strade convergono su un solo punto: una funzione restituisce un codice, e il programma decide se proseguire oppure mostrare un errore. Nel codice a 32 bit i valori diversi corrispondono a licenza scaduta, licenza modificata, copia senza licenza, versione vecchia o errore generico.

La struttura è efficace per chi progetta e per chi analizza:

Per un autore di software la lezione è opposta: l'intera funzione di verifica dipende da una scelta locale sul computer dell'utente. Una scadenza è difficile da rendere affidabile se la decisione finale, i dati e il codice stanno tutti sulla macchina controllata da chi dovrebbe essere limitato.

Il testo dice che quel punto è stato individuato grazie al suggerimento di +ORC sulla seconda occorrenza del numero 0x15, cioè 21. Il valore compare più volte, ma una soltanto accompagna la preparazione e il controllo della verifica. La spiegazione non basta però a stabilire che tutte le versioni del prodotto si comportino allo stesso modo.

6. Un altro schema: date in secondi

Alla fine compare un frammento incompleto, che +ORC lascia senza spiegazione. Mostra una sezione di configurazione con tre valori numerici: installazione, scadenza e ultimo utilizzo.

ValoreInterpretazione come data Unix (UTC)
8548245511 febbraio 1997
8574165513 marzo 1997
8548247171 febbraio 1997, 166 secondi dopo l'installazione

La differenza tra scadenza e installazione è 2.592.000 secondi, cioè 30 giorni (86.400 secondi al giorno). La lettura come data Unix è un'interpretazione coerente con i numeri, ma il testo non la dichiara. Il frammento resta un indizio, non una dimostrazione. Mostra comunque un'alternativa più semplice agli schemi nascosti: tutto l'intervallo concesso in un'unica sezione leggibile.

7. Lettura critica

8. Che cosa si impara per progettare meglio

Glossario

Shareware
Software distribuito per la prova, con acquisto o registrazione per l'uso completo.
Cinderella
Nome scherzoso per la scadenza dopo un periodo, come a mezzanotte nella fiaba.
Quiver
Protezione basata sul numero di utilizzi.
DLL
Libreria di codice caricata da un programma Windows.
Registro di sistema
Archivio di impostazioni di Windows.
Dead listing
Disassemblato letto su carta o a schermo senza eseguire il programma.
Data Unix
Secondi trascorsi dal 1 gennaio 1970 UTC.

Fonte e verifiche

Il testo è stato ricevuto in tre blocchi incollati dall'utente, non come file allegato; non è quindi disponibile come «ORC_4.DOC» nel mio archivio. Ho controllato i calcoli sulle soglie e sulle date. Non ho eseguito programmi né applicato modifiche.

Leggi il documento originale: ORC_4.DOC