Patience
(Live approach)

 

22 Agosto 1999

by "TiN_MaN "

 

 

UIC's Home Page

Published by Quequero


Tutorial davvero bellissimo di Tin_Man oltre che divertente, rimboccatevi le maniche e leggetelo :)) verrà crackato il CrackME PaTiENcE che ho scritto io e troverete nella sezione crackme :)

 
UIC's form
Home page http://www.playboy.com 
E-mail: [email protected]
TiN_MaN, #crack-it
UIC's form

Difficoltà

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

Svisceriamo i segreti del crackme Patience scritto da Quequero


Patience
(Live approach)
TiN_MaN

Un CrackMe non molto difficile, ma come dice il suo nome da affrontare con molta pazienza e rilassatezza, sopratutto per non farsi confondere da diverse trappoline anche se semplici.

Armatevi di pazienza ed incominciamo.

Tools usati

SoftIce 3.xx/4.xx

URL/FTP del programma

quequero.cjb.net

Notizie sul programma 

Crakme
          

Essay

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]
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

Note finali


Come avete notato il codice non era poi cosi' difficile dal punto di vista della protezione adottata, solo laborioso, ringrazio Quequero per il lavoro svolto e per l'idea della UIC.

Un saluto a tutti i membri di RingZer0 e ai frequentatori del canale #crack-it.

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. 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.

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC