Recuperare un seriale senza curarsi (o quasi) del codice Assembly
ovvero una protezione eccezionalmente debole

Data

by "Stargate"

 

6 Giugno 2004

UIC's Home Page

Published by Quequero


Nulla è troppo meraviglioso

Lol ma come l'hai ribeccato winhacker? ;pppp Grazie mille Star.

per essere vero.
Michael Faraday

 

....

E-mail: [email protected]

....

Difficoltà

(*)NewBies ( )Intermedio ( )Avanzato ( )Master

 

    In questo mio tutorial esamineremo la possibilità di recuperare un numero seriale valido per la registrazione di una applicazione senza troppo sporcarci le mani con il codice Assembly. Questo sarà possibile grazie alla eccezionale debolezza della protezione.


Recuperare un seriale senza curarsi (o quasi) del codice Assembly
ovvero una protezione eccezionalmente debole

Scritto da Stargate

Introduzione
    Fa sempre bene andarsi a leggere i vecchi tutorial, lo consiglio a tutti. Si scoprono un sacco di cose interessanti (specialmente per chi, come me, si adagia comodamente sulla definizione di principiante) e si trovano un sacco di spunti. Per esempio, girottolando per il sito di Fravia mi sono soffermato sulla sezione "Most stupid protection", ovvero le protezioni più stupide. Scopro un programma che ha persino vinto questa speciale competizione nel 1997.  Quel programma era WinHacker 95. Siccome sono un tipo curioso, prima di tutto mi sono chiesto: "Chissà se in tutti questi anni hanno un po' aggiornato lo schema!". Sapete come dice il proverbio, no? "Errare humanum est, perseverare diabolicum".

    Ebbene, come scoprirete leggendo, c'è chi persevera: lo schema è rimasto eccezionalmente debole; non so se sia lo stesso di allora perché ancora non ho letto il tutorial di iNCuBuS++ in cui lo si spiegava. Prima ho pensato di giocarci un po' da solo, per vedere se ne cavavo qualcosa. Quando il mio tutorial sarà finito mi andrò a leggere la spiegazione di iNCuBuS++.
    Quando ho iniziato l'esame del codice sono rimasto deluso a causa della mancanza dell'utilizzo delle API classiche, come vedremo fra poco. Ma siccome credo di aver impiegato in totale non più di dieci minuti per scoprire il seriale giusto mi sembrava giusto scrivere qualcosa per mostrare un esempio in cui, senza immergersi nel vivo del codice (in tutto il tutorial c'è una sola riga di assembly) ma sfruttando solo un po' l'occhio si poteva risolvere il problema facilmente. Il mio scopo è, infatti, mostrare come sfruttare le potenzialità del nostro OllyDbg con un pizzico di furbizia.
    Oltre a questo mi propongo di dare una piccola motivazione in più a chi, come me, non può competere con gli esperti della UIC ma non rinuncia a compiere piccoli passi e a divertirsi ugualmente con protezioni veramente semplici come questa.
    Spero che il mio editore, Quequero, capisca le mie intenzioni.
Strumenti utilizzati
    Per tutte le nostre operazioni useremo soltanto OllyDbg. Per dare una occhiata al file di registro di Windows potete utilzzare il programma di sistema Regedit.exe, ma come vedrete, ne potrete anche fare a meno.
URL del programma

    Il programma si può trovare sul sito http://www.winhacker.com.
 
Notizie sul programma
    Cito direttamente dalla guida, traducendo liberamente dall'inglese.

    "WinHacker 95 2.0. è un programma di utilità da utilizzare per configurare le opzioni nascoste di Windows 95 e Windows NT 4.0. WinHacker 95 è IL vero utensile per la gestione di Windows.
    Molte impostazioni per modificare il modo in cui Windows 95 agisce sono nascoste nel registro o in file di
configurazione. WinHacker 95 ti fornisce un modo per configurare tutte queste opzioni attraverso l'Interfaccia Grafica Utente."
    Come vedete non c'entra assolutamente nulla con gli Hacker. A mio modesto parere il nome gli è stato
imposto un po' a sproposito.
Saggio
    Avviate OllyDbg e caricate l'eseguibile winh95.exe. Come potrete osservare, l'eseguibile viene interpretato immediatamente senza alcun tipo di problema. Questa è sicuramente una buona notizia, in quanto non dovremo lambiccarci il cervello con diavolerie strane quali spacchettamenti e decriptazioni.

A questo punto possiamo far partire l'eseguibile sotto il controllo di OllyDbg tramite il tasto F9. Vi apparirà una finestra dal titolo "WinHacker Registration Information" in cui, al solito, dovremo inserire le informazioni di registrazione: il Nome (Name) con cui ci registriamo, la nostra società (Company) e, dulcis in fundo, il numero seriale (Serial Number). Proseguiamo senza indugio e riempiamo i campi con quanto richiesto. Per esempio, io ho inserito come nome "Stargate" (senza le virgolette, ovviamente), come società "Galaxy" e come numero seriale "1234567890".
   Prima di premere il tasto "Register", dobbiamo impostare qualche trappola (breakpoint) in cui far cadere
l'esecuzione per poter capire qualcosa del meccanismo di protezione. Poiché ci siamo posti come obiettivo la
cattura del numero seriale direi di iniziare con le trappole più classiche, quelle sulle chiamate alle API
GetDlgItemTextA e GetWindowTextA. Possiamo impostarle tramite il comando "bpx GetDlgItemTextA" e "bpx
GetWindowTextA", da digitare nella finestra "Command Line" di OllyDbg (se la finestra non fosse visibile
richiamatela attraverso Alt+F1). A questo punto premiamo il tasto "Register", ricevendo così una cattiva
sorpresa: la trappola non scatta, appare una finestra per avvertirci di aver inserito un numero seriale errato e, pertanto, siamo punto a capo. Peccato! State pensando anche voi che, forse, dovremo ingegnarci un po' di più? Proviamo un altro metodo di attacco classico: una bella trappola sulla funzione "MessageBoxA".         Niente da fare, come potrete vedere consultando la finestra "Breakpoints" (Alt+B) anche in questo caso nessuna trappola è stata preparata perché questa funzione non viene chiamata dal programma. Uffa! E ora?
    Inventiamoci qualcosa. Intanto osserviamo la finestra che ci avverte di aver inserito un seriale scorretto.
Inizia con bel "Invalid Serial Number!". Grazie tante, se il seriale era valido non stavo qua! Però questa stringa sarà pure memorizzata da qualche parte...
    Ritorniamo sulla finestra di OllyDbg e, attraverso il tasto destro del nostro topo (o comunque un tasto destro, io ho un attempato portatile IBM, un PentiumII, dove non c'è né il topo né quell'altro aggeggio malefico, come si chiama, il "touchpad", un vero toccasana...) facciamo comparire il menù contestuale. Selezionamo "Search for" e poi "All referenced strings". Nella finestra che compare, con un po' di pazienza, troverete la stringa che cercate indicata all'indirizzo 00412DE5: dare una occhiata all'intero elenco non fa mai male ma, nel caso aveste fretta di raggiungere lo scopo, potrete cercare, sempre nel menù contestuale di questa finestra "Search for text", immettere "invalid", assicurarvi che l'opzione "Case sensitive" non sia selezionata mentre "Entire scope" lo sia, premere "OK" e poi, eventualmente, CTRL+L fino a che non trovate "Invalid Serial Number!". Finalmente abbiamo trovato la nostra bella stringa, vediamo se ora troviamo anche la scarpa...
    Mettiamo una bella trappola proprio su questa stringa, selezionando la riga corrispondente nella finestra "Text string etc." e premendo, al solito, F2. Se ora premiamo "Register" la trappola scatta, eccome!
    Piccola digressione filosofica. Conoscere tutto del linguaggio Assembly e dei metodi di protezione più
incasinati è sicuramente una bella cosa, ed è per questo che ammiro quelli della UIC: perché io, invece, non ne so un tubo! Ma alle volte serve anche un po' di furbizia; qualcuno della UIC mi dirà: "Serve un po' di culo". Mi sembra giusto, ma per prendere le occasioni al volo bisogna sempre guardarsi intorno. E questo è precisamente il caso.
    Provate a guardare il registro EDX; non vi dice niente un bel ASCII 2d28-34cf65? Non assomiglia proprio ad un seriale? Non mi dire che era così facile! Per saperlo non avete che da sostituire il seriale errato con questo e provare. Ma supponiamo di non farlo, anche perché se fosse quello giusto l'applicazione si registra e festa finita.
    Continuiamo, invece, in quella che chiamerei "osservazione cieca", cioè osservazione di OllyDbg fregandosene completamente dell'Assembly. I puristi mi perdoneranno ma il mio scopo è di mostrare come alle volte anche uno alle prime armi (assai prime...) possa combinare qualcosa di buono, specialmente se il programmatore che ha composto la protezione non fosse in vena di rompicapi sfingici.
    Risaliamo un po' nella finestra del codice, poco più di una decina di righe, per trovare una funzione dal nome quasi familiare: _mbscmp. Non sembra simile alla funzione standard del C strcmp? Magari confronta il seriale giusto con quello che abbiamo inserito noi.
    Mettiamo allora una bella trappola subito prima della chiamata a _mbscmp, che so all'indirizzo 412D79. Poi
premiamo il solito "Register". Siamo alla riga di cui sopra. Come si vede indicato in OllyDbg, questa funzione prende due parametri, s1 ed s2: s2 è il seriale inserito da noi (si può osservarlo premendo F8 ed eseguendo il codice passo passo) mentre s1 è il seriale giusto. Se ora osserviamo il codice seguente vediamo un salto che, una volta preso, ci spedisce alla finestra di errore (via, una righina sola di codice la posso mettere...):

00412D97   JNZ SHORT wh95.00412DD7

Ci convinciamo sempre di più della nostra ipotesi iniziale, vero? Magari si potrebbe provare a lavorare un
pochetto su questo salto per vedere se le nostre idee si guadagnano qualche conferma. Invece andiamo oltre.
    Prima di provare ad inserire il presunto numero seriale, facciamo qualche altro ragionamento "a scatola
chiusa". Per esempio, il numero seriale sarà fisso oppure dipenderà dagli altri parametri inseriti? Proviamo a
cambiare "Company" e vedere quello che succede. Ebbene, il seriale dipende da cosa inseriamo come "Company". Ovviamente dipenderà anche dal nome, come si può facilmente verificare modificandolo e leggendo, al solito, il valore giusto in EDX al momento della trappola. In conclusione, il numero seriale dipende dalla combinazione Nome + Società, però resta sempre della forma xxxx-xxxxxx (o almeno così mi sembra).
    A questo punto direi che possiamo provare ad inserire il seriale letto in EDX. Ce lo copiamo da OllyDbg nella finestrella, premiamo "Register" e... accidenti! (a dire il vero nel mio dialetto si direbbe in un modo un po' differente... magari un giorno ve lo dico ché vi divertirà sicuramente), siamo belli e registrati. Allora avevamo ragione, la protezione di questo programma è proprio scarsa e noi siamo stati, oltretutto, furbi quanto basta per sistemarla!
    Abbiamo finito? Mah, se il nostro scopo era scoprire il seriale e basta direi proprio di si, ed in effetti il mio
scopo era esattamente quello. In realtà, si potrebbe fare ancora molto: ad esempio si potrebbe cercare di capire l'algoritmo con cui il seriale viene creato e poi divertirsi a scrivere un generatore (ma io non lo so fare, ve l'ho detto che sono scarso!); oppure si potrebbe provare a studiare quel salto accennato sopra. Insomma, il limite stà nella fantasia. Inoltre è interessante studiare i dettagli di un problema già risolto. Anzi, sapete che vi dico? Se qualcuno alle prime armi come me prova queste e altre strade me lo faccia sapere, scriva in "Mailing List" o, meglio, a me personalmente ed io aggiorno il mio tutorial. Come ho detto, sviscerare un problema risolto aiuta, specialmente chi è ancora alle prime armi.
    Per concludere, nel caso siate registrati e vogliate ricominciare a sperimentare, basta che cancelliate la
seguente voce dal registro di Windows (nel mio caso NT, ma suppongo che anche negli altri casi sia lo stesso):

My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wedge Software\WinHacker 95\Data

e tornerete immediatamente nel periodo di prova.

                                                                                                                      Stargate

Note finali

   Come abbiamo avuto occasione di vedere siamo riusciti in quattro e quattr'otto a rimediare il seriale
desiderato senza impazzire col codice. Con una buona dose di fortuna ed un pochino di occhio qualche volta
riesce, specialmente se il programmatore che ha costruito il sistema di protezione è altrettanto "principiante" in questo campo come io lo sono nell'ingegneria informatica inversa.
    Se avete commenti, annotazioni e altri punti di vista sugli argomenti trattati in questo tutorial siete invitati a scrivermi all'indirizzo riportato in alto. In particolare sono benvenute ulteriori spiegazioni sull'algoritmo che calcola il seriale o ragionamenti indipendenti per raggiungere il medesimo risultato: il reperimento del numero "magico" (che poi "numero" proprio non è).
    Prima di lasciarvi vorrei cogliere l'occasione di ringraziare il mio editore, Quequero, per aver creato il sito della UIC (che non è l'Ufficio Italiano Cambi...). Perdonate anche la mio essere un po' prolisso e la mia mania di non usare termini tecnici in inglese: sebbene vi possa assicurare di sapere l'inglese assai bene sono innamorato della nostra lingua che, troppe volte, ogni giorno, viene maltrattata. Alla prossima.
 
Disclaimer

Vorrei ricordarvi che il software va comprato e non rubato. Pertanto dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro elaboratore
determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il
consumatore a registrare legalmente i propri programmi, e non per incrementare il suo uso dei tantissimi "file crack" presenti in rete. Questo documento serve anche per aiutare la comprensione dello sforzo immane che ogni singolo programmatore ha dovuto affrontare per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e per il miglioramento del linguaggio Assembly.