FontLook v 3.7
(troviamo il seriale per caso)

Data

by "-=Götterdämerung=-"

 

23/Giugno/2005

UIC's Home Page

Published by Quequero

 

Bravo Gotter, continua cosi mi raccomando... E basati di meno sul fato! :P

 

 

E-mail: [email protected]
Gotterdamerung su irc.azzurra.net #crack-it

 

Difficolt�

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

 

Introduzione

Imparando a reversare mi sono imbattuto nel tutorial di syscalo, ma mi sono accorto che la nuova versione di FontLook non funziona proprio allo stesso modo. Vediamo allora come pescare il seriale dal codice e crearci un file di registro per la registrazione del programma e poi anche reversarlo.

Tools usati

Regmon
Regedit: Questo lo avete tutti ;)
OllyDBG

URL o FTP del programma

Il programma � reperibile presso il sito: http://www.galcott.com/

Essay

Come base per questo tutorial potete anche dare un'occhiata a quello originale di syscalo che trovate nella pagina dei tutorial per niubbi (è il sesto).
Facciamo partire il programma e notiamo che il tempo di valutazione è di 15 giorni... mmmh, lo hanno dimezzato dopo aver letto il tute di syscalo? :)
Se non altro sappiamo che prima di partire fa ancora il controllo dei giorni... bene allora chiudiamo tutto e apriamo Regmon filtrando solo 'fontlook'.... UAZZ quanta roba! Cercando tra le ultime righe possiamo vedere che vengono fatte tre query in fila sulle chiavi HKCU\Software\RGB\Reg, \Ver e \Start, e la chiave Reg da come risultato NOT FOUND!
Bene bene, se ne deduce che la chiave verrà trovata quando ci registreremo...

Seguendo il tute di syscalo, ci diceva di disassemblare il programma con Wdasm e di cercare le SDR (String Data References)... bene, facciamolo, ma... le SDR non ci sono! Forse dico una cavolata, ma credo che il programma sia stato packato o crittato...

Proviamo allora a usare OllyDBG, lanciamo Olly e apriamo fontlook... mmmh avevo ragione allora! Sembra che il codice sia compresso o crittato...
Niente da fare, lasciamo stare l'analisi del programma e proviamo ad aprirlo indipendentemente, facciamo doppio click sull'icona e comparirà il solito messaggino che ci avvisa che mancano xx giorni ecc..., continuiamo e andiamo nel menù Help -> Enter registration Code e inseriamo un codice a caso, premiamo 'OK' e popperà la solita finestrella che ci avverte che abbiamo sbagliato seriale; a questo punto riapriamo il nostro Olly, andiamo nel menù File -> Attach, selezioniamo dalla lista il programma fontlook e pigiamo sul tasto attach.
Perfetto! Adesso siamo dentro al programma decompresso (perché è in esecuzione), apriamo la command line (attenzione! per usare questo comando è necessario avere la Qcmdline! La trovate con tutti gli altri tools) e scriviamo bpx MessageBoxA [invio], che serve a far riprendere il controllo al debugger quando apparirà la finestrella, tramite un breakpoint on execution (bpx appunto).
Bene, adesso premiamo F9 per far ripartire il programma e proviamo ad inserire un altro codice, il mio, in questo caso, sarà 'Gotter'.

Diamo l'OK e... TaDaaa! Ecco che ci poppa l'Olly, notiamo che siamo nel modulo USER32, e non in fontlook perché abbiamo settato il bpx su una funzione del sistema, ma guardiamo cosa c'è nella finestra dello stack in basso a destra?

 
...
0012F2B4 004AC5A7 /CALL to MessageBoxA from fontlook.004AC5A2 <= noi veniamo da qui!
0012F2B8 0022089A |hOwner = 0022089A ('Register',class='TfrmRegister',parent=13430800)
0012F2BC 004AC650 |Text = "Incorrect registration key"
0012F2C0 004AC648 |Title = "Error"
0012F2C4 00000030 \Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0012F2C8 0012F77C Pointer to next SEH record
0012F2CC 004AC5D7 SE handler
0012F2D0 0012F2F8
0012F2D4 009FD698
0012F2D8 009FD698
0012F2DC 00000000
0012F2E0 00000000
0012F2E4 00000000
0012F2E8 009FD934 ASCII "5447213" ==> ???
0012F2EC 009FBF8C ASCII "Gotter" \
0012F2F0 009FD90C ASCII "Gotter" |==> la chiave inserita
0012F2F4 009FD920 ASCII "GOTTER" /
...
In questa MessageBox il prog ci dice che abbiamo inserito la chiave sbagliata... poco più in basso nello stack (anche se in realtà sarebbe più in alto:)) troviamo la password da noi immessa scritta proprio da tutte le parti!... ma... cosa diavolo è quella cifra scritta sopra la chiave? Vuoi vedere che...
Ebbene si... quella cifra è proprio la chiave di registrazione... provare per credere :�(
Non avrei voluto trovarla in questo modo (veramente stavo cercando il jump condizionale...) comunque potete notare che funziona.

Bene, adesso che siamo registrati andiamo a guardare nel registro di sistema e vediamo con piacere che finalmente il valore HKCU\Software\RGB\Reg è stato settato e per la precizione è settato a 7.
La prossima volta che installeremo il programma sarà sufficiente aggiungere questa chiave di registro dal regedit. Come? Beh, potreste aprire il registro da Start -> Esegui -> regedit e inserirla a mano, oppure crearvi un nuovo file di testo con all'interno questo testo:
 
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\SOFTWARE\RGB]
"Reg"=dword:00000007
Chiudete il file di testo, salvandolo, e rinominatelo 'comevipare.reg'; a questo punto facendo doppio click sul file appena creato aggiungerete automaticamente le informazioni al registro di sistema! (basta rispondere 'si' quando ve lo chiede :))

Certo, però adesso andiamo a cercarci quando questo codice viene confrontato con quello inserito da noi! Bene, segnatevi quindi l'indirizzo da cui arriviamo (fontlook.004AC5A2) che però è nel modulo fontlook, facciamo quindi un click destro sulla finestra del debugger e selezioniamo 'view -> module 'fontlook'', quindi andiamo a ricercare il punto da cui siamo venuti e ci troveremo davanti a qualcosa di simile:
 
...
004AC58E PUSH 30
004AC590 PUSH fontlook.004AC648 ; ASCII "Error"
004AC595 PUSH fontlook.004AC650 ; ASCII "Incorrect registration key"
004AC59A MOV EAX,EBX
004AC59C CALL fontlook.00437D0C
004AC5A1 PUSH EAX
004AC5A2 CALL fontlook.0040778C ; JMP to USER32.MessageBoxA <= noi arriviamo qui
...
Ottimo! Questa è proprio la procedura in cui il programma ci dice che abbiamo sbagliato seriale (ho tolto gli opcode per migliorare la leggibilità), direi che qui vicino ci dovrebbe essere anche quella che ci avvisa del seriale corretto... e infatti la troviamo poco più sopra (i commenti di Olly sono MITICI!).
Bene, a questo punto cerchiamo nel codice un jump condizionale che ci porti all'indirizzo 004AC58E ovvero quello che genera la famigerata "beggar off" ovvero la finestrella cattiva con il messaggio di errore, e lo troviamo qualche decina di righe sopra:
 
...
004AC4A7 CALL fontlook.00404060
004AC4AC JNZ fontlook.004AC58E ; <= ecco il jump condizionale
...
Ora che abbiamo trovato il punto cruciale possiamo cambiare il flag z (Zero flag) durante l'esecuzione del programma, in modo da far credere al programma che il seriale da noi inserito sia giusto.

Vediamo come si fa: settiamo un breakpoint all'indirizzo 004AC4AC semplicemente facendo doppio click sugli opcode (dovrebbero diventare a sfondo rosso), premiamo F9 per far ripartire il programma, rifacciamo la procedura di registrazione e... tac! nel momento in cui premiamo OK ci troveremo proprio nella riga incriminata; a questo punto nella finestra dei registri (in alto a destra) cercate il flag z e fate doppio click sul suo valore, in modo da cambiarlo da 0 a 1.
Da questo punto andremo dritti dritti verso la MessageBox che ci avvisa dell'avvenuta registrazione! Infatti procedendo nel codice si arriva alla registrazione, mentre effettuando il salto si salta (per l'appunto) la procedura "giusta" e si va dritti verso la beggar off. Pigiate F9 (due volte se non avete disabilitato il vecchio breakpoint su MessageBoxA) e tornate a fontlook giusto per vedere il messaggio di registrazione.

Notate che il jump in questo caso non si trova dopo un confronto, ma dopo una chiamata a una subroutine... a occhio e croce è in questa funzione che viene verificato il codice, infatti settando un breakpoint all'indirizzo 004AC4A7 trovereste nel registro EAX il codice da voi inserito e nel registro EDX il codice corretto; all'interno della routine viene poi fatto il confronto dei due (quindi un altro modo per saltare la protezione è modificare il jump all'interno della routine, settate un breakpoint all'indirizzo della CALL, steppate dentro la routine con F7 e provateci!) e successivamente viene effettuato, o no, il salto a seconda del valore che il flag zero assume.

Fine! Avete registrato questo inutile programmillo... siete contenti?
                                                                                                                

See ya on the last days...
-=Götterdämerung=-


Note finali

Wow il mio primo tutorial... non so cosa dire, grazie a Quequero e alla UIC che mi hanno permesso di arrivare a questo punto, e un consiglio a tutti coloro che hanno cominciato da poco: non mollate!!

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento � stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo che ogni sviluppatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly.