Dongle: primi passi
Cari studenti, oggi affronteremo un tipo di protezione che ultimamente va per la maggiore: la chiave hardware, in inglese Dongle. Questa protezione consiste in un plug che si inserisce nella porta parallela del computer dove dovrebbe girare quel determinato programma; questo non fa altro che verificare se è inserita questa chiave nella porta ( I problema da superare), dopodichè passerà il controllo alla chiave che verificherà alcuni requisiti ( II problema da superare). Avrete capito, quindi, che per i nostri scopi, in primo luogo bisognerà far vedere al prg la chiave hardware e in secondo luogo dovremmo capire qual è lo schema di protezione che viene elaborato nella chiave per superare quest'altro scoglio. Vorrei fare alcune precisazioni: esistono diversi tipi di chiavi hw, nel momento in cui riconoscete il momento vi suggerisco di andare nel sito dei costruttori di quella chiave e leggere le caratteristiche, ciò vi aiuterà nell'affrontare meglio il problema; altra precisazione: le chiavi hw possono essere delle cose facilissime da bypassare, ma non tutte sono così anzi alcune di queste potrebbero svolgere alcune routine del prg, ed in questo caso sarebbe difficile ricostruire tutta la routine, ma il nostro motto è non scoraggiarsi mai, anzi è proprio dalle difficoltà che si matura e si trovano nuove strade da percorrere.
Iniziamo a muoverci!!! Il prg ( molto semplice ) che ho preso come riferimento è CpsWin32 versione 1.15, e lo strumento che utilizzeremo è come al solito Softice. Lanciate il prg e noterete subito che compare una MessageBox che vi dice che non avete la Chiave!!! Qualcuno di voi subito avrà pensato di settare un Bpx MessageBoxA, e l'idea non sarebbe malvagia; tuttavia, noi dobbiamo risolvere i 2 problemi che ho descritto sopra, e settare un Bpx MessageBoxA ci porterebbe troppo avanti nel codice da analizzare. Il nostro interesse è per prima cosa individuare il punto dove viene vista la presenza della chiave, a tal fine dobbiamo settare Bpio -h 378 rw. Bpio vuol dire break point input output settato sulla porta 378 che di solito è la porta parallela (altre volte la porta parallela potrebbe essere la 278). Lanciate il prg e....voilà siete dentro Sice ed esattamente vi troverete all'interno di Sc32w.dll . Disabilitate il Bpio ( Bd *) e premete F12 per ritornare alla call che chiama la dll. Arriverete a questo punto:
00419082 CALL 0056859B ----> chiama la dll e probabilmente inizializza la
00419087 MOV DWORD PTR [EBP-1C], AX chiave. Osservate come nelle
0041908B MOV EDX, DWORD PTR [EBP-1C] istruzioni che seguono il valore di
0041908E AND EDX, 0000FFFF EDX venga variato fino a diventare = FFFF, ciò
00419094 TEST EDX,EDX dovrebbe far pensare che il JZ non dovrebbe essere
00419096 JZ 004190C5 rilevante ai nostri fini.
Continuiamo quindi a steppare per vedere cosa succede e se le nostre intuizioni erano giuste:
004190C5 MOV DWORD PTR [0075F5F4], 0000
004190E2 XOR EDX,EDX ---> EDX viene azzerato (Possibile inizializzazione?)
004190E4 MOV DX, DWORD PTR [0075F5F4] ---> Muove la flag a Dx
004190EB CMP EDX, DWORD PTR [EBP-18] ---> Cosa è EBP-18?
004190EE JGE 00419159 ---> jump importante
Se andiamo a vedere il valore di EBP-18, ( D EBP-18) vediamo che questo è 5; probabilmente nel check che è stato fatto dalla precendente call è stato rilevato che non c'è la chiave hw e il risultato di questo errore (5) è stato messo in EBP-18. Provate a editare la flag di EBP-18 e al posto di 5 mettete 0 ( 0 perchè è il valore che viene attribuito a EDX), in questo modo avverrà il JGE ma ancora non avremo finito di operare: rimane da risolvere il II problema. Procediamo:
00419159 MOV DWORD PTR [0075F5F4], 003F ---> 3F è di solito l'ammontare di dati da leggere nella chiave, quindi le nostre ipotesi precedenti erano giuste!!! :)
00419162 PUSH 0075F1E8
00419167 MOV DX, DWORD PTR [0075F5F4]
00419174 CALL 00568595 --> questa call dovrebbe leggere i dati dalla chiave
00419179 MOV DWORD PTR [EBP-1C], AX --> i dati da Ax vengono memorizzati in [Ebp-1C]
0041917D MOV DWORD PTR [0075F5F4], 0005
00419186 XOR EAX,EAX ---> inizializza Eax
00419188 MOV AX, DWORD PTR [0075F1E8] ---> Ax = FFFF
0041918E XOR ECX,ECX ---> inizializza Ecx
00419190 MOV CX, DWORD PTR [0075F5F4]
00419197 XOR EDX,EDX ---> inizializza Edx
00419199 MOV DX, DWORD PTR [EBP+2*ECX-28] ---> Dx = 5460h
0041919E CMP EAX,EDX ---> compara Eax a Edx
004191A0 JZ 004191CC ---> Altro jump importante.
Che fortuna!!! il prg compara Eax con Edx, dove Eax riporta l'errore (FFFF) mentre Edx riporta il valore esatto (5460). A questo punto basterebbe cambiare la flag a Eax portandola = 5460 per ottenere il jump che abilita il prg. Provare per Credere!!!!
Ringraziamenti : A tutto il mio gruppo preferito RingZer0.