Copernic 98 Plus v 2.51
Introduzione
Ok ragazzi, la mia ragazza mi ha piantato circa 1 mese fa e la mia reazione è stata semplice (e folle): crack+crack+crack (niente a che fare con pipette e scaldini pero'); insomma nel weekend successivo ho "rivoltato" più di 12 programmi compreso la mia personale bestia nera (probabilmente ogni "reverser" ha la sua): un orrendo programma tecnico scritto in un ancor più orrendo Visual Basic 4.0 16 bit (pertanto niente Smartcheck !!!) e protetto con chiave hardware Sentinel. La morale da trarre da tutto ciò è che forse per essere un buon "reverser" devi essere un lupo solitario e per lo più incazzato al punto giusto ? obbiettivamente credo di no, ma la cosa può aiutare parecchio ;-) Comunque pensare al codice ha avuto se non altro il pregio di distrarre la mia mente per qualche buona ora e la cosa in certi istanti può risultare davvero molto utile !!!
Comunque tra tutti i programmi vittime della mia furibonda rabbia omicida ho pescato questo che credo presenti qualche spunticino interessante per essere analizzato un pò più a fondo. "Copernic98 Plus" è la versione "pro" di un ottimo engine di multiricerca per Internet e che è in grado di trasmettere la query a decine di altri "Internet Serach Engines" per poi organizzare i risultati in modo da essere facilmente gestibili. La differenza tra le versione Freeware e questa è sul numero di canali di ricerca specializzata disponibili in quest'ultima ed ovviamente sul fatto che questa versione è protetta.
Questo Tutorial è una traduzione in "dolce stil novo" di un tutorial che nel mio orrendo inglese è pubblicato nelle pagine di "Reverse Engineering for Beginners" un sito fondamentale se state facendo i primi passi nel campo del reverse engineering:
A proposito della protezione
Qui troviamo due livelli di protezione: prima una "normale" routine di registrazione con numero seriale (simile a quella a di "TimeLock" per intenderci), poi la obbligatorietà di una registrazione via-internet che per la natura stessa del programma non può essere "skippata" più di 2 volte. La cosa creativa è che dando un'occhiata al disassemblato di IDA è scappato fuori il seguente messaggio "PleaseCloseAllRegistry Monitoring ApplicationsBeforeRegister" WOW ! Finalmente qualcosa di diverso, il programma sembra molto interessato a non farci vedera cosa succede al registro e di conseguenza noi siamo mooooolto interessati ad esso.
The Essay
Ok, lanciamo il programma, andiamo alla routine di registrazione ed inseriamo il nostro codice fasullo; per entrare in SoftIce abbiamo bisogno di un corretto BPX che nel caso è l'inossidabile "BPX HmemCpy" oppure "BPX DrawtextA" dal momento che non viene utilizzata la consueta routine MessageBoxExa. Dopo un pò di skip ci troviamo in questa parte di codice:
004376F1 mov fs:[eax], esp
004376F4 lea edx, [ebp-14h]
004376F7 mov eax, [ebp-4]
004376FA mov eax, [eax+1E8h]
00437700 call sub_41B960
00437705 push dword ptr [ebp-14h] ===> LEGGE LA PRIMA PARTE DEL CODICE
00437708 push offset loc_4379A0
0043770D lea edx, [ebp-18h]
00437710 mov eax, [ebp-4]
00437713 mov eax, [eax+1F0h]
00437719 call sub_41B960
0043771E push dword ptr [ebp-18h] ===> LEGGE LA SECONDA PARTE DEL CODICE
00437721 lea eax, [ebp-8]
00437724 mov edx, 3
00437729 call sub_4039F8
0043772E mov eax, [ebp-8]
00437731 call sub_436C30 ===> FA IL CHECK DEL CODICE
00437736 test al, al
00437738 jz loc_4377E0
Andiamo a 436C30 a troviamo la routine principale di validazione del codice; è abbastanza noioso analizzare in profondità questa parte di codice così saltiamo direttamente dove il prg. memorizza il flag in AL:
00436DFB sahf
00436DFC jnz short loc_436E06 ===> DA "PATCHARE" CON 2 'NOP'
00436DFE mov al, [ebp+var_5]
00436E01 xor al, 1
00436E03 xor [ebp+var_5], al
00436E06
00436E06 loc_436E06:
00436E06
00436E06 xor eax, eax
00436E08 pop edx
00436E09 pop ecx
00436E0A pop ecx
.......
00436E27 lea eax, [ebp+var_58]
00436E2A call sub_4036BC
00436E2F retn
Preferisco applicare la patch qui piuttosto che a 00437736 poichè la routine di protezione è chiamata 3 volte (lo si deduce guardando il disassemblato di IDA), così basta cambiare soltanto un paio di bytes per fare il lavoro. Ora il nostro codice viene accettato come regolare ed un nuovo file COPERNIC.DLL compare nella directory (il corretto numero seriale ha permesso la sua decriptazione) ed il programma è ora registrato. Ma cosa abbiamo da dire del registro ? Fino ad ora il programma ci ha proposto una semplice routine di validazione di numero seriale, ma lanciando di nuovo COPERNIC 98 Plus arriviamo diretti alla pagina con il form di registrazione elettronica nel sito ufficiale. Come ho accennato in precedenza si può evitare tale registrazione solo due volte dopo di che il tasto "REMIND ME LATER" rimane inaccessibile. Credo sia ora venuto il momento di dare un'occhiata al registro di windows e giusto per confermare i sospetti apro REGMON e lancio COPERNIC: puntuale come una crisi di governo arriva il messaggio che cortesemente ci invita a non monitorare il Registro.
Questa routine di check potrebbe essere facilmente craccata (è ancora nel file COPERNIC.EXE qualche bytes dopo la routine precedentemente analizzata) ma accetto la sfida e provo un altro programma che monitorizza il Registro. Lancio ExeSpy98 un buon tool utilizzabile per monitorare direttamente le API di windows (e quindi non dipendente dal Registro), settiamo il prg. ad intercettare le funzioni REGQUERYVALUEEXA e REGSETVALUEEXA e rilanciamo COPERNIC: wow, non ci sono più noiosi messaggi e pertanto possiamo guardare indisturbati al Registro. infatti quando raggiungiamo il registration form guardando ExeSpy98 troviamo una chiamata alla chiave di registro RegCardSkipCount (per favore trovate nomi meno ovvi) !!!! Quando COPERNIC viene lanciato una prima volta (FirstUse flag sempre nel registro) scrive il valore AEh alla chiave di registro RegCardSkipCount ed ad ogni successivo start del programma tale valore viene decrementato fino a non permettere più di saltare il registration form. Provare a cambiare tale valore direttamente nel registro non ha portato grandi risultati: COPERNIC usa infatti tale valore come "seme" per successivi calcoli.
Ok, è ora il momento di tornare a SoftIce; BPX RegQueryValueExa (ma non abilitiamo il breakpoint subito o si è sommersi da una dozzina di inutili chiamate al registro), così dopo un po' si arriva al seguente codice localizzato questa volta in COPERNICSVR.EXE:
004433A7 push eax =====> CONTROLLARE EAX QUANDO PUNTA A "RegCardSkipCount"
004433A8 mov eax, [ebx+4]
004433AB push eax
004433AC call j_RegQueryValueExA_0
Il valore in EAX a 004433A7 punta alla stringa che è la chiave di registro che il successivo RegQueryValueExA va a leggere, il valore di ritorno (ovvero quanto è scritto nella chiave interessata) è salvato in ESI; pertanto quando in 004433A7 troviamo il valore che punta alla stringa "RegCardSkipCount" seguiamo il destino del valore letto in ESI utilizzando il BPM (breakpoint on memory access di SoftIce) ed arriviamo a:
00448230 push ebp
00448231 mov ebp, esp
00448233 add esp, 0FFFFFFF8h
00448236 mov [ebp+var_4], eax
00448239 push 0ABh
0044823E mov ecx, offset aRegcardskipcou
00448243 xor edx, edx
00448245 mov eax, [ebp+var_4]
00448248 call sub_4492F4 =====> chiamata alla routine che comprende RegQueryValue
0044824D xor eax, 0ABh =====> EAX = valore di RegCardSkipCount
00448252 mov [ebp+var_8], eax
00448255 mov eax, [ebp+var_8]
questa routine è chiamata a
005147CB call sub_448230
005147D0 cmp eax, 5 =====> EAX = numero delle volte che il programma è stato lanciato
005147D3 jl short loc_5147E5 =====> if EAX < 5 disabilita il button "Remind Me Later"
005147D5 mov eax, [ebp-4]
005147D8 mov eax, [eax+20Ch]
005147DE xor edx, edx
Il valore in EAX, che poi è il valore di RegCardSkipCount, è prima XOR con ABh (la prima volta AEh XOR ABh= 5) se il risultato è minore di 5 il button "Remind Me Later" è disabilitato, ma noi non vogliamo che il registration form appaia, così dobbiamo cercare a monte dove questa routine viene chiamata. Il codice che leggiamo in IDA è veramente terribile, pieno di routines nidificate molto difficili da analizzare, così in questo caso ho utilizzato una tecnica che mi sono ricordato di avere letto in qualche essay sul favoloso sito di +Fravia: con SoftIce quando arriviamo a 00448230 cerchiamo nello stack per vedere tutte le chiamate precedenti con il comando STACK; infatti troviamo svariate chiamate tutte riferite al medesimo file COPERNICSVR, le prime sei o sette sono tutte localizzate nella medesima zona di codice ma sopra l'ultima ne troviamo una posizionata a 00517D5F, la chiamata principale forse parte da qua....
00517D3F cmp dword ptr [ebp-8], 0
00517D43 jl short loc_517D67 =====> PATCHARE QUI CON JMP 517D67
00517D45 mov ecx, [ebp-4]
00517D48 mov dl, 1
00517D4A mov eax, ds:off_514120
00517D4F call sub_42FC8C
00517D54 mov [ebp-0Ch], eax
00517D57 mov eax, [ebp-0Ch]
00517D5A call sub_432DA8 =====> CHIAMA IL Registration Form
00517D5F mov eax, [ebp-0Ch]
00517D62 call sub_403094
Fatto, ora il prgramma è davvero registrato e non compare più alcun form di registrazione elettronica.
Final Notes
Davvero non capisco perchè i programmatori hanno cercato di impedirci la lettura del registro ! la routine era di facile localizzazione (ExeSpy98 a parte) ed in realtà l'unico risultato è stato quello di focalizzare la nostra attenzione proprio sul registro; se qualcuno ha pazienza può anche cercare di capire il funzionamento di tale routine di check.
Un'ultima parola: non utilizzate questo crack ! il programma è veramente ottimo e la versione freeware copre già il 99% delle esigenze di ricerca che ciascuno può avere.
---------------------------------------------------------------
Essay by: YuGung
Page Created: 01 January 1999