Ok amici, eccoci qui' sul crackme PaTiENcE di Queqeuero.
La protezione in se stessa non e' molto complicata, ma il nome patience e' ben meritato,
in quanto per risolverlo occorre una buona dose di pazienza e di tempo da passare davanti
a SoftIce, iniziamo con il caricare il programma dal loader di softice e mettiamo un bel
breakpoint su una delle funzioni classiche per prendere il testo:
bpx GetWindowTextA
CTRL-D
e immettiamo un seriale a caso, tipo 12345678 e ci ritroviamo nel punto 1 proprio qui
sotto:
sub_0_4011C2 proc near ; CODE XREF: CODE:004011AF push 2Dh
push 402331h
push dword ptr ds:402111h
call sub_0_4014ED [PUNTO 1]
Come prima cosa notiamo che viene passato alla funzione GetWindowTextA (call sub_0_4041ED
nel nostro disasm) un paramentro di prelevamento caratteri molto piu' alto del nostro
seriale fake ovvero vengono presi 2dh caratteri (45 lettere o numeri), quindi il seriale
deve essere lungo (ahiahai!).
Come si puo' vedere ho disassemblato il file, per poter scrivere questo tute, ma il lavoro
l'ho svolto prima solo con softice, se no' che gusto c'era ?
Anche perche' dal disassemblato solamente non e' che si capisca molto.
Questa istruzione qui' sotto carica l'indirizzo del nostro bel codice nel registro EAX
mov eax, 402331h Carica
mov edx, [eax] {
xor edx, 4022C0h
mov ebx, 4021A9h Codice inutile :-) Come inutile??? È utile a confondervi :)))) NdQue
xor ecx, ecx
xor edx, edx }
- mov cl, [eax] In cl viene messo il nostro 1° codice
mov ch, [eax+5] In ch il 6°
mov dh, [eax+0Ah] In dh l' 11°
call sub_0_4014B1 Viene chiamata un soubroutine che diminuisce di 30
i codici precedenti.
mov dl, [eax+4] In dl viene caricato il 5° codice
call sub_0_4014BB Viene chiamata una soub. che esegue le seguenti
somme cl+ch, cl+dh, cl+30
cmp cl, dl Vengono comparati cl e dl, se sono uguali OK
jnz loc_0_401126 diversi= bad serial!
Vediamo di tradurre in un linguaggio simbolico i giri precedenti.
vediamo che il 5° codice e' uguale a (1°-30 +(6°-30) +(11° -30) +30)
Semplifichiamo mettendo nel 6° e nel 10° il valore 30h (0 zero nel codice ASCII)
5°=(1°-30 + (30-30)+(30-30)+30)
5°=1°-30+0+0+30
5°=1°-30+30
5°=1°
quindi mettendo il valore 30h nel seriale alle posizioni sesta e undicesima il primo
valore ed il quinto devono essere uguali.
Andiamo avanti
mov ecx, [eax] {
rol ecx, 6
xor ecx, 4021A9h
mov ebx, 4021C8h Codice di confusione :-) Ah! Bhè :) NdQue
xor ecx, ecx
xor edx, edx }
mov dh, 30h In dh il valore 30h
mov cl, [eax+1] In cl il 2° codice
mov ch, [eax+3] In ch il 4° codice
call sub_0_4014B1 Sempre quella di prima che sottrae
mov dl, [eax+9] In dl il 10° codice
call sub_0_4014BB Sempre quella di prima che somma
cmp cl, dl Solita comparazione
jnz loc_0_401126 diversi bad serial!
Traduciamo come prima
10°=(2°-30 + (4°-30) + (30-30) +30)
Mettiamo 30 nella quarta posizione del seriale
10°=(2°-30 + (30-30) + 0 +30)
10°=2°-30+30
10°=2°
Quindi con il 4° a valore 30 il 1° ed il 10° devono essere uguali.
mov cl, [eax+2] In cl il 3°
sub cl, 30h Sottrae 30 a cl
mov dl, [eax+8] In dl il 9°
sub dl, 30h Sottrae 30 a dl
cmp cl, dl Sono uguali ?
jnz loc_0_401126 NO! = seriale fasullo!
Qui' e' molto facile, il terzo ed il nono carattere del seriale devono essere uguali.
mov dh, 30h In dh mette 30
mov cl, [eax+6] In cl il 7°
mov ch, [eax+0Fh] In ch il 16°
call sub_0_4014B1 Ormai lo sapete cosa fanno queste 2
mov dl, [eax+0Eh] In dl il 15°
call sub_0_4014BB
cmp cl, dl Compara
jnz loc_0_401126
15°=(7°-30 + (16°-30) + 0 +30)
15°=7° se 16°=30h
mov dh, 30h
mov cl, [eax+6]
mov ch, [eax+0Fh]
call sub_0_4014B1
mov dl, [eax+0Eh]
call sub_0_4014BB
cmp cl, dl
jnz loc_0_401126
Uguale identica a quella di prima (distrazione o ulteriore confusione Que ????) Stavolta temo sia stata distrazione, hei guardate che ci vuole molta più PaTiENcE
per scriverlo un CrackMe come questo che per farlo!!! :p NdQue
mov cl, [eax+0Bh] 12°
mov ch, [eax+18h] 25°
mov dh, [eax+1Ch] 29°
call sub_0_4014B1
xor ebx, 402263h
mov dl, [eax+19h] 26°
call sub_0_4014BB
cmp cl, dl
jnz loc_0_401126
26°=((12°-30) + (25°-30) + (29-30) + 30)
Questa e' leggermente piu' complicata delle altre, ma si risolve cosi':
26°=((30-30) + (30-30) + (30-30) + 30)
26°=(0+0+0+30)
26°=30
mettendo tutte le posizioni coinvolte a 30h (semplice vero :-) )
mov cl, [eax+11h] 18°
mov ch, [eax+13h] 20°
call sub_0_4014B1
mov dl, [eax+0Ch] 13°
sub cl, ch
add cl, 30h
xor ebx, 4022C0h
cmp cl, dl
jnz loc_0_401126
13°=((18°-30)-(20°-30) + 30)
Anche qui' si puo' risolvere semplicemente mettendo tutto a 30h
13°=((30-30)-(30-30)+30)
13°=0-0+30
13°=30
mov cl, [eax+0Dh] 14°
mov ch, [eax+12h] 19°
mov dh, [eax+10h] 17°
mov dl, [eax+15h] 22°
call sub_0_4014B1
sub dl, 30h
xor ebx, 4021E7h
mov bl, [eax+17h] 24°
call sub_0_4014BB
sub cl, dl
cmp cl, bl
jnz loc_0_401126
24°=((14°-30) + (19°-30) + (17°-30) + 30) - (22°-30))
Risolvetela un po' voi (dai che e' piu' facile di quanto sembri :-O )
mov dh, 30h
mov cl, [eax+1Dh] 30°
mov ch, [eax+14h] 21°
call sub_0_4014B1
xor ebx, 402206h
mov dl, [eax+1Ah] 27°
call sub_0_4014BB
cmp cl, dl
jnz loc_0_401126
27°=((30°-30) + (21°-30) (30-30) + 30))
mov dh, 30h
mov cl, [eax+1Bh] 28°
mov ch, [eax+7] 8°
call sub_0_4014B1
mov dl, [eax+0Ch] 13°
sub cl, ch
add cl, 30h
cmp cl, dl
jnz loc_0_401126
13°=((28°-30) - (8°-30) +30)
Facciamo una bella maschera come la seguente
1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930
Ed inseriamoci i codici ottenuti, esempio dalla prima routine 1°e 5° uguali con 6° e
10° a 30h
1 2 3 4 5 6 7 8 9 101112131415161718192021222324252627282930
x x30 30
Abbiamo trovato il nostro bel seriale, lo mettiamo, diavolo non basta, Que ha messo
qualcos'altro.
Questi push qui' sotto fanno riferimento a delle chiavi del registry:
HKEY_LOCAL_MACHINE
Software\Microsoft\Internet Explorer
HKEY
Build
REG_SZ
Ebbene non lasciatevi infinocchiare, NON SERVONO A NIENTE!
E' una piccola trappoletta messa da illo per farci impazzire (comunque l'ho capito subito
prrr!) Eh vabbè mica posso fa una routine di distrazione della
stessa raffinatezza :) di quella del check vero....E poi come la crackavi, io so buono :)
hahahahah NdQue
push 4022DFh
push 4022F2h
push 402317h
call sub_0_401535
push 402317h
push 40231Ch
push 0
push 402322h
push 402329h
push 40232Dh
call sub_0_40152F
Qui' abbiamo il vero secondo controllo di registrazione.
Viene chiamata la OpenFile (sub_0_4014D5 non vi preoccupate Softice fe le mostra con il
loro vero nome basta che abbiate le export giuste nel suo winice.ini)
Patience cerca di aprire il file di nome config.sys, prima nella sua directory, e poi
nella directory del path, penso abbia usato questo nome sia per confondere le acque, il
nome config.sys e' molto conosciuto e vedendolo in memoria non da' subito dei sospetti,
sia per fare in modo che tracciando il prg con il File Monitor non dia subito all'occhio
un bel NOTFOUND.
Sappimi dire Que se ci ho azzeccato. Stavolta nulla è dovuto alla
distrazione, i motivi sono stai ANCHE questi
push 2
push 402041h
push 402036h
call sub_0_4014D5 OpenFile
mov ds:402105h, eax
cmp eax, 0FFFFFFFFh
jz loc_0_401126
push 0
push 0
push dword ptr ds:402175h
push dword ptr ds:402105h
call sub_0_4014CF SetFilePointer
push 0
push 402119h
push dword ptr ds:40213Fh
push 402148h
push dword ptr ds:402105h
call sub_0_4014DB ReadFile
xor ecx, ecx
Dal file vengono letti 9 caratteri da una certa posizione (sta' a voi trovarla, basta
usare ad esempio il file monitor di cui parlavo prima o guardare che valori vengono
passati alla SetFilePointer).
Questi valori vengono xorati seguendo una tabella residente in memoria per 3 volte con 3
valori diversi (tranne il primo che viane xorato 3 volte con lo stesso valore), nell
tabella vi e' anche una trappola abbastanza insidiosa, se viene letto un valore sbagliato
dal file, la prima volta, il programma sovrascrive la tebella stessa con dei valori
derivati dal codice sbagliato, quindi ogni volta bisogna resttare il programma uscendone e
rilanciandolo, quindi perdendo molto facilmente i breakpoint specifici sulle locazioni che
avevamo impostato in precedenza, quindi puntate il breackpoint sulla funzione ReadFile e
armatevi di pazienza.
mov al, [ecx+402148h] Carica i caratteri in AL
xor al, [ecx+402000h] 1° XOR
xor al, [ecx+402009h] 2° XOR
xor al, [ecx+402012h] 3° XOR
mov bl, al
xor bl, [ecx+40201Bh] Prepara codici di confusione
xor bl, [ecx+40202Dh] " " " "
cmp al, [ecx+402024h] Confronta con il valore giusto
mov [ecx+402000h], al {
mov [ecx+402009h], al
mov [ecx+402012h], al confonde la tabella gia' usata
mov [ecx+40201Bh], al
mov [ecx+402024h], bl
mov [ecx+40202Dh], bl }
jnz loc_0_401126
xor al, bl
cmp al, [ebx+40201Bh] Fake :-)
inc ecx
cmp ecx, 9
jnz short loc_0_401439
Ed ecco di seguito il congratulation by quequero!
push 20h
push 402199h
push 402179h
push 0
call sub_0_401517
retn
sub_0_4011C2 endp ; sp = -70h
Un trucchetto per non dover aggiornare di volta in volta il file e riavviare comunque
e' il seguente:
Prendete nota subito dei 9 valori che partono dalla locazione 402024h appena arrivate per
la prima volta su "cmp al, [ecx+402024h]", prendete nota anche di tutti valori
da xorare efate una tabella come la seguente:
Valore di confronto 1° xor 2° xor 3° xor
53 2 2 2
B7 14 AF 79
AF 8A F1 B1
ecc.. ecc.. ecc.. ecc..
(non volete mica la pappa pronta e')
Ora sfruttate softice se non avete la bellissima SHARP D.A.L. EL-556L che con 23.000 lire
vi fa' i calcoli in esadecimale, binario, ottale e logicamente decimale nel seguente modo:
Softice usa la sintassi del C per i calcoli, quindi se non conoscete il C vi dico io come
fare.
? 53^2^2^2
Softice vi rispondera' con 051 000081 'Q'
Quindi la prima lettera sra una Q maiuscola
? B7^79^AF^14
La seconda e' una u minuscola
? AF^b1^F1^8A
La terza e' una e minuscola
Quequero!!!! Urlerete Voi, invece vi sbagliate, e' meglio che andiate avanti, il buon Que
ci ha preso in giro anche qui' (Per Lui: mi e' piaciuto molto il codice :-) ) Hehe che Quequero giocherellone :)) grazie per il complimento al codice :)
il prossimo crackme non sarà così semplice :)))
Ebbene abbiamo finito, ho perso 2 ore di una domenica mattina per passare sta' protezione
e scrivere sto tutorial, spero di essere stato esauriente, per qualsiasi domanda:
TiN_MaN