Copernic 98 Plus v 2.51
Scritto da YuGung

  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