---------> Furb3T <---------

presenta:

Dongle: primi passi.


Attenzione : il materiale che trovate in questo tutorial Φ a puro scopo didattico.


    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.