Zoom Icon

Corso UIC Newbies 03

From UIC

Corso UIC Newbies 3

Contents


Infos
Author: Quequero
Email: image:Que_addr.gif
Website: http://www.quequero.org
Date: 11/01/2000 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Image:Flag_Italian.gif
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à: image:Corso UIC Newbies 03-Immagine02.jpg
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.... image:Corso UIC Newbies 03-Immagine03.jpg
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: image:Corso UIC Newbies 03-Immagine04.jpg
vi apparirà un box nel quale dovrete cercare la stringa che vi riportava il messagebox del programma, cioè: "Invalid Registration Code Entered !!": image:Corso UIC Newbies 03-Immagine05.jpg
fateci un doppio click sopra ed arriverete esattamente qui: image:Corso UIC Newbies 03-Immagine06.jpg
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: image:Corso UIC Newbies 03-Immagine07.jpg
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...: image:Corso UIC Newbies 03-Immagine08.jpg
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: image:Corso UIC Newbies 03-Immagine10.jpg
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:
image:Corso UIC Newbies 03-Immagine11.jpg
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: image:Corso UIC Newbies 03-Immagine12.jpg
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:

00407F47 B868E44100 mov eax, 0041E468

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:

00407F4C 8B15E8E04100 mov edx, dword ptr [0041E0E8]

scrivete "d 41E0E8" e vedrete un numero: 385-9015453-728 continuate....

00407F52 8A08 mov cl, byte ptr [eax]

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:

00407F54 3A0A cmp cl, byte ptr [edx]

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).

00407F56 751A jne 00407F72

Se questi due byte non sono uguali allora salta alla cosidetta "beggar off" cioè la routine che ci porta alla messagebox di errore.

00407F58 0AC9 or cl, cl

questa istruzione significa letteralmente: CL è uguale a ZERO? Se si setta ad ON il flag Z se no, settalo a OFF

00407F5A 7412 jz 00407F6E

adesso il salto cioè, se cl è 0 allora salta altrimenti continua questo loop.

00407F5C 8A4801 mov cl, byte ptr [eax+01]
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:

00407F64 83C002 add eax, 00000002
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.