Memory Dumper
(ovvero un classico 'time limit remove')

Data

by FlendeR

 

09/03/2001

UIC's Home Page

Published by Quequero



Il crack è davvero banale, il tool preso in esame è invece utile :P aspetto un tutorial più avanzato, grazie flender :)

 

....

 

....

Difficoltà

(x)NewBies ( )Intermedio ( )Avanzato ( )Master

 

 


Memory Dumper
(ovvero un classico 'time limit remove')

Written by FlendeR

Introduzione

Questo tute è per newbies, almeno nelle intenzioni, affronta il crack modificando il codice che non sarà il massimo dell'eleganza ma è spesso la cosa più rapida da fare. Cercherò di essere il più chiaro possibile ma visto che questo è il mio primo tutorial vi dovete accontentare .-)  

Tools usati

SIce x Win
WDasm, o meglio IDA
Il vostro hex editor preferito (x es hexworkshop)

URL o FTP del programma

Hum .... e chi se lo ricorda! bo, provate su http://crackpltools.prv.pl/

Notizie sul programma

Un memory dumper nè +, nè - ;-)

Essay

 
Ok vediamo di ke si tratta : lanciando il programmetto ci si trova davanti il classico nag che ci dice che si possiede una demo ... premi register se hai il codice... ecc, ecc... clikkando su try si avvia il programma sensa nessuna limitazione fin tanto che non è finito il limite del demo.
 
Va bene, reversiamolo ! La prima cosa che ho fatto è, come capita spesso, una cazzata.Disassembando con WDasm ho scovato la stringa 'The serial number entered is not valid' proprio dopo una call classica a GetDlgItemText e a altre due che probabilmente si occupano del controllo del codice immesso, e ho detto : "troppo facile, basta invertire la jmp e sono a posto", in effetti la cosa funzia, nel senso che mi ringrazia per aver comprato il prodotto (!) e il programma si avvia. A questo punto provo a riavviare e... DHO! mi dice che sono un bimbo cattivo perchè ho provato a barare e che il programmetto non funzionerà più neanche con una ri-istallazione, si figuriamoci ! :-D

Allora, vediamo di capirci qualcosa :  guardiamo il log fatto durante l'installazione (usare un install manager è, dal mio punto di vista, fondamentale per risparmiare tempo e moccoli, io uso AShampoo ma va bene qualsiasi cosa che permetta di vedere i cambiamenti fatti al sistema durante l'installazione) e ci si accorge della presenza di una eloquente chiave di nome 'install key' :

HKEY_LOCAL_MACHINE\Software\PDTSoftware\MemoryDumper\InstallKey

... bè mi sembra ovvio a cosa serva : è evidente che quando si inserisce il codice (giusto o no) per la registrazione, in qualche modo viene cambiata la install key, poi, al riavvio successivo, viene controllata di nuovo (tramite una routine diversa da quella modificata ora ovviamente) e quindi si accorge del trucco.

Visto che tutto il controllo viene fatto tramite la 'Install Key' Apriamo il SIce e piazziamo un bel bpx alla RegOpenKeyExA per intercettare le letture dal registro.
A proposito, conviene prima settare un bpx per esempio nell'entry point del codice e solo dopo che Sice brekka abilitare il bpx che ci interessa davvero, in questo modo si evita di dover poppare tutte le volte (e sono tante) che le altre applicazioni accedono al registo.
Vediamo il codice :

00401428 call      ds:RegOpenKeyExA                ;SIce poppa qui
0040142E test      eax, eax
00401430 jz        short loc_40148E                ;Salta se non ci sono errori nella RegOpenKeyExA

0040148E lea       edx, [ebp+var_1E0]
00401494 push      edx
00401495 lea       eax, [ebp+var_14C]
0040149B push      eax
0040149C lea       ecx, [ebp+var_16C]
004014A2 push      ecx
004014A3 push      0
004014A5 push      offset aInstallkey ; "InstallKey"  ;!!!!! 
004014AA mov       edx, [ebp+var_160]
004014B0 push      edx
004014B1 call      ds:RegQueryValueExA
004014B7 test      eax, eax
004014B9 jz short  loc_401517                        ;di nuovo, salta se non ci sono errori

00401517 mov       ecx, [ebp+var_160] 
0040151D push      ecx 
0040151E call      ds:RegCloseKey                    ;questo pezzo di codice serve per chiudere
00401524 lea       edx, [ebp+var_14C]                ;la chiave del registro
0040152A push      edx 
0040152B push      offset unk_4068F0 
00401530 call      sub_402C8E 
00401535 add       esp, 8 
00401538 test      eax, eax 
0040153A jnz short loc_40158B

0040158B push      offset unk_4068F0
00401590 call      sub_402A26

Qui si passa da un pezzo di codice che calcola la data attuale (tramite le getsystemtime e systemtimetofiletime) non lo riporto perchè è lungo e perchè non serve capirci, basta accorgersi dove è che viene fatta la compare, in questo caso viene fatta tramite una cmp seguita da due jmp, la prima è una jg e salta se il periodo di prova è scaduto (va a una parte del codice dove si modifica la install key) e la seconda invece salta al codice che avvia il programma, ecco il codice :


00401671 mov       [ebp+var_268], ecx
00401677 mov       [ebp+var_264], edx
0040167D cmp       [ebp+var_264], 1792h
00401687 jg short  loc_4016A4                             ; evil jump 
00401689 jl short  loc_401697                             ; salta se c'è ancora tempo
0040168B cmp       [ebp+var_268], 0F8648000h
00401695 ja short  loc_4016A4

00401887 push      offset unk_4068F0
0040188C call      sub_402A26
00401891 add       esp, 4
00401894 test      eax, eax
00401896 jnz       short loc_4018C3
00401898 push      0
0040189A lea       ecx, [ebp+var_240]
004018A0 call      sub_4026F0
004018A5 mov byte  ptr [ebp+var_4], 1
004018A9 lea       ecx, [ebp+var_240]
004018AF call      j_?DoModal@CDialog@@UAEHXZ ; CDialog::DoModal(void)  ;call alla message box
004018B4 mov byte  ptr [ebp+var_4], 0                                   ;di benvenuto
004018B8 lea       ecx, [ebp+var_240]
004018BE call      sub_4022F0

OK, è chiaro che la strategia + semplice è quella di far credere che il programma sia sempre in fase di prova. Ciò si può ottenere cambiando l'argomento della jg e sostituendoci lo stesso indirizzo della jl successiva, così si salterà sempre alla parte di codice 'buona' indipendentemente dai controlli precedenti.

E questo basta per rendere il programma 'eterno', ora però guardiamo di levare anche il nag screen di apertura che rompe le palle e basta. Per skippare il nag devo evitare la call alla message box che si trova all'indirizzo 004018AF.Si può fare in diversi modi, per esempio, da SIce mettiamo un bpx a 004018A9 e uno a 004018B4 e annotiamoci i valori dei registri.Ci si accorge che quelli che cambiano sono eax , ecx e edx , in particolare non cambia esp che è il puntatore allo stack, questo è importante e significa che possiamo togliere brutalmente la call senza influenzare il resto del programma (in realtà questo è vero solo se all'interno della non viene cambiato qualche settore importante della memoria, ma visto che questa è una message box ci si aspetta che non modifichi la memoria).Sempre da SIce vediamo che in eax viene messo il valore 2 quando nel nag screen premiamo 'try'. Quindi dal nostro hex editor cambiamo la call in mov eax,2 (usatene uno che consenta l'inserimento del codice mnemonico oppure inserite direttamente B802000000 ).
Da notare che quando si sostituisce un frammento di codice con un altro bisogna stare attenti che i due spezzoni abbiano la stessa lunghezza (intendo lunghezza in hex) in qesto caso non ci sono problemi perchè entrambe istruzioni sono dello stesso tipo (ad operando immediato) e quindi non c'è bisogno di inserire nop :-)

Bene ... "that's all folks" .

Note finali

Come detto all'inizio forse questo è un modo di procedere troppo 'invasivo' nei confronti del programma ma è anche il più semplice quindi visto che sono un newbie ho usato questo qui se, vi garba, bene se no .. fuck  ;-)
Se troverò tempo e voglia mi piacerebbe fare un keymaker per questo programma, infatti ho individuato i segmenti in cui viene fatta la verifica ma non ho avuto voglia di invertirne la funzione .

Ok, finito ....... cazzo, credevo fosse più veloce scrivere un tute .

Disclaimer

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.