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
-
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.
-
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.
Il programma
si può trovare sul sito http://www.winhacker.com.
-
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.
-
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
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.
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.