Archivio storico · Reverse engineering · Spiegazione dettagliata

Lezione 9.1: le schermate di avviso

Come un programma di prova ricorda di registrarsi, come cambia la schermata da una versione all'altra e perché una finestra non è una vera protezione.

In breve

La lezione 9.1 riguarda le schermate di avviso (nag screen): le finestre con cui un programma di prova ricorda di registrarsi. L'esempio è Paint Shop Pro, seguito attraverso quattro generazioni. L'idea didattica è l'«embriologia del software»: studiare le versioni vecchie per capire come si è evoluta la protezione e riconoscere gli stessi schemi nelle nuove.

Il testo contiene modifiche precise per eliminare la schermata. Non le riporto, né come byte né come indirizzi. Spiego il metodo di analisi, che cosa mostra sulla progettazione e dove l'autore semplifica.

1. Le quattro generazioni

VersioneDimensioneData indicataNovità
2.0 / 2.01525.520 byte15 novembre 1993Schermata statica
3.0861.856 byte4 marzo 1995Conteggio dei giorni
3.12-32 (Windows 3.1)1.042.944 byte27 dicembre 1995OK attivato in ritardo
4.1 (Windows 95)circa 1,15 milioni di byte1 settembre 1996Adattamento a Windows 95

Il testo non è del tutto coerente: l'elenco iniziale attribuisce la versione 3.0 al 1994, il paragrafo successivo al marzo 1995, e scrive «3.2-32» invece di «3.12-32». Sono probabili refusi.

L'autore nota che questa schermata era poco invadente e che i patch noti all'epoca si limitavano a simulare il clic su OK, senza eliminarla.

2. Tre modi di individuare la finestra

  1. Partire dai controlli. Si elencano le finestre del programma e si trova quella con i pulsanti OK e Annulla. È il metodo usato per le password, ma l'autore lo giudica poco adatto agli avvisi.
  2. Partire dal testo mostrato. Si osserva dove le frasi vengono copiate in memoria. Dopo l'avvio compaiono in molti punti perché il sistema le copia più volte: la maggior parte delle occorrenze è una copia intermedia.
  3. Partire dalla creazione della finestra. Ogni finestra nasce da una funzione del sistema. Contando le chiamate si arriva all'ultima prima dell'avviso, e la traccia indica quale parte del programma l'ha richiesta.

Il testo cita anche la funzione che mostra una finestra; la documentazione Microsoft di ShowWindow la descrive come quella che imposta lo stato di visualizzazione.

3. Il ragionamento sulle dimensioni dei blocchi

Per scegliere dove cercare, l'autore confronta i blocchi di codice. Uno di soli 160 byte è troppo piccolo per contenere uno schema; altri due compaiono nella traccia con intervalli minimi; ne resta uno di circa 15.000 byte. Poi osserva che la protezione sta vicino alla chiamata trovata, quindi bastano pochi byte da esaminare.

È un'euristica: la piccola dimensione rende improbabile, non impossibile, che un blocco contenga una decisione importante.

Cosa fa il frammento

Il codice recupera la finestra, la rende visibile, salva un valore, prepara cinque parametri e chiama la routine che apre la finestra di dialogo. Prima c'è un controllo condizionale che può saltare la visualizzazione. L'intera schermata dipende quindi da una decisione locale. Questo è il punto debole di molte schermate: un solo confronto separa «mostra» da «non mostrare».

Il testo indica poi come cambiare quel confronto. Non lo riporto.

4. Dalle versioni vecchie a quelle nuove

La parte più istruttiva riguarda la versione 3.0. L'autore sostiene che, poiché lo schema non è cambiato, basta cercare un breve schema di istruzioni analogo e verificare quale occorrenza sia quella giusta. La ricerca restituisce tre risultati. I primi due sono copie dello stesso codice, che controlla se la finestra è ridotta a icona e non c'entra con l'avviso. Solo il terzo è seguito da una sequenza di operazioni simile a quella della versione precedente.

Perché usare una stringa corta

L'autore spiega che una sequenza più lunga non avrebbe trovato nulla, perché i programmi per Windows contengono indirizzi che vengono modificati al caricamento (rilocazioni). Conviene quindi scegliere sequenze senza indirizzi variabili. È corretto in linea di principio: una ricerca che include parti rilocate può non coincidere con i byte del file.

Il metodo ha un costo: una ricerca breve produce molti candidati, da distinguere guardando il contesto. Nella nuova versione, aggiunge, il cambiamento richiede un byte in più perché è stata inserita un'istruzione.

5. Le versioni a 32 bit

Per la versione 3.12-32 il metodo precedente non funziona: il punto di arresto sulla creazione delle finestre scatta una sola volta e non produce una traccia utile, e il debugger non mostra la struttura della memoria del programma. Il motivo, secondo il testo, è che il programma è a 32 bit e il debugger per Windows 3.1 ha limiti con questo tipo di applicazioni. L'autore rinvia alla lezione successiva, con un debugger per Windows 95, e afferma che anche le versioni 3.12-32 e 4.1 hanno lo stesso schema, con un pulsante OK attivato in ritardo e alcune routine aggiunte in mezzo.

Quella lezione non l'ho vista, quindi non posso valutare l'affermazione.

6. Opinioni e digressioni

Il testo si chiude con l'invito, già visto nelle altre lezioni, a scrivere via un indirizzo anonimo per ricevere le lezioni mancanti.

7. Cosa impara chi progetta software

Glossario

Nag screen
Finestra che invita a registrare un programma di prova.
Rilocazione
Correzione degli indirizzi di un programma quando viene caricato in memoria.
Embriologia del software
Studio delle versioni precedenti per capire l'evoluzione di una funzione.
Euristica
Regola pratica che aiuta a decidere ma non garantisce il risultato.

Fonti e verifiche

Il testo è stato incollato dall'utente e non risulta allegato; l'ho trattato come lezione 9.1 perché l'utente ha indicato così il documento. Ho controllato date e dimensioni citate, ma non ho eseguito programmi né applicato modifiche. Per la funzione che mostra una finestra ho consultato la documentazione Microsoft.

Leggi il documento originale: ORC_9_1.DOC