Banco 2.5
(Da Demo non registrabile a Registrato con seriale)


21/06/99

by [aLT255]

 

 

UIC's Home Page

Published by Quequero


e

Buon tutorial specialmente indicato ai newbies che spiega in modo molto dettagliato il modo in cui è generato il seriale.

 
 
E-mail: [email protected]
[aLT255] in IRCnet: #crack-it
 

Difficoltà

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

 

In questo semplice tut vedremo come talvolta anche un programma che si presenta come demo non registrabile nasconde all'interno il form per la registrazione. Una volta reso registrabile, il tut si concentrerà sullo studio della routine per la seriale (non preoccupatevi, è molto semplice), si tratterà di fare qualche addizione, divisione, riporti e cose di questo tipo che tutti abbiamo imparato alle scuole elementari :)

Spero che a qualcuno possa risultare utile, non tanto per vincere al lotto ma per familiarizzare con le seriali!


Banco 2.5
(Da Demo non registrabile a Registrato con seriale)
Written by [aLT255]

Introduzione

Ok, ancora un altro programma sul lotto... eh eh, prometto che d'ora in poi li lascerò stare, se no Quequero mi picchia :))) (Hai colto nel segno :)))) NdQuequero) E' un crack per Newbies, quindi non mi tirate le arance per questo tut, se la protezione è troppo semplice, è solo per dare una mano a coloro che stanno iniziando e si avventurano da poco con Winice. Premetto che il programmatore di Banco ha utilizzato + - la stessa protezione su tutti gli altri programmi di sistemistica da lui realizzati, per cui... fate voi ;)
 

Tools Usati

Winice 3.2x
W32dasm 8.9
HexWorkshop

URL o FTP del programma

Http://www.LaSchedina.com (lo trovate anche all'interno di alcune riviste di pc in edicola dentro il pacchetto Il Sistemista, non vi dico quale per non fare pubblicità :)))

Notizie sul programma

Si tratta di un programma per l'elaborazione di sistemi per lotto, con funzioni di Archivio, Riduzione, Condizionamenti etc etc...

Essay

Va beh, passiamo al nostro programmetto.
Per crakkarlo possiamo seguire due strade:
a) patcharlo;
b) trovare la seriale.
Per questo tut seguirò la seconda strada...
Si parte, lanciamo il programma e vediamo che tipo di protezione ci riserva e che aspetto
ha :)
Osserviamo la barra degli strumenti... notate la voce "Codice"?
Ok, clickiamo e vediamo che ne vien fuori...
DEMO NON ATTIVABILE!!!   <---- uh???
Ma mi prendi in giro?? 
Scusate, ma... se non è attivabile, perchè ci metti il popup "Codice" nel programma? 
hmm... non so voi ma io non mi fido. 
Proviamo un attimo a disassemblarlo (io ho usato w32dasm, non è il caso di scomodare
IDA Pro per questa crack...) per vedere se sta mentendo...
Cercate la stringa DEMO NON ATTIVABILE con String Data Reference, scorrete scorrete e
voilà... che fortuna eccola lì... vediamo dove sta nel codice, clikkate e date un'occhiata
ora...
:004152B9                  test al,al
:004152BB                  jne 004152D8  
<------ Questo ci permette di passare  
                                                  all'indirizzo 004152D8 dove ci sta
                                                  il form per inserire i dati di 
                                                  registrazione (se il prog fosse 
                                                  registrabile, nel nostro caso non salta)

:004152BD                  push 00000010
 
* Possible StringData Ref from Data Obj ->"DEMO NON ATTIVABILE"
                                             |
:004152BF                      push 004CC3B0
* Possible StringData Ref from Data Obj ->"Attenzione: Questo programma non "
[...]   
                                            |
* Reference To: Lotto._ChiaveFrm
                               |
:004152D8                     mov edx, dword ptr [004DCE70]  <--- l'indrizzo 004DCE70 punta al form
 
Per cui tutto quello che dobbiamo fare è prendere un editor esadecimale e cambiare il jne in je
Fatto questo facciamo ripartire il prog e vediamo che ora se premiamo su Codice ci appare il nostro bel Form di registrazione... per cui, avevo ragione, stava mentendo :)))
Ora passiamo alla parte + carina, quella della seriale, armatevi di Winice se non lo avete ancora fatto ed iniziamo...
Ci sono 4 righe... azz e quanta roba vuole??
"Inserite le 4 righe che avete ricevuto nell'esatto modo con cui le avete ricevute etc
etc "
Se se ...   ;))) NdQue
L'ultima riga è quasi sicuramente il codice seriale... ed i primi tre...?
Batman e Robin
Supereroi
Via della Giustizia,1
CODICE
Vi tornano i conti? Non ci giurerei ma potrebbe essere una cosa del genere...
Proviamo ad utilizzare solo la prima e l'ultima riga e vediamo se ci avverte che mancano 
campi da inserire...
CODICE ERRATO!
Ora provate a riempirli tutti e da lo stesso messaggio.
Per cui, riinseriamo nella prima riga il nostro nome e nell'ultima un codice fittizzio:
1^ RIGA: [aLT255]
U^ RIGA: 111333111
Prima di premere il pulsante di conferma settiamo Winice con questi BPX:
BPX GetWindowTextA
BPX GetDlgItemTextA
Proviamo...
Hmm non funzia... fa niente, non disperate a cercate quale api abbia utilizzato, provate con
BPX HmemCpy che c'è sempre nelle manipolazioni delle stringhe (ricordatevi di disattivare
gli altri)
Una volta poppato Winice, premete F12 fino a che non vi ritrovate nel codice a 32 bit (basta guardare in sice in alto a destra e se c'è scritto PROT32 allora state nel codice a 32bit ndQue),

per cui un'occhiata agli indirizzi, dovete passare dalla forma XXXX:XXXX a XXXX:XXXXXXXX ok?
Steppate con F10 e dopo un pò dovreste trovarvi ancora nei meandri di qualche api... (Kernel32)
Ancora F12 fino a tornare nel nostro codice a 32 bit e poi ancora F10, fino a trovarvi nel codice qua sotto:
Qua le cose iniziano a farsi interessanti...
:004386A7                     push ecx
:004386A8                     lea eax, dword ptr [ebp-288]     <--- ebp-288 punta al nome che abbiamo
                                                                    inserito, e viene caricato in eax

fate:
>d ebp-288 per verificare e tenete puntato sempre questo indirizzo per ora...
Continuate a steppare con F10
:004386AE                     push eax
:004386AF                     Call 004CA9C4
:004386B4                     add esp, 00000008
:004386B7                     dec [ebp-48]             
:004386BA                     lea eax, dword ptr [ebp-18]
:004386BD                     mov edx, 00000002
:004386C2                     call 004C9C24  <---------------------- da questo indirizzo viene richiamata una 
                                                                     sequenza di byte che in ASCII è:
                                                                     I12N13TE43R235NET LI25B12E23RA  
                                                                     ...cos'ho sentito?? la pass?? Naaaa ho detto
                                                                     che era semplice ma non fino a questo
                                                                     punto...
(Non dire che non l'hai provata ndQue :)
:004386C7                     push 004D8D32                          
:004386CC                     lea ecx, dword ptr [ebp-288]   
:004386D2                     push ecx
:004386D3                     Call 004CA9C4 <----------------------- e qui viene sommata al nostro nome in ebp-288
                                                                     se stavate sempre puntando su questo indirizzo ve ne sarete accorti
:004386D8                     add esp, 00000008
:004386DB                     xor ebx, ebx
:004386DD                     lea eax, dword ptr [ebp-0094]   <---- prende 4 byte dall'indirizzo 0075F7EC 
                                                                                                 e li mette in eax
Per vedere cosa sta succedendo a quell'indirizzo:
>d ebp-94
dovreste avere questi bytes:
:0075F7EC | A8 00 02 88 41 0D A7 17-01 00 etc....
teneteli d'occhio mentre continuate a steppare con F10

:004386E3                      mov byte ptr [eax], 00 <---------------- mette uno zero all'indirizzo 0075F7EC
                                                                        Quindi al posto di A8 ci ritroviamo "00"
:004386E6                      inc ebx                          
:004386E7                      inc eax
:004386E8                      cmp ebx, 0000000B  <------------ e così via fino a che ebx è uguale a 0B (cioè 11)
:004386EB                      jl 004386E3
 
quindi all'indirizzo 0075F7EC abbiamo:
:0075F7EC | 00 00 00 00 00 00 00 00-00 00 etc...
 
:004386ED                     xor ebx, ebx
:004386EF                     lea esi, dword ptr [ebp-288]     <------- nostro_nome+I12N13TE43R235NET                                                                                             LI25B12E23RA viene caricato in esi... sicuramente ora ci 
                                                                                          farà qualcosa...
:004386F5                     jmp 00438728
:00438728                     mov cl, byte ptr [esi]    <-------------- carica il primo carattere, nel mio caso "["
:0043872A                     test cl, cl                      <------- e va all'indirizzo 004386F7 per seguire la
                                                                        prima routine e così via per tutti quanti fino all'ultimo. Una volta                                                                           esaminati tutti passa  alla seconda routine.

:0043872C                     jne 004386F7

Qua inizia la PRIMA ROUTINE per la seriale, per cui maggiore attenzione:
 
:004386F7                     mov eax, ebx     <--------------- ebx era 0 e porta a 0 anche eax
:004386F9                     mov edi, 0000000A                
:004386FE                     cdq      <----------------------- converte una doubleword in quadword per preparare 
                                                                una divisione con segno (Signed)
:004386FF                     idiv edi   <--------------------- divide eax per edi e mette il resto in edx
:00438701                     mov edi, edx   <----------------- il resto della divisione viene spostato in edi  
:00438703                     movsx edx, cl  <----------------- il primo carattere del 
                                                                nostro_nome+I12N13TE43R235NET LI25B12E23RA viene 
                                                                spostato in edx
:00438706                     movsx eax, byte ptr [ebp+edi-94] <-- prende un byte dall'area di memoria ebp-94  
                                                      ci somma il resto della divisione recedente (se c'era) e mette il risultato in eax

:0043870E                     add eax, edx    
<----------- il nostro carattere viene aggiunto al valore di eax
:00438710                     mov ecx, 0000001A     
:00438715                     add eax, ebx <--------------- aggiunge ad eax il valore di ebx che parte da 0
:00438717                     inc ebx     <---------------- e poi viene incrementato di uno ad ogni ciclo
:00438718                     add eax, 0000000F  
:0043871B                     cdq         <---------------- coverte una double in quad
:0043871C                     idiv ecx   <----------------- divide eax per 1A (valore di ecx) e mette il resto
                                                            in edx
I resti vengono calcolati in questa maniera:
Il primo byte è per me 5B che in ASCII è "[".
A questo dovremmo aggiungere il resto della divisione di edi di prima, ma è 0 per i primi 10 cicli, aggiungere il valore di ebx, che però parte da 0, e quindi per il primo byte somma 0, poi sommare 0F, ed il valore ottenuto diviso per 1A-.
Quindi 5B+0F=6A    6A/1A=4  Ora per sapere il resto moltiplichiamo 4*1A=68  e sottraiamo 6A-68=02 <-- questo è il primo resto. Capito?
Comunque tenete sempre puntato l'indirizzo di memoria di ebp-94, 0075F7EC e capirete tutto e vedrete come vengono trattati i nostri caratteri...
 
:0043871E                       push edx                         
:0043871F                       inc esi
:00438720                       pop eax
:00438721                       mov byte ptr [ebp+edi-00000094], al   
:00438728                       mov cl, byte ptr [esi]
:0043872A                       test cl, cl
:0043872C                       jne 004386F7
 
alla fine della prima routine in ebp-94 ho:
:0075F7EC 0E 0B 11 0F 0E 07 11 0E 12 14
 
SECONDA ROUTINE:
:0043872E                       xor ebx, ebx
:00438730                       lea ecx, dword ptr [ebp-0094]  <--- ecx ora ha l'indirizzo di ebp-94, 0075F7EC
:00438736                       add byte ptr [ecx], 41         <--- aggiunge 41 a quel primo byte all'indirizzo
                                                                                                0075F7EC

:00438739                       inc ebx
:0043873A                       inc ecx
:0043873B                       cmp ebx, 0000000A    <-------------- e fa così per tutti e dieci i byte
:0043873E                       jl 00438736
 
Svolgiamo la somma:
 
0E 0B 11 0F 0E 07 11 0E 12 14 +
41 41 41 41 41 41 41 41 41 41  =
---------------------------------------
4F 4C 52 50 4F 48 52 4F 53 55    che in ASCII è:  O L R P O H R O S U

:00438740                     xor ebx, ebx
:00438742                     lea ecx, dword ptr [ebp-0094]
:00438748                     xor esi, esi
:0043874A                     lea eax, dword ptr [ebp-0094]
:00438750                     mov dword ptr [ebp-78], eax
:00438753                     mov edi, ecx

TERZA ROUTINE:
Molto simile a quella vista prima... vi metto qualche commento a lato:
 
:00438755                     mov edx, dword ptr [ebp-78] 
:00438758                     inc esi
:00438759                     movsx eax, byte ptr [edi]     <-------- mette il primo byte della prima pass ottenuta
                                                                                                        (mi riferisco a  "OLRPOHROSU") in eax
:0043875C                     movsx edx, byte ptr [edx]     <-------- mette lo stesso byte in edx
:0043875F                     add eax, edx                  <-------- li somma ed il risultato in eax
:00438761                     push ecx       
:00438762                     cdq       
:00438763                     mov ecx, 0000001A      <--------------- aggiunge 1A ad ecx
:0043876                        idiv ecx   <-------- e divide eax per 1A mettendo il risultato in eax ed il resto in edx
:0043876A                     pop ecx
:0043876B                     mov byte ptr [edi], dl        
:0043876D                     inc [ebp-78]
:00438770                     cmp esi, 0000000A             <--------- fai questo loop per tutti e 10 i byte
:00438773                     jl 00438755
:00438775                     add byte ptr [ecx], 41     <--------- aggiunge 41 a quello che abbiamo all'indirizzo di ecx
:00438778                     inc ebx
:00438779                     inc ecx
:0043877A                     cmp ebx, 0000000A             <--------- fino a che non si è esaminata tutta la pass...
:0043877D                     jl 00438748
 
A questo punto abbiamo finito. Se stavate guardando come vi avevo sempre detto da diverse righe a questa parte, all'indirizzo di memoria ebp-98, avrete visto
costruire nella finestra del codice ASCII di Winice la vostra password. 
Per me, la password finale è:
1^RIGA: [aLT255]
U^RIGA: SYCAXJRSFM
Se provate ad inserire anche gli altri campi, prima di giungere alle routine che abbiamo visto sopra dovrete steppare con F12 ed F10 più volte, perchè la routine inizierà un pò prima, non l'ho messa qua nel tut se no diventava una cosa 
lunghissima e pallosa. Ve lo lascio a voi come esercizio.
Spero che ciò che ho scritto in queste righe possa servire a qualcuno che sta ancora all'inizio per impratichirsi un pò 
più con le routine delle seriali. Scusate per gli errori tecnici, anche io sono un newbie :)
Note finali 

Vorei ringraziare e salutare: Quequero, sempre gentilissimo e disponibile in tutto, per aver corretto i grossi errori tecnici presenti in questo tut, per non essersi mai stancato per tutte le domande che fin'ora gli ho fatto su hackz, crackz e chi + ne ha ne metta :))) ; Neural_Noise, per avermi fatto conoscere il chan crack-it quando ancora vagavo in efnet, per tutti i favori che mi ha fatto, (Fguard ti dice qualcosa?) gli aiuti, i consigli, e per il tempo che spesso gli faccio perdere ;P ; Guybrush, praticamente il BOT di crack-it ;))) ; T3X, ka10, PE_WoW e tutti gli altri che ora non sto citando perchè son suonato della crew di Ringzer0 e del canale Crack-it e non ricordo.

Byez

[aLT255]
 

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato. Se il programma in questione dovesse essere di vostro gradimento ed intendete utilizzarlo allora compratelo, non usate quello rippato. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto a puro scopo didattico e non vuole assolutamente essere un incitamento alla pirateria.
Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembler. 

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

Home  Assembly  CrackMe  IRC  Links  NewBies
News  Forum Hacking  Tools
Tutorial

UIC