Font Look
(quando i programmatori falliscono)


08-02-2000

by "syscalo"

 

 

UIC's Home Page

Published by Quequero

 

Buon tutorial per NewBies, che impareranno anche a muovere i primi passi col turbo debugger :)))

 
UIC's form
Home page: http://syscalo.cjb.net
E-mail: [email protected]
UIC's form

Difficoltà

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

 

Un programma di cui devo ancora capire l'utilità, visto che la prima cosa che ho cercato di fare è stata crackarlo ;) Comunque vi riporto una breve descrizione:

FontLook is a Windows 95/98/NT utility which enables you to display and print samples of your Windows fonts and to preview or install fonts from CD-ROM’s or other sources.

Vedete un po' voi se vi interessa.


Font Look
(quando i programmatori falliscono)
Written by syscalo

Introduzione

In questo tutorial vediamo di fregare in modo semplice e veloce un programma time-limit. Ne approfitterò per presentarvi alcuni tools utili che se non avete dovete assolutamente procurarvi.

Tools usati

- Regmon: programma per vedere a quali chiavi del registro accede un programma.
- WDasm: disassemblatore - anche se io preferisco Ida ho usato questo perchè è più semplice e visto che siete (siamo ;) agli inizi....
- Regedit: programma per modificare le chiavi del registro (fornito con win ;).
- Tasm 5 - vi serve solo il turbo debugger 32 per il momento: capirete dopo perchè ci è utile.
- HexWorkshop: editor esadecimale (va benissimo anche un altro).

URL o FTP del programma

Il programma è reperibile presso il sito: http://ourworld.compuserve.com/homepages/galcott

Notizie sul programma 

Vediamo un po' cosa vuole da noi questo programmillo: innanzitutto avviamolo.
Ecco un bel messaggio di benvenuto che ci dice che abbiamo di fronte un programma il cui funzionamento è limitato a 30 gg di prova, e gentilmente ci dice anche quanti giorni ci rimangono. Il programma però è una versione completa ed è possibile registrarlo inserendo l'apposito codice; vedere menu Help|Enter Registration Code. Bene noi non cercheremo il codice corretto (al massimo sarà per un altro tutorial per la UIC, e soprattutto a quando avrò più tempo) ma vedremo di fare in modo che il programma generi tutto ciò che gli serve per essere registrato.

Essay

Iniziamo: il programma molto probabilmente salva dei dati nel registro di windows; per controllare avviamo Regmon. Compare una schermata dove ci sono alcuni dati da sistemare; noi modifichiamo solo la voce Process Include(s) che indica i programmi che verranno monitorati: inserite fontlook e premete ok. Ora avviamo FontLook e andiamo a vedere cosa ci dice regmon. Quando avviate FontLook fermatevi alla message box iniziale (non premete ok) in quanto il programma qui deve avere già effettuato un check del tempo rimasto quindi è inutile proseguire. Passiamo a Regmon e vediamo che vengono aperte con successo (guardare nella colonna Result) le seguenti chiavi:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
HKEY_CURRENT_USER\Control Panel\Desktop
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Documents
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
HKEY_LOCAL_MACHINE\Software\RGB
Tra tutte queste è facilmente intuibile che è l'ultima ad essere quella "propria" di FontLook (visto che le altre sono tutte chiavi del sistema operativo)
Inoltre viene fatta una QueryValueEx (lettura del valore) di tre valori a dir poco sospetti:
Ver    ?
Reg    Probabilmete ;) conterrà il codice di avvenuta registrazione.
Start   Probabilmete contiene la data del primo avvio del programma per mantenere il conteggio dei giorni.
 
Se guardate la colonna Result il valore Reg non viene trovato, quindi vuol dire che verrà creato solo quando ci saremo registrati correttamente.
Proseguiamo; ora sappiamo cosa cerca il programma ma come fare per darglielo? Basta lasciare fare tutto a lui ;)
La soluzione è semplice: andiamo a cercare nel programma quel punto in cui deve decidere se il codice da noi inserito è giusto o meno e poi, forzando un solo jump, lo faremo autoregistrare!
Registriamoci: menù Help|Enter registration code, compare la message box; inseriamo un valore a caso 696969 e premiamo ok. Ecco un'altra message box che ci dice che il codice inserito è sbagliato (ma va?! ;-). Prendiamo nota di questo ultimo messaggio: "Incorrect registration key" e passimo all'attacco.
Disassembliamo il programma: aprite WDasm e selezionate Disassembler|Open file to disassemble ed andate a cercare il file fontlook.exe nella directory dove l'avete installato (aspettate che WDasm abbia finito). Ora menù Refs|String data references e scorrete la lista delle stringhe fino a che trovate "Incorrect registration key". Una volta trovata fate doppio click su essa e chiudete la finestra. Ora nel listato del programma troverete queste istruzioni:
 
:0045037F push 00000030    ;salta qui se il codice di registrazione è sbagliato

* Possible StringData Ref from Code Obj ->"Error"
|
:00450381 push 00450430

* Possible StringData Ref from Code Obj ->"Incorrect registration key"
|
:00450386 push 00450438    ;passa la stringa "Incorrect registration key"
:0045038B mov eax, ebx
:0045038D call 00421560
:00450392 push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:00450393 Call 004060F0    ;qui viene effettuata la chiamata alla visualizzazione della message box di codice errato
 
Ora risalendo poco più sopra troviamo le seguenti istruzioni:
 
* Possible StringData Ref from Code Obj ->"Success"
|
:0045033A push 004503E8

* Possible StringData Ref from Code Obj ->"You have been successfully registered."
|
:0045033F push 004503F0    ;passa la stringa "You have been successfully registered

:00450344 mov eax, ebx
:00450346 call 00421560
:0045034B push eax

* Reference To: user32.MessageBoxA, Ord:0000h
|
:0045034C Call 004060F0    ;qui viene effettuata la chiamate alla visualizzazione della message box di codice esatto
 
Visto che la parte di programma che visualizza la message box di registrazione corretta viene prima di quella di registrazione sbagliata dobbiamo ricercare il punto in cui viene effettuato il controllo per vedere se il codice inserito è sbagliato, e salta alla visualizzazione della mesage box corrispondente. Salendo ancora un po' nel codice troviamo le seguenti istruzioni:
 
:00450294 mov edx, dword ptr [ebp-08]
:00450297 pop eax
:00450298 call 00403CA8    ;in questa routine viene fatto il controllo del codice di registrazione inserito
:0045029D jne 0045037F    ;salta a visualizzare la message box registrazione sbagliata
:004502A3 mov dl, 01    ;prosegue con l'esecuzione del programma e visualizza la message box di registrazione corretta
 
Senza volerci addentrare nella routine di controllo del codice, possiamo facilmente intuire che ci saranno dei controlli che andranno a modificare il flag di zero; se vi state chiedendo perchè, bhe è semplice: l'istruzione successiva alla call è jne, che salta solo se il flag di zero è uguale a zero mentre non fa nulla se il flag di zero è uno.
Ora abbiamo due possibilità:
a- la più immediata è quella di andare a modificare il jump in modo che non salti mai, ad esempio sostituendolo con delle nop.
b- procedere con un debugger e modificare il flag di zero "in diretta" e fare in modo che il programma si autoregistri.
 
Le proviamo tutte due, ma siccome siamo stravaganti iniziamo con la b ;)
Ok aprite il vostro turbodebugger32, selezionate il file fontlook.exe e premete alt+F2; vi appare la finestra dei breakpoints e qui dovete inserire l'indirizzo 0045029Dh avendo cura di rispettare la forma richiesta dal debugger. Ora premete F9 (manda in esecuzione il programma) e in FontLook andate nella message box di inserimento del codice, scrivete un valore a caso (696969) e premete ok; tornate nel turbodebugger e vi troverete davanti il jne 0045037F. Andate nella finestra dei flag (tutta a destra) e clickate con il pulsante destro sulla lettera z (flag di zero) e selezionate toggle in modo che il suo valore passi da 0 a 1. Premete F9 e siete magicamente registrati!
Se andate a vedere nel registro di windows con il regedit ora nella chiave HKEY_LOCAL_MACHINE\Software\RGB trovate il valore Reg di tipo DWORD impostato a 7. Alla prossima installazione dovrete aggiungere solamente questo valore nel registro, senza ripetere tutte le operazioni descritte qui.
 
Passiamo all'attacco a:
Premessa: se avete già eseguito la scelta b andate nel registro di windows e cancellate il valore reg, altrimenti il programma sarà già registrato.
Ritorniamo per un momento al WDasm. Posizionatevi sull'istruzione jne 0045037F all'indirizzo 0045029D; ora guardate nella status bar del WDasm e trovate la scritta @Offset:0004F69Dh; bene questa scritta indica quale è l'offset di questa istruzione all'interno del file fontlook.exe. Ci serve ancora una cosa: l'opcode dell'istruzione per sapere quali byte dobbiamo sovrascrivere; per saperlo basta guardare il listato in WDasm:
 
:0045029D 0F85DC000000 jne 0045037F
 
quello in giallo è l'opcode dell'istruzione. Ora dobbiamo sostituire tutti questi byte con 90 (opcode dell'istruzione nop) quindi otterremo 909090909090.
Per fare materialmente la sostituzione aprite il file fontlook.exe con l'editor esadecimale, andate nel menù a Edit|Goto e nella casella offset inserite 4F69D e premete ok; se guardate i byte dove c'è il cursore vedrete esattamente l'opcode dell'istruzione; bene sostituitelo con i 90 e salvate le modifiche.
Non resta che ripetere la procedura di registrazione e il programma aggiungerà la chiave nel registro ed inoltre ci dirà già da subito che il codice da noi inserito (qualunque esso sia) è corretto.
 
Ehi, abbiamo terminato ;-) Ora possiamo dedicarci alle nostre ragazze, ognuno la sua è!-)
 
-=bye to all=-
syscalo

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 immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Forum       
Links   NewBies   News   Iscrizione   Lezioni       
Tools   Tutorial   Search   UIC Faq

UIC