Corso UIC Newbies 03
From UIC
Corso UIC Newbies 3
Contents |
| Infos | |
|---|---|
| Author: | Quequero |
| Email: | |
| Website: | http://www.quequero.org |
| Date: | 11/01/2000 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Crackiamo un target davvero semplicissimo |
Bene, entriamo nei meandri del cracking ed iniziamo a capire come funionano le più semplici protezioni!
Introduction
Il target in questione sarà HighGrow, un programma che ci permetterà di coltivare virtualmente delle graziosissime piantine di Marjiuana :)
Tools
Link e Riferimenti
Questo è il Corso UIC Newbies n°03 disponibile alla pagina Corsi UIC Newbies
Essay
Prelevate questo graziosissimo programma dal link (800kb appena) ed installatelo :)).....Seminate un paio di semetti, chiudete il programma, riavviatelo ed ecco che avrete
vi popperà in faccia una schermata come questa:
![]()
bene, bene, in questa schermata vediamo le piante che abbiamo seminato con i loro rispettivi nomi ed i giorni rimasti.....Ecco il primo problema...le nostre piantine se non
registriamo il programma moriranno in 100 giorni...e ciò è male :)), clickiamo quindi su "Registration Code Entry" ed un box popperà:

Il programma ci chiede di inserire nella prima riga un codice...E nella secona un nome.....Ma come sarà tale codice, fisso? Calcolato in base al nome? In base a
qualcos'altro??? Per saperlo dobbiamo disassemblare il programma e scoprirlo...Ma prima di muoverci premiamo il pulsante "Register HighGrow" e vediamo cosa
succede....

Bene, una bella messagebox ci avvisa che il programma ha ricevuto un codice che non era valido...quindi apriamo il W32DASM, disassembliamo il file....una volta fatto
clickate qui:

vi apparirà un box nel quale dovrete cercare la stringa che vi riportava il messagebox del programma, cioè: "Invalid Registration Code Entered !!":

fateci un doppio click sopra ed arriverete esattamente qui:

allora, notate in rosso la strina alla quale siamo interessati, ma per capire da dove proviene dobbiamo fare quello che è chiamato BackTrace, cioè tracciare all'indietro, a
questo scopo ho evidenziato con una freccia blu il salto che porta a questa parte di codice....Mi spiego: dalla stringa appena trovata guardate un po' più in alto fino a trovare
"Referenced by a (U)nconditional or (C)onditional Jump at Address", ciò vuol dire che il programma arriva a quella parte di codice tramite un salto condizionale che si
trova all'indirizzo: 00407EFB....Quindi nel codice troviamo questo indirizzo che in realtà sta qualche riga sopra...e notiamo subito una chiamata "Call 00407E60" ed un "test eax, eax" ciò significa che il programma decide se il codice è esatto probabilmente tramite il valore riportato in eax da quella chiamata...e dal codice del
disassemblato capiamo che se eax contine un valore diverso da zero allora il codice è esatto altrimenti è errato....Ma continuiamo col nostro backtrace:

il codice è quello di prima...ma in alto vediamo "Referenced by a CALL ar Address: 0040811D", vuol dire che il programma arriva a questa parte di codice tramite una
chiamata all'indirizzo 0040811D, clickiamo sul terzo pulsante in alto (quello del "trova") ed inseriamo 0040811D.....da lì risaliamo e risaliamo ancora o se non vi va di
tracciare all'indietro (anche se dovete imparare perchè in alcuni casi non potrete far altro) potete cercare nel box di prima una stringa che ci ringrazi della
registrazione...Questa potrebbe essere qualcosa come "Thanks for registering" "Thanks for supporting us" ecc...in generale cerca un qualche "Thanks....".....Aprite il box di
prima....e cercate, cercate...:

bene, in genere si usa fare una cosa molto utile, cioè si traccia all'indietro e si va a vedere dove si finisce....E poi si trova una stringa e si vede se è quella che dovrebbe
apparire, se tutto combacia siamo sulla buona strada...E allora noi andiamo bene:
![]()
ma ora che ci troviamo qui cosa facciamo???? Sicuramente dobbiamo trovarci la routine che vede se il seriale è esatto...o meno, quindi cerchiamo la reference a
"00407F70"....e da li risaliamo fino a:

bene, bene....Questa parte di codice ci può interessare perchè sembra il punto dove viene deciso se il serial è esatto o meno, ci servirebbe però un approccio "live" sul
codice per vedere cosa succede....Ma come si arriva dove vogliamo noi??? Ve lo dico subito.....La parte dalla quale ci interessa iniziare è all'indirizzo 00407F47....quindi,
chiudete fate riapparire il box che ci consentiva di inserire il serial...ed inserite "666111666" e "Quequero" o il vostro nick....Quindi entrate in softice (ctrl+d) e scrivete
"bpx messageboxa", in pratica abbiamo messo un breakpoint sulla funzione che fa apparire il messagebox che ci dice che il codice è errato.....Clickate sul pulsante di
registrazione e vedrete che sice popperà, premete F11, a questo punto sarete fuori da sice, clickate il pulsante okkei del messagebox e tornerete in sice....Qual'era la riga
che ci interessava?? 00407F47??? Guardate allora un po' più giu di dove siete arrivati in softice e troverte proprio quella riga...Scrivete quindi "bc*" per cancellare tutti i
breakpoint e poi fate doppio click su quella riga per metterne uno nuovo...Uscite da softice e riclickate sul pulsante di registrazione....come per magia NON arriverete sulla
riga che ci interessa :)))....Come perchèèèèè!!!! Allora, non siete stati attenti.... Riguardatevi questo pezzetto di codice:

vedete in alto una chiamata a SendDlgItemMessageA......e poi un "cmp eax, F" con un conseguente salto...se il salto fallisce il programma neanche esamina il codice.....se
il salto va a buon fine il programma è felice di esaminare il codice inserito...ciò vuol dire che con la chiamata a SendDlgItemMessageA il programma cerca un serial in una
particolare forma che potrà essere: XXXX-XXXX-XXXX o XX-XXXXX-XXX o ancora XXXXX-XX-XXXX....Solo che noi non lo sappiamo cosa vuole, quindi
rimettete un breakpoint su MessageBoxA, e con la stessa tecnica di prima invece di brekkare solo su 00407F47, clickate anche su 00407F1A...Riavviate il tutto e quando
sice poppa su quel punto voi scrivete "r fl z" in questo modo invertirete il flag Z che non farà fallire il salto....e arriverete alla routine che ci interessa....Ve la ripasto:

purtroppo non posso stamparvi quello che vedo in softice perchè non ho una telecamera digitale... cmq una volta arrivati all'indirizzo 00407F47 troverete queste istruzioni:
analizzeremo passo passo tutta la routine....scrivete in sice "d 0041E468" e vedrete apparire il numero appena inserito, nel mio caso: 666111666, steppate con F10 due volte fino a PASSARE questa istruzione:
scrivete "d 41E0E8" e vedrete un numero: 385-9015453-728 continuate....
questa istruzione muove un byte in CL...Dunque, come abbiamo visto prima, eax punta a 0041E468 abbiamo anche visto che eax contiene il numero appena inserito....Quindi questa istruzione sposterà un byte del numero inserito, in CL, steppiamo oltre questa istruzione e vedrete che il registro ECX conterrà: 00000036, 36 in esadecimale è il numero che corrisponde al carattere ASCII 6, vi ricordo che un byte è una coppia di numeri (12, 58, 1F ecc....), ovviamente non siete tenuti a saper contare in esadecimale e se non sapete a cosa equivale 36 scrivete in sice: "? CL" e sice vi risponderà: 00000036 0000000054 "6" ciò significa che CL contiene il numero 36h (h = esadecimale) che corrisponde al numero decimale 54 che corrisponde al carattere ASCII 6, cioè quello inserito da noi :)... Abbiamo capito che quell'isutrzione sposta un carattere del seriale in CL, andiamo oltre:
questa istruzione invece non sposta nulla, ma fa semplicemente un COMPARE, cioè un confronto, ma tra chi? Tra il byte contenuto da CL e il byte puntato da edx (edx punta a 41E0E8 che a sua volta contiene il numero: 385-9015453-728) Riassumendo: all'indirizzo 00407F54 viene effettuato un controllo tra il byte contenuto in CL (nel nostro caso: 36) e quello puntato da EDX (che sarà 33h....33h corrisponde in ASCII al carattere 3).
Se questi due byte non sono uguali allora salta alla cosidetta "beggar off" cioè la routine che ci porta alla messagebox di errore.
questa istruzione significa letteralmente: CL è uguale a ZERO? Se si setta ad ON il flag Z se no, settalo a OFF
adesso il salto cioè, se cl è 0 allora salta altrimenti continua questo loop.
00407F5F 3A4A01 cmp cl, byte ptr [edx+01]
00407F62 750E jne 00407F72
muove in CL il valore puntato da EAX+1, cioè il nostro secondo carattere :) e confrontalo poi con il secondo carattere di quello strano numero, se non sono uguali salta alla beggar off, altrimenti continua:
00407F67 83C202 add edx, 00000002
00407F6A 0AC9 or cl, cl
00407F6C 75E4 jne 00407F52
quindi aggiungi ad eax 2 ed anche ad edx....se CL NON è zero rinizia il loop.
È ora fi farvi un breve riassunto di questa routine di check...In pratica i caratteri vengono confrontati uno alla volta con questo numero: 385-9015453-728, ma come? Nella
prima parte della routine viene preso un numero dal serial nostro ed uno dal serial "fisso", se sono uguali continua, senno esci. Poi vengono confrontati il secondo numero
nostr ed il secondo di quello fisso, se sono uguali continua senno esci, aggiungi quindi 2 alla locazione che punta al numero fisso e quindi anche alla nostra. Controlla se
CL è uguale a 0, se no continua il loop, al secondo "giro" verrano confrontati il terzo carattere e poi il 4 e così via....ma quand'è che CL conterrà zero? Facile, quando la
stringa sarà finita.....Già, infatti in memoria le tutte le stringhe finiscono con una specie di "terminatore" cioè un carattere che dica al processore: "Wè, la stringa è finita!",
nel nostro caso il terminatore è lo zero, quindi in memoria la stringa del serial inserito da noi assumerà una forma simile: 3636363131313636360, ad ogni loop succederà
una cosa simile:
1° CL=36
2° CL=36
3° CL=36
4° CL=31
5° CL=31
6° CL=31
7° CL=36
8° CL=36
9° CL=36
10° CL=0.....Quindi STOP!
Ed è proprio in quest'ultimo caso che il caro CL conterrà zero e quindi il loop finirà :), vi presento ancora una volta il codice commentato:
![]()
da ciò possiamo dedurre felicemente che il nostro serial è: 385-9015453-728 e vale per qualunque nome, visto che quest'ultimo neanche viene guardato!!! Raga abbiamo
finito.....Ma se guardate bene troverete anche come attivare il "God mode"
ciauzzzzzzzzzzzzzzzzzzzzzzzzzzz
Note Finali
Un salutissimo a tutti e specie a Oldiron61 che chiedendomi di crackargli questo programma me lo ha fatto anche scoprire....e devo dire che è una vera figataaaaaaaaaaa ciauzzzzzzzzzzzzzzzzzzzzzzzzz
Disclaimer
I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.
Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.