Crackare CuteFTP versione 2.0
Un pò diverso dal solito...


26/12/99

by "AndreaGeddon "

 

 

UIC's Home Page

Published by Quequero



Attacco ad una delle più belle protezioni presenti sul mercato dello shareware....Anche questa è da reversare

 
UIC's form
Home page: presto sarà disponibile... 
E-mail: [email protected]
UIC's form

Difficoltà

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

 

Scrivo questo tute perchè il CuteFTP v2.0 non è difficile da crakkare, ma il procedimento è un pò diverso dal solito, e credo che molti newbies potrebbero trovarlo interessante.


Crackare CuteFTP v2.0
Attacco su RegOpenKeyA
Written by AndreaGeddon

Tools usati

SoftIce 4.00

WinDASM 8.93

Un hex editor qualunque

Borland Resource WorkShop 4.5

URL o FTP del programma

Non ritrovo l'URL, comunque si può scaricare da molti siti shareware e anche da xoom quando aprite uno spazio gratuito.

Notizie sul programma 

Il programma è un client FTP. Scade dopo non sò quanti giorni, e invece di avviarsi manda una finestra che ti dice che è scaduto e se le vuoi continuare ad usare devi comprarlo.

Essay

Usavo spesso il CuteFTP per uploadare robaccia su un mio spazio web su xoom. Poi venne un terribile periodo in cui ero sempre all'università e dovevo studiare, così per molto non usai più CuteFTP. Un paio di giorni fa ho deciso di aggiornare lo spazio web abbandonato tempo prima. Bene, faccio il punto della situazione, carico CuteFTP e... DOH!!! Cacchio, CuteFTP non si carica! Mi poppa una finestra che mi dice che il prog è scaduto e che me lo devo comprare.

Subito mi ci sono messo su per fregarlo. Non avevo softice caricato e non avevo voglia di riavviare il computer, così ho pensato di provare a risolvere la cosa solo studiandomi il disassemblato. E qui sono sorti i primi problemi. Per prima cosa, il classico: cerco la stringa che ottengo nella finestra di scadenza, ma nel disassemblato la trovo solo nelle righe iniziali, dove vengono descritte le risorse delle finestre. All'interno del codice nessuna traccia. Se apro il prog con il BRW, trovo subito la finestra interessata, che è la 1550 nei dialog. Se la cancello, non risolvo niente. Se la sostituisco non risolvo niente lo stesso.

A questo punto il prog si fà interessante, e riavvio il computer per caricare softice. Provo a settare il breakpoint su messageboxa, ma il sice non poppa. Infatti nel disassemblato potevo trovare le tracce della finestra nelle descrizione delle risorse come DialogBox, quindi non posso aspettarmi niente da messagebox. La cosa strana è che nel codice non riuscivo a trovare nessun riferimento a quelle stringhe, quindi non avevo un punto di partenza.

Allora ho cercato nel registro di windows per vedere se per caso ci fosse qualcosa che potesse essermi utile sul CuteFTP, ma nisba di nuovo.

A questo punto restava una sola strada: il programma doveva in qualche modo aver salvato in una chiave del registro un valore che gli diceva di essere scaduto. Nelle imported functions si trovano le api RegOpenKeyA e RegOpenKeyExA. Ho settato il breakpoint sulla prima per vedere che chiave viene letta, e così si giunge al seguente codice:

nota: con questo breakpoint si aprirà il softice varie volte prima di quella giusta. Per arrivare dove vogliamo, dobbiamo settare il break, lanciare il cuteftp, e quando il sice poppa premere F12. In questo modo finiremo nl processo chiamante. Se il processo non è quello del cuteFTP, premere ctrl+d e il softice si chiuderà e ripopperà di nuovo. Ancora premete F12 per vedere se finite nel processo chiamante giusto, cioè quello di cuteFTP. Se ancora non ci siete, continuate, finche non arrivate nel processo chiamante CuteFTP con il seguente codice.

 

* Reference To: ADVAPI32.RegOpenKeyA, Ord:012Dh

|

:00411DAB   Call dword ptr [0048F7E4]      il sice poppa qui

:00411DB1   test eax, eax                          se la chiave non c'è

:00411DB3   jne 00411FBD                   salta alla routine che ne crea una

:00411DB9   mov eax, dword ptr [esp+10]       da qui prepara gli argomenti che verranno passati

:00411DBD   lea ecx, dword ptr [esp+18]       alla seguente api

:00411DC1   lea edx, dword ptr [esp+28]

:00411DC5   push ecx

:00411DC6   xor esi, esi

:00411DC8   push edx

:00411DC9   push esi

:00411DCA   push eax

* Referenc To: ADVAPI32.RegQueryValueA                legge il valore della chiave

|

:00411DCB FF15DCF74800 Call dword ptr [0048F7DC]

:00411DD1   test eax, eax

:00411DD3   jne 00411F93

:00411DD9   lea ecx, dword ptr [esp+14]

:00411DDD   lea edx, dword ptr [esp+1C]

:00411DE1   push ecx

:00411DE2   push edx

:00411DE3   lea eax, dword ptr [esp+30]              qui viene caricato il valore letto dalla chiave, nel mio caso

:00411DE7   push 00485E4C                             è 383dc1ea,6f

:00411DEC   push eax

------8<----------------

snip~                                     qui viene fatta la scansione e il conteggio del valore letto dalla chiave

                                                                                  e qualche calcolo... che possiamo anche tralasciare

------8<----------------

:00411E84   push eax

:00411E85   push ebx

:00411E86   push esi

:00411E87   push ecx

* Reference To: ADVAPI32.RegSetValueA, Ord:0140h   viene scritto il valore nella chiave

|

:00411E88   Call dword ptr [0048F7E0]

:00411E8E   mov edx, dword ptr [esp+10]

:00411E92   push edx

* Reference To: ADVAPI32.RegCloseKey, Ord:0117h   viene chiusa la chiave

|

:00411E93   Call dword ptr [0048F804] 

:00411E99   push 0000005C

:00411E9B   call 0044D7AA

:00411EA0   add esp, 00000004

:00411EA3   mov dword ptr [esp+24], eax

:00411EA7   cmp eax, esi

:00411EA9   mov dword ptr [esp+44], esi

:00411EAD   je 00411ED0

:00411EAF   mov ecx, dword ptr [ebp+000002F0]

:00411EB5   push esi

:00411EB6   neg ecx

:00411EB8   sbb ecx, ecx

:00411EBA   and ecx, 000004DC

:00411EC0   add ecx, 00000132

:00411EC6   push ecx

:00411EC7   mov ecx, eax

:00411EC9   call 004491A4

:00411ECE   mov esi, eax

:00411ED0   mov edi, dword ptr [esi]

:00411ED2   mov ecx, esi

:00411ED4   mov [esp+44], FFFFFFFF

:00411EDC   call dword ptr [edi+000000C0]    qui viene chiamata la finestra che dice che il programma è scaduto.

:00411EE2   cmp eax, ebx              il pulsante help è stato premuto?

:00411EE4   jne 00411EF8               se non è stato premuto, salta

:00411EE6   mov edx, dword ptr [ebp+0000008C]

:00411EEC   push 0000006C

:00411EEE   push ebx

:00411EEF   push edx

:00411EF0   push 00000000

* Reference To: USER32.WinHelpA, Ord:025Eh     se è stato premuto carica il file di guida

|

:00411EF2   Call dword ptr [0048FD9C]

:00411EF8   test esi, esi

:00411EFA   je 00411F02

:00411EFC   push ebx

:00411EFD   mov ecx, esi

:00411EFF   call [edi+04]                      chiamata al codice che calcola se il prog è scaduto

:00411F02   mov eax, dword ptr [ebp+000002F0]

:00411F08   mov dword ptr [ebp+000001B8], ebx

:00411F0E   cmp eax, ebx                       il prog è scaduto?

:00411F10   jne 0041204B                      interessante... normalmente non è attivo, ma se viene forzato salta ad una parte

:00411F16   push ebx                          completamente diversa del codice

:00411F17   call 00437100

:00411F1C   add esp, 00000004

:00411F1F   xor eax, eax

:00411F21   mov ecx, dword ptr [esp+3C]

:00411F25   mov dword ptr fs:[00000000], ecx

:00411F2C   pop edi

:00411F2D   pop esi

:00411F2E   pop ebp

:00411F2F   pop ebx

:00411F30   add esp, 00000038

:00411F33    ret

 

okey, dopo regqueryvalue sappiamo il valore letto nella chiave. Se lo andiamo a cercare nel registro di windoze, lo troviamo alla sottochiave pcf\CFK20 per due volte. Ora possiamo sbattere la testa per capire come viene genrato il fottuto codice e come fa il cuteFTP a decifrarlo per capire se è scaduto o meno, o possiamo scegliere una via più semplice. Se continuiamo nello stepping, vedremo che dopo aver letto il valore, il prog chiude la chiave. Poi dopo alcune righe si arriva all'indirizzo 00411EDC, in cui viene chiamata la finestra che dice che il programma è scaduto. Poi il programma prosegue e termina. La chiamata alla finestra non può essere evitata, però vediamo che se steppiamo il prog ci mostra la finestra, ma poi torna al sice. Qui continuando a steppare vediamo che c'è anche un controllo per vedere se è stato premuto il tasto registration information. Il prog continua, e arriviamo alla linea 00411F10. Qui c'è un jump che salta ad un'altra parte di codice più lontano dalla routine in cui ci troviamo. Normalmente questo jump è disabilitato. Se lo forziamo... voilà. Il programma parte. Quindi abbiamo trovato il byte da patchare: alla riga 00411F10 i byte 0F8535010000 vanno cambiati con 0F8435010000. Dopo il patching, il programma verrà eseguito sempre.

C'è ancora un problema. Ora il programma siamo riusciti a farlo eseguire, ma c'è sempre la finestra che ci dice che il prog è scaduto. Il patching infatti avviene dopo la chiamata alla finestra. Per eliminare anche la finestra, basta sparare il BRW. Tra le Dialog Resources c'è la numero 1550 che è proprio quella che viene visualizzata dal cuteFTP. Se la cancelliamo il BRW ricompila l'eseguibile senza di questa. Ora riproviamo ad esguire il CuteFTP et voilà.

Adesso parte senza neanche mostrare più la nag window.

 

AndreaGeddon

 

Note Finali

Saluto tutti gli amici della mailing list con cui ho condiviso questo cracking, in particolare saluto Phobos, che è arrivato da poco ma ha già fatto tanto.

Disclaimer

Queste informazioni sono solo a scopo puramente didattico. Non mi ritengo responsabile dell'uso che ne verrà fatto.

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    CrackMe   ContactMe   Forum       
    Iscrizione   Lezioni    Links   NewBies   News   Playstation        
  Tools   Tutorial   Search   UIC Faq

UIC