Ma Quanto Mi Costi 3.0
(Da demo 30 giorni a illimitata)

 

23-08-1999

by Ritz

 
 

UIC's Home Page

Published by Quequero

 

Ecco a voi un ottimo tute (oltre che ben scritto) da Ritz, indicato soprattutto ai newbies :)))

 
 

E-mail: [email protected]

Nick IRC: Ritz, UIN: 41793377, on IRC: #crack-it
 

Difficoltà

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

 

Ciao a tutti! Io mi chiamo Ritz, e in questo tute cercherò di spiegare la sprotezione di un programma che non offre alcuna possibilità di registrazione (o almeno io non l'ho trovata... :-) ). Di conseguenza, l'unica cosa da fare sarà forzare il codice in alcuni punti. Dopo aver fatto ciò, sarà inoltre necessario togliere un fastidioso nag-screen iniziale.

Mi auguro che tale tutorial possa risultare utile soprattutto per migliorare la conoscenza in alcuni aspetti del linguaggio Assembly, naturalmente, e per imparare a "sfondare", se necessario, parte del codice nel caso in cui non sia possibile agire su altri punti quali, in questo caso, un form di registrazione.


Ma Quanto Mi Costi 3.0
(Da demo 30 giorni a illimitata)
Written by Ritz

Introduzione


Che dire, questo testo non è certo stato scritto per guru del reversing, è rivolto soprattutto ai newbies, di conseguenza non scrivetemi mail offensive se pensate che la protezione sia troppo semplice ;-)... In ogni caso, penso che costituisca un buon esempio per cominciare (dopotutto this is my first tute...). È gia la seconda volta che ti rifugi dietro questa scusa :) NdQue

Tools usati

SoftIce 3.x
W32dasm
Hiew 6.04 (o cmq un editor esadecimale)

URL o FTP del programma

http://space.tin.it/internet/apizzegh (si trova anche dentro il CD-ROM di alcune riviste informatiche).

Notizie sul programma 

Questo proggy è un contascatti per le connessioni Internet che calcola la spesa a seconda dell'ora di connessione e del tipo di tariffa, tenendo anche una bolletta di tutta la spesa effettuata.

Essay

OK... tutti pronti? Sì? Perfetto...Sigaretta, Martini Dry, VIA! SE PARTE!!

Allora, installato il programmillo? Perfetto... avviatelo: cercare ora un menù tipo About/Register. Azz, non c'è, provate ora a guardare l'iconetta del Systray: clic destro, scegliete "Informazioni su MQMC32", vi apparirà un menu... okkakkio, nemmeno lì si può mettere il serial... come si fa? Beh, evidentemente il programma è uno di quelli che dopo 30 gg. si suicidano e basta. Quindi? Semplice... chiudete l'icona del Systray, portate avanti la data di 4-5 mesi, riavviate il prog...E, eccovi apparire il messaggio che vi dice che non lo potete più avviare perchè il periodo di valutazione è scaduto. Male, molto male. Bisogna lavorarci un po' su, che ne dite?

Allora, innanzi tutto bisogna far sì che il prog. possa essere avviato...Proviamo quindi a intercettare la funzione che manda il nag iniziale... CTRL+D per poppare nel Sice, quindi bpx messageboxa. Usciamo con CTRL+D, riavviamo tutto, e... kakkio il debugger non poppa prima della messagebox... perchè mai? Se avete notato, quando il messaggio appare il PC fa un "beep", vero? Bene, allora proviamo a cambiare il BPX con un messagebeep: togliete l'iconetta del MQMC dal Tray, entrate nel Sice, scrivete bpx messagebeep, uscite, avviate il MQMC, e, voilà, il vostro debugger preferito fa la sua comparsa!! Usciti dalla funzione con F11, dovreste attraccare qui:

:0048A202 PUSH 32

Sì? Perfetto! Adesso cancellate tutti i bpx del Sice con bc *, aprite il vostro W32dasm, disassemblate il file mqmc32.exe... bzzzzzzzzz....zzzzzz...bzzzzzzzz. Finito!! Ora andate nel menu Search/Find text, scrivete :0048A202, aspettate un po'... e dovreste arrivare a questo punto:

* Possible StringData Ref from Code Obj ->"10474"
|
:0048A1D9 mov edx, 0048A63C
:0048A1DE call 00403F04
:0048A1E3 jne 0048A228
<-- Jump importante... servirà un po' più avanti.
:0048A1E5 mov eax, dword ptr [0049C244]
:0048A1EA cmp dword ptr [eax], 00000000
:0048A1ED je 0048A1FB
:0048A1EF mov eax, dword ptr [0049C244]
:0048A1F4 mov eax, dword ptr [eax]
:0048A1F6 call 00430A74

* Jump at Address:
|:0048A1ED(C)
|
:0048A1FB push 00000000

* Reference To: user32.MessageBeep, Ord:0000h
|
:0048A1FD Call 00406C9C
:0048A202 push 00000032
:0048A204 mov cx, word ptr [0048A644]
:0048A20B mov dl, 02

* Possible StringData Ref from Code Obj ->"MQMC323.0"
|
:0048A20D mov eax, 0048A650
:0048A212 call 00444C24
:0048A217 mov eax, dword ptr [0049C28C]
:0048A21C mov eax, dword ptr [eax]
:0048A21E call 00432A34
:0048A223 jmp 0048A5A7

* Jump at Address:
|:0048A1E3(C)
|
:0048A228 8D4DB0 lea ecx, dword ptr [ebp-50]

Allora... analizziamo il codice... in 48A1FD c'è la call del nag-screen... osservando ora 48E1ED si vede un JE... Jump if Equal... cambiandolo in JMP si salterebbe la CALL a 41A8F6... implicata probabilmente nel suicidio del programma dopo il suo avvio (Quequero spero che tu possa confermare... le mie sono più che altro supposizioni... :-))) Lo farei se avessi il programm, ma non ce l'ho e poi che te frega, al limite ci fai brutta figura :))) NdQue. Dunque, segnatevi l'OFFSET di 48E1ED: dovrebbe essere 895ED... bene, fatevi una copia di MQMC.exe e lasciatela nella stessa cartella, aprite Hiew, caricate la copia, premete F4, scegliete Decode, poi F5, scrivete l'OFFSET, premete INVIO, quindi F3 per cambiare il byte 75 in EB (jump incondizionale), F9 per aggiornare lo schermo, F10 per uscire. Ora dalla cartella del MQMC caricate la copia (quella taroccata), e vi apparirà ancora il nag (questo era previsto), ma, se cliccate OK, il prog PARTE!! Lo avete crackaaatooo. Se ci siete riusciti, complimenti, altrimenti rileggetevi tutto daccapo...

Ora però c'è un piccolo problema teknico: il nag-screen che rompe le palle: uhm... vediamo che se po' fa'.

Vedete la call a 48A1FD? Quella sarà la routine da fottere: infatti, è proprio quella che richiama la Message Box. Fate doppio clic col topo e in mezzo alla barra dei pulsanti del Dasm dovrebbe "accendersi" una scritta: CALL. Cliccateci sopra. (* Cazzo mi si sta inkiodando il Winkaz... 67% risorse disponibili... pork putt meglio riavviare... schiusatemi un attimo... torno subito, il mio Celeron overclokkato tra un po' si fonde... OK ho riavviato... ora mi sento più tranquillo... ripartiamo*) Anche io c'ho il Mendocino overclokkato NdQue. Avete clicato sulla CALL? Bene, allora ora vi trovate qui:

* Referenced by a CALL at Addresses:
|:00455B69 , :00455E97 , :00458189 , :00461087 , :004612F6
|:00461326 , :0046A09B , :0046A100 , :0046ABB4 , :0046AC3D
|:0046ACAF , :0046AD10 , :0046AD71 , :0046ADDE , :0046B8A6
|:0046B909 , :0047E62A , :00484B80 , :00484F17 , :0048A1FD
|:0048A3AE , :0048A42F , :0048D945 , :00491AA1 , :004922CD
|:00492AC6 , :0049328D
|

* Reference To: user32.MessageBeep, Ord:0000h
|
:00406C9C Jmp dword ptr [0049F66C]
:00406CA2 mov eax, eax

In teoria ora bisognerebbe fare un lavoretto, ovverosia (WOW!) spulciare OGNUNO degli indirizzi sopra... fate una prova: andate a :00455E97. Due righe più in altro vedrete un jne che, se eseguito, SALTA COMPLETAMENTE VIA la call. Ecco quindi che bisognerebbe cambiarlo in JMP. Tornate ora a :00406C9C; capito cosa dovete fare? Andare in OGNUNA delle CALL sopra, trovare i JUMP che le saltano e cambiarli in JMP incondizionali... il problema è che non tutte tali call sono necessarie, anzi, e inoltre alcune, come ad esempio la prima (:00455B69), non hanno jump che le possano evitare nei dintorni... insomma, un casino... ecco perchè ho deciso di dirvi io direttamente quali sono quelle su cui agire (vi pensate che lavorazzo ho fatto?!): l'importante è che voi capiate il concetto per poi poterlo applicare nelle varie occasioni.

Andate in :0048A1FD. Vi troverete nel codice visto all'inizio: ecco a cosa serve il jne a :0048A1E3!!! E' uno di quelli che fottono la CALL!! Infatti se eseguito il proggy salta più avanti!

Ora posteggiate il kulo in :0048A3AE. Sarete qui:

* Possible StringData Ref from Code Obj ->"0003"
|
:0048A321 mov edx, 0048A728
:0048A326 mov eax, dword ptr [ebx+00000220]
:0048A32C call 0045FA70
:0048A331 lea edx, dword ptr [ebp-50]
:0048A334 lea eax, dword ptr [ebp-40]
:0048A337 call 00404C0C
:0048A33C mov eax, dword ptr [ebp-40]
:0048A33F lea ecx, dword ptr [ebp-3C]
:0048A342 mov edx, 00000004
:0048A347 call 00489D84
:0048A34C mov ecx, dword ptr [ebp-3C]
:0048A34F lea eax, dword ptr [ebp-38]
:0048A352 mov edx, 0048A630
:0048A357 call 00403E40
:0048A35C mov eax, dword ptr [ebp-38]
:0048A35F call 00407F84
:0048A364 mov dword ptr [ebp-54], eax
:0048A367 fild dword ptr [ebp-54]
:0048A36A add esp, FFFFFFF8
:0048A36D fstp qword ptr [esp]
:0048A370 wait
:0048A371 lea eax, dword ptr [ebp-04]
:0048A374 call 00409D38
:0048A379 cmp dword ptr [ebp-04], 00000000
:0048A37D je 0048A3D9
:0048A37F mov eax, dword ptr [ebp-04]
:0048A382 call 0040A4B0
:0048A387 fstp qword ptr [ebp-1C]
:0048A38A wait
:0048A38B fld qword ptr [ebp-0C]
:0048A38E fcomp qword ptr [ebp-1C]
:0048A391 fstsw ax
:0048A393 sahf
:0048A394 jnb 0048A3D9
<-- Jump if not below... interessante non vi sembra?
:0048A396 mov eax, dword ptr [0049C244]
Guardate DOVE salta: DOPO la CALL
:0048A39B cmp dword ptr [eax], 00000000
a :0048A3AE!! Bene bene...
:0048A39E je 0048A3AC
:0048A3A0 mov eax, dword ptr [0049C244]
:0048A3A5 mov eax, dword ptr [eax]
:0048A3A7 call 00430A74

* Jump at Address:
|:0048A39E(C)
|
:0048A3AC push 00000000

* Reference To: user32.MessageBeep, Ord:0000h
|
:0048A3AE Call 00406C9C
:0048A3B3 push 00000032
:0048A3B5 mov cx, word ptr [0048A644]
:0048A3BC mov dl, 02

* Possible StringData Ref from Code Obj ->"MQMC323.0"
|
:0048A3BE mov eax, 0048A650
:0048A3C3 call 00444C24
:0048A3C8 mov eax, dword ptr [0049C28C]
:0048A3CD mov eax, dword ptr [eax]
:0048A3CF call 00432A34
:0048A3D4 jmp 0048A5A7

* Jump at Addresses:
|:0048A37D(C), :0048A394(C)
|
:0048A3D9 mov cx, word ptr [ebp-28]
:0048A3DD mov dx, word ptr [ebp-26]
:0048A3E1 mov ax, word ptr [ebp-24]
:0048A3E5 call 00408F88
:0048A3EA fstp qword ptr [ebp-5C]
:0048A3ED wait
:0048A3EE mov cx, word ptr [ebp-22]
:0048A3F2 mov dx, word ptr [ebp-20]
:0048A3F6 mov ax, word ptr [ebp-1E]
:0048A3FA call 00408F88
:0048A3FF fsubr qword ptr [ebp-5C]
:0048A402 call 00402A98
:0048A407 mov word ptr [0049DC04], ax
:0048A40D cmp word ptr [0049DC04], 001E
:0048A415 jbe 0048A485
:0048A417 mov eax, dword ptr [0049C244]
:0048A41C cmp dword ptr [eax], 00000000
:0048A41F je 0048A42D
:0048A421 mov eax, dword ptr [0049C244]
:0048A426 mov eax, dword ptr [eax]
:0048A428 call 00430A74

Infine in :0048A42F. Attraccherete qui:

* Jump at Addresses:
|:0048A37D(C), :0048A394(C)
|
:0048A3D9 mov cx, word ptr [ebp-28]
:0048A3DD mov dx, word ptr [ebp-26]
:0048A3E1 mov ax, word ptr [ebp-24]
:0048A3E5 call 00408F88
:0048A3EA fstp qword ptr [ebp-5C]
:0048A3ED wait
:0048A3EE mov cx, word ptr [ebp-22]
:0048A3F2 mov dx, word ptr [ebp-20]
:0048A3F6 mov ax, word ptr [ebp-1E]
:0048A3FA call 00408F88
:0048A3FF fsubr qword ptr [ebp-5C]
:0048A402 call 00402A98
:0048A407 mov word ptr [0049DC04], ax
:0048A40D cmp word ptr [0049DC04], 001E
:0048A415 jbe 0048A485
<-- Jump if below or equal... WOW un altro che salta DOPO
:0048A417 mov eax, dword ptr [0049C244]
la CALL!!
:0048A41C cmp dword ptr [eax], 00000000
:0048A41F je 0048A42D
:0048A421 mov eax, dword ptr [0049C244]
:0048A426 mov eax, dword ptr [eax]
:0048A428 call 00430A74

* Jump at Address:
|:0048A41F(C)
|
:0048A42D 6A00 push 00000000

* Reference To: user32.MessageBeep, Ord:0000h
|
:0048A42F Call 00406C9C
:0048A434 lea ecx, dword ptr [ebp-38]
:0048A437 mov edx, 00000006
:0048A43C mov eax, 000028EA
:0048A441 call 00489F6C
:0048A446 mov edx, dword ptr [ebp-38]
:0048A449 lea eax, dword ptr [ebp-50]
:0048A44C call 00404C60
:0048A451 lea ecx, dword ptr [ebp-50]

* Possible StringData Ref from Code Obj ->"0001"
|
:0048A454 mov edx, 0048A620
:0048A459 mov eax, dword ptr [ebx+00000220]
:0048A45F call 0045F848
:0048A464 push 00000032
:0048A466 mov cx, word ptr [0048A644]
:0048A46D mov dl, 02

* Possible StringData Ref from Code Obj ->"MQMC323.0"
|
:0048A46F mov eax, 0048A650
:0048A474 call 00444C24
:0048A479 mov eax, dword ptr [0049C28C]
:0048A47E mov eax, dword ptr [eax]
:0048A480 call 00432A34

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0048A281(U), :0048A415(C)
|
:0048A485 call 00409148
:0048A48A call 00402A98
:0048A48F lea ecx, dword ptr [ebp-38]
:0048A492 mov edx, 00000004
:0048A497 call 00489F6C
:0048A49C mov edx, dword ptr [ebp-38]
:0048A49F lea eax, dword ptr [ebp-50]
:0048A4A2 call 00404C60
:0048A4A7 lea ecx, dword ptr [ebp-50]

OK perfetto... lavoro praticamente finito... per eliminare il nag basta cambiare i 3 JUMP indicati sopra in JMP incondizionali. Come fare ve l'ho già spiegato sopra... e infine rinominare prima il file MQMC.exe come cazzo volete, poi la sua copia in MQMC32.exe. Tutto chiaro? Bene: PROGRAMMA CRACKATO.

RIASSUMENDO

INDIRIZZI HA CAMBIARE:

Per il programma: 48A1ED (OFFSET 895ED da je a jmp).

Per il nag-screen: 48A1E3 (OFFSET 895E3 da jne a jmp), 48A394 (OFFSET 89794 da jnb a jmp), 48A415 (OFFSET 89815 da jbe a jmp)


OK ho finito... uff che fatica... non pensavo che scrivere un tute fosse così lungo... Que cazzo ora capisco perchè lavori così tanto...Ah! Lo vedi che quando dico che mi faccio il mazzo ho ragione NdQue :)))))

Bene, spero che esso vi sia stato utile, io da parte mia ho cercato di scriverlo nel migliore dei modi, cioè semplice e comprensibile a tutti. Se vi piace, non vi piace, volete insultarmi, ecc.... basta che mandiate un'e-mail all'indirizzo sopra.

SeE YoU sOoN,

                                                                                                                 Ritz
Note finali


Vorrei ora ringraziare un bel po' di persone..... ometto di dilungarmi troppo sulle rispettive motivazioni, altrimenti questa parte viene più lunga dell'Essay...

Ringrazio e saluto: Quequero innanzi tutto (spero di riuscire a vederti prima o poi in IRC! :-))) Quando mi piacerebbe poterci tornare in IRC :))) NdQue per aver publicato, corretto in certi punti il mio tute e per l'impegno che sta dimostrando con l'UIC, [aLT255], ^courier, mOoNsHaDoW e WhiteFly, sempre molto disponibili su IRC, xOANINO (il mito), tutti i Ringzer0 (per i loro tute e perchè sono GRAAANDIII), in generale tutto il chan di crack-it e tutti coloro che (spero ciò non sia accaduto :-)) mi sono dimenticato di nominare.

Saluto anche DFX, grande amico nonchè compagno di scuola, il Morando (altro amico) e coloro che sono arrivari a leggere fino in fondo questo tute... GRAZIEEEEE!!!! E mi raccomando: citando una frase di...azz chi era... boh... non so, spero che costui mi perdonerà per il copyright violato... ricordate: "A day without learning is a lost day..." Impariamo, gente, impariamo.

Ciauz a tutti,

Ritz

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   Assembly   ContactMe   CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC