Norton Antivirus 2000 : LiveUpdate illimitato

RegKey Attack

Data

by teDDy

 

18/02/2002

UIC's Home Page

Published by Quequero

 

Il pessimista trova una protezione e pensa che non la craccherà mai.
L'ottimista trova la protezione ed è convinto che riuscirà a craccarla.


I miei migliori complimenti a teddy, grazie alla _pigrizia_ dei programmatori e' arrivato a capire qual'era la chiave giusta, poi un po' di intuito ha fatto il resto. Complimenti perche' la mini-lesson sui bpx servira' a parecchi...Ma mi chiedo: Se la chiave si fosse chiamata GetSystemInformation e le date fossero state...xorate...Che avresti fatto? hihihihihi skerzi a parte, bravo teddy

Il realista trova la protezione,sa che riuscirà a craccarla ma sa anche che presto ci sarà una nuova protezione da attaccare...

....

E-mail: [email protected]
teDDy on #crack-it

....

Difficoltà

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

 

 


Norton Antivirus 2000: live update illimitato
RegKey Attack
Written by teDDy

Introduzione

Primo tute che scrivo ragazzi, ma non se ne può più di tutti questi bacarozzi che la Symantec mette in circolazione. E poi permette di aggiornare le definizioni dei virus solo per un annetto... io non lo trovo affatto giusto... :-p

Tools usati

-Softice 4.05
-Win-eXpose Registry
 

URL o FTP del programma

Non so se distribuiscano qualcosa dal sito. Il programma l'ho aquistato regolarmente :-) Comunque se volete dare un'occhiata provate a http://www.symantec.com/

Notizie sul programma

Questo programma, come ben noto, cerca di difendere i nostri bei Pc da tutti i virus in circolazione. L'aggiornamento dei virus è gratuito per un'anno, poi scade e non si può più aggiornare salvo prolungare la licenza d'uso; che ne dite, la prolunghiamo per qualche mesetto ancora?... :-)

Essay

E' capitato tutto un paio di mesetti fa; stavo aggiornando via internet come solito l'antivirus e cosa mi vedo? Sorry, la tua licenza è scaduta, l'anno gratuito è passato bello mio, se vuoi continuare a restare aggiornato contatta Symantec e paga la licenza!
CHE COSA??? Piuttosto disinstallo l'antivirus e mi becco tutti i virus del nuovo millennio!!
Scherzo, diligentenente ho cercato di contattare Symantec ma visto che il numero telefonico risultava sempre occupato ho cercato di risolvere i miei problemi senza disturbare questi cari programmatori.

Allora, premetto che non si tratta di cracking, piuttosto di reversing e un po' di zen.
Se l'antivirus mi avvisa che l'anno è scaduto vuol dire che va a leggere da qualce parte la data di installazione e controlla quanto tempo è passato giusto?
Presumibilmente questa operazione viene fatta o leggendo da un file o dal registro e visto che non mi entusiasmava l'idea di steppare milioni di byte di codice a cazzum ho pensato di dare un'occhiata preventiva con Filemon e Win-eXpose Registry sulle operazioni che vengono effettuate quando si lancia l'aggiornamento (scusate la pigrizia).
Filemon non ha dato risultati interessanti, la lettura del registro invece si; i processi di Norton da controllare sono luall e lucomser:

0 Luall OpenKey HKLM\Software\Microsoft\Windows\CurrentVersion
1 Luall QueryValueEx HKLM\Software\Microsoft\Windows\CurrentVersion\SubVersionNumber
2 Luall CloseKey HKLM\Software\Microsoft\Windows\CurrentVersion
3 Luall OpenKey HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Performance
4 Luall OpenKey HKLM\Software\Microsoft\Windows\CurrentVersion
...
...
830 Lucomser OpenKey HKLM\SOFTWARE\Symantec\Norton AntiVirus\DefAnnuity
831 Lucomser CloseKey HKLM\SOFTWARE\Symantec\Norton AntiVirus
832 Lucomser QueryValueEx HKLM\SOFTWARE\Symantec\Norton AntiVirus\DefAnnuity\SubscriptionLength
833 Lucomser CloseKey HKLM\SOFTWARE\Symantec\Norton AntiVirus\DefAnnuity
834 Lucomser OpenKey HKLM\SOFTWARE SUCCESS hKey: 0xC29BD880
...
...
858 Lucomser OpenKey HKLM\Software\Symantec\LiveSubscribe
859 Lucomser CloseKey HKLM\Software\Symantec\LiveSubscribe
860 Lucomser OpenKey HKLM\Software\Symantec\LiveSubscribe\Services
861 Lucomser CloseKey HKLM\Software\Symantec\LiveSubscribe\Services
862 Lucomser OpenKey HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A
863 Lucomser QueryValueEx HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A\Subscription
864 Lucomser QueryValueEx HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A\Subscription SUCCESS "07-00-02570-IT"
865 Lucomser OpenKey HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A\07-00-02570-IT
866 Lucomser QueryValueEx HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A\07-00-02570-IT\DATA SUCCESS FB 30 31 01 FB 30 31 01 ...
867 Lucomser CloseKey HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A\07-00-02570-IT
868 Lucomser CloseKey HKLM\Software\Symantec\LiveSubscribe\Services\61D460E0-07C0-11d3-A985-00A0244D507A

Hmmm, interessante, tra le migliaia di accessi al registro c'è una chiave che si chiama proprio LiveSubscribe e un campo data; sembrerebbe proprio una licenza d'uso! Guardiamola più da vicino...

DATA (hex)

FB 30 31 01 FB 30 31 01 0B 58 31 01 01 FB 30 31 01 29 3C EF 05

Si può notare che in questi 20 caratteri esadecimali si ripete continuamente la sequenza 30 31 01;
osservando meglio si può estrarre uno schema del tipo:

A= FB 30 31 01
B= 0B 58 31 01
C= 29 3C EF 05

A A B A C

Visto che senza steppare il codice non si possono ottenere altre informazioni proviamo a dare un'occhiata col Softice, anche perchè finora abbiamo fatto solo supposizioni, magari la chiave che stiamo analizzando non centra 'na mazza con la licenza d'uso; se però fosse effettivamente questo il controllo, ricordiamoci che la chiave che abbiamo è una chiave VALIDA, l'unico inconveniente è che è SCADUTA.
Cosa consigliate per partire? Chiave a caso? Ok mettiamo nel campo DATA

11 11 11 11 11 11 11 11 22 22 22 22 11 11 11 11 33 33 33 33

rispettando lo schema AABAC.

Avviamo il LIve Update e... stesso messaggio, "l'abbonamento alle definizioni dei virus è scaduta, bla bla bla..."
Il punto preciso che ci interessa attaccare è la chiamata RegQueryValueEx nel punto in cui legge il campo DATA.
Allora, BreakPoint su RegQueryValueEx e via col LiveUpdate.
Porc... l'INFERNO!! Vi accorgerete presto che RegQueryValueEx è chiamata un'infinità di volte, impensabile seguire questa strada se non si vuole brekkare continuamente... Però sarebbe comodo riuscire ad entrare proprio lì, dove va a leggere il codice...
Vediamo se il manuale delle api ci può aiutare; allora RegQueryValueEX è chiamata così:

LONG RegQueryValueEx(
HKEY hKey,
// handle of key to query                                             ESP
LPTSTR lpValueName,
// address of name of value to query        ESP+4
LPDWORD lpReserved,
// reserved                                                 ESP+8
LPDWORD lpType,
// address of buffer for value type                   ESP+12
LPBYTE lpData,
// address of data buffer                                       ESP+16
LPDWORD lpcbData
// address of data buffer size                         ESP+20
);

Il parametro lpValueName è quello che ci interessa; sapendo che i parametri vengono pushati nello stack al contrario, lpValueName sarà il penultimo cioè ESP+4;
Allora mettiamo un BreakPoint di questo tipo:

Bpx RegQueryValueExA if (*(esp+4)='DATA')

Lanciamo LiveUpdate e ... niente! Il SICE non brecca!! In effetti ci sono due errori nel nostro BP; il primo è che nel momento in cui avviene il breack su RegQueryValueExA è già stato salvato sullo stack il Return Address e quindi lpValueName non sarà più in Esp+4, bensì a Esp+8.
Il secondo errore è dovuto a *(ESP+4); *(esp+4) non è il nome della chiave, bensì l'indirizzo in cui viene salvato. Per ottenere il nome è necessario puntare all'indirizzo contenuto in *(esp+4), cioè **(esp+4).
Modificando il nostro BP otterremo:

Bpx RegQueryValueExA if (**(esp+8)='DATA')

Con questo sistema Sice popperà solo se la subkey sarà DATA.
Se doveste usare in futuro questa tecnica per hookare l'API RegQueryValueExA, ricordatevi che al posto di 'DATA' non va scritta tutta la subkey, ma solo le prime 4 lettere poichè **(esp+8) punta alla prima dword della subkey.

E ora proseguiamo..
Sice popperà e uscendo dalla funzione RegQueryValueExA ci troveremo qui:

0177:02714633 CALL [ADVAPI32!RegQueryValueExA]
0177:02714639 XOR ECX,ECX                    <--Arriviamo qui
0177:0271463B MOV [ESI+08],EAX
0177:0271463E TEST EAX,EAX
0177:02714640 SETZ CL
0177:02714643 MOV EAX,ECX
0177:02714645 JMP 02714650
0177:02714647 MOV DWORD PTR [ESI+08],000000A0
0177:0271464E XOR EAX,EAX
0177:02714650 POP ESI
0177:02714651 LEAVE
0177:02714652 RET 000C


Se usciamo da questa routine ci troviamo qui:

0177:02713F6D TEST EAX,EAX
0177:02713F6F JZ 02713F81
0177:02713F71 LEA EAX,[EBP-2C]   <--Chiave del registro letta (11 11 ...)
0177:02713F74 MOV ECX,ESI
0177:02713F76 PUSH EAX           
<--Chiave del registro letta (11 11 ...)
0177:02713F77 CALL 02713FEA      <--Call di controllo
0177:02713F7C CMP EAX,[EBP-1C]   <--Confronto ris. con par. C (AABAC)
0177:02713F7F JZ 02713F91           della chiave e salta se corrisponde
0177:02713F81 PUSH 14
0177:02713F83 LEA EAX,[EBP-2C]
0177:02713F86 PUSH 00
0177:02713F88 PUSH EAX
0177:02713F89 CALL 02718040
0177:02713F8E ADD ESP,0C
0177:02713F91 MOV EAX,[EBP+10]
0177:02713F94 LEA ECX,[EBP-18]
0177:02713F97 MOV EDI,[EAX*4+EBP-2C]

...


C'è quindi una routine di controllo sui valori definiti prima come AABA e un confronto con il valore C.

La routine di controllo è questa:

0177:02713FEA MOV ECX,[ESP+04]  <--Chiave del registro AABAC
0177:02713FEE PUSH 04
0177:02713FF0 XOR EAX,EAX       <--Azzera eax
0177:02713FF2 POP EDX
0177:02713FF3 ADD EAX,[ECX]     <--Somma in eax il campo chiave da 4Byte(A) <----
0177:02713FF5 ADD ECX,04        <--Ecx punta al campo successivo                 |
0177:02713FF8 DEC EDX                                                            |
0177:02713FF9 JNZ 02713FF3      <--Ripeti l'operazione per i 4 campi (ABAA)------
0177:02713FFB ADD EAX,012A512D  <--Aggiungi questo valore al risultato
0177:02714000 RET


Tutta la routine può essere riassunta così:

Affinchè la chiave risulti valida:

C= A(1°) + A(2°) + B(3°) + A(4°) + 12A512D o meglio, poichè ogni volta che si fa mov eax, [ecx] il valore chiave puntato da [ecx] viene copiato in eax in modo inverso da come lo leggiamo (12 34 56 78 diventa 78 56 34 12)
il calcolo esatto diventa:

!C= !A + !A + !B +!A + 12A512D (Se A=FB 30 31 01 --->!A=01 31 30 FB)

Infatti la chiave che avevamo letto nel registro
A= FB 30 31 01
B= 0B 58 31 01
C= 29 3C EF 05
verifica questa eguaglianza.

Poiche abbiamo posto:

A=11 11 11 11
B=22 22 22 22

!C dovrà risultare !(11111111)+ !(11111111) + !(22222222) + !(11111111)+ 12A512D
cioè !C=56 7F A6 82 quindi C =82 A6 7F 56

Modifichiamo la chiave, lanciamo LiveUpdate e.... "L'anno è passato, rinnova .... bla bla bla"
Hmmm, cosa può essere successo? La chiave ora dovrebbe risultare esatta, però se ragioniamo Norton fa si un check sulla correttezza della chiave, ma di sicuro fa un'altro check sulla scadenza della stessa!
Dovremmo quindi trovare l'altro check dove confronta i dati della chiave con la data del sistema e quindi dove decide se abbiamo ancora diritto a scaricare gli aggiornamenti.

Nonostante dedichi parecchio tempo al cracking, devo ammettere che non mi piace perdere un sacco di ore per un singolo programma; quindi invece di buttarmi subito alla ricerca disperata del secondo check, ho pensato di analizzare i valori A e B della chiave preesistente e anche la costante fissa della routine; che valore avranno in decimale? Proviamo!!!

A= FB 30 31 01 ---> (-80727807 negativo perchè consideriamo l'F iniziale)
B= 0B 58 31 01 ---> (190329089)
Cost= 12A512D ---> (19550509)

Non mi dicono niente :(( però ..... hmmm 19550509... sembra quasi una data... 09.05.1955 ? A pensarci bene, le chiavi A e B quando sono lette vengono invertite (vi ricordate !A che abbiamo visto prima?)
Facciamo la prova!

!A = 01 31 30 FB ---> (20001019)
!B = 01 31 58 0b ---> (20011019)
Cost=1 2A 51 2D ---> (19550509)

Eheheh, sembrano proprio date!!!

!A mi sa tanto da 19 Ott. 2000
!B mi sembra un 19 Ott. 2001, a voi no?

E che differenza ci sono tra 'ste 2 date, un anno??? e guarda caso, adesso che ci penso la seconda è proprio il giorno in cui mi è scaduta la licenza e la prima il giorno in cui l'ho installato...

Volete trovare il check dove fa il controllo? Io mi accontenterei!!!

Facciamo la prova ora; dunque ... data iniziale lasciamo pure quella dell'installazione, data finale direi fra qualche mesetto, tipo 20 Apr 2002, quindi:

!A = (2000.10.19) --> 01 31 30 FB
!B = (2002.04.20) --> 01 31 7C C4

Secondo la solita formula:

!C= !A + !A + !B +!A + 12A512D

!C= 3*(13130FB) + (1317CC4) + 12A512D = 5EF60E2

Ricapitolando:

A= FB 30 31 01
B= C4 7C 31 01
C= E2 60 EF 05

Quindi la stringa finale risulta:

AABAC= FB 30 31 01 FB 30 31 01 C4 7C 31 01 FB 30 31 01 E2 60 EF 05

Salviamola nel registro, lanciamo Norton e andiamo a vedere quando scadrà la licenza sulle info... ihihih sembra scada proprio il 20 Aprile!!!

Speriamo che nel frattempo si liberi la linea telefonica, così posso finalmente rinnovare le mie licenze scadute!

Resta solo un mistero ragazzi. Che cos'è successo il 9 maggio del 1955? Scopritelo voi....



                                                                                                                 bye, teDDy

Note finali

Siamo riusciti a risolvere la questione senza toccare un byte del codice di Norton! Bravi ragazzi, reversare è molto, molto meglio che craccare stupidamente un programma. Se avete tempo cercate di reversare per scoprire le password; vi garantisco c'è molta + soddisfazione così!

PS. Complimenti ai programmatori Symantec per il fantastico algoritmo di crittazione della chiave!!

Salutoni al Que e un "CIAO BELLI!" a tutti gli amici di #crack-it!

Disclaimer

Considerato il grande impegno dei programmatori Symantec per criptare la licenza, vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione (tentate + volte se non trovate la linea telefonica libera!! :). 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.

Capitoooooooo????? Bhè credo di si ;))))