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
- 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
- -Softice 4.05
- -Win-eXpose
Registry
-
- 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/
- 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?... :-)
- 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
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!
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 ;))))