Cracking di Microangelo 98


19-12-1999

by "DaRk PlaGuE"

 

14-12-99

UIC's Home Page

Published by Quequero


Buon Natale a tutti i cracker (anche se sono un po' in anticipo)

Mancano un po' di commenti al codice ma nel complesso il tute è buono e può essere utile

Che lavoraccio scrivere i tutorial. E' la parte del cracking che mi piace di meno.
UIC's form
E-mail: [email protected]
UIC's form

Difficoltà

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

 

Mettetevi comodi perchè in questo tutorial vi spiegherò come rendere eterno Microangelo 98 affrontando i cinque programmi di cui è composto (Animator, Studio, Librarian, Explorer e Engineer).


Cracking of Microangelo 98
Written by DaRk PlaGuE

Introduzione

Eccomi alle prese con il mio terzo tutorial per la UIC. Dopo circa un mesetto di lavoro, più che saltuario, stasera ho finalmente finito di crackare Microangelo 98. Mi sto accorgendo solo ora che il tutto era veramente una cazzata e che avrei potuto metterci circa 20 giorni di meno. Non fa nulla anche perchè ormai è inutile piangere su latte versato quindi let's start.

Tools usati

WDasm32  (e chi non lo conosce?)
Soft-Ice 4.0 (idem come sopra)
Symantec Resource Studio
Li trovate tutti tra i tools di questo sito (mi pare).

URL o FTP del programma

Non mi ricordo da dove ho pescato il programma però la mia versione è la 98 (come se non si fosse capito). Se non lo trovate mandatemi una Mail che ve lo spedisco (è grande 1,20 Mb).

Notizie sul programma 

Questo programma è un editor di icone molto ben fatto. Dura (o almeno dovrebbe durare) 30 giorni più 14 di bonus (sono gentili ma noi lo faremo diventere etereno :-))) non si può registrare tramite Nome/Serial e all'avvio presenta un pallosissimo Nag Screen. Dopo i 44 giorni di prova (30 normali più 14 di bonus), inoltre, fa comparire anche un altro strapallosissomo Nag quando usciamo dal programma.

Essay

Microangelo 98 è formato da questi cinque files:
muedit.exe
muengnr.exe
muexplor.exe
mumgr.exe
muani.exe
Inoltre tutte le informazioni relative ai Nag e ai messaggi sui giorni rimasti contenuti in:
muapp.dll
 
Il programma visualizza diversi messaggi nella barra in alto (non mi ricordo come si chiama) a seconda della situazione in cui ci troviamo ovvero:
Se siamo ancora entro trenta giorni (Evaluation day xxx of 30)
Se siamo tra i 30 e i 44 giorni (ovvero si siamo nel periodo bonus di 14 giorni) (Licensing overdue! - Grace day xxx of 14)
Se siamo oltre i 44 giorni farà comparire il Nag all'uscita e la scritta sarà: xxx DAYS PAST AGREED EVALUATION PERIOD!
Noi opereremo così: modificheremo gli eseguibili in modo che visualizzino sempre lo stesso messaggio, ovvero "evaluation day xxx of 30" dove il giorno può essere anche il centomillesimo e la dll in modo che non ci faccia mai vedere i nag. Faremo così per il messaggio perchè poi dovremo modificare meno stringhe (solo una) nella Dll.
Si comincia !!!
Io lavorerò sull'Animator (muani.exe).
Disassembliamolo con WDasm e cerchiamo qualche stringa interessante; Spero che abbiate notato subito la stringa "evaluation", facciamo dopio clic li sopra fino a quando non arriviamo in questo punto (ci fermiamo qua perchè più in basso notiamo un confronto con 1E e un salto se minore o uguale):
 
.................................
* Possible StringData Ref from Data Obj ->"Evaluation"
:00418687       push 00426C0
:0041868C      push ebx
:0041868D      call 00401000
:00418692      push 0042C260
:00418697      call 0041ED80
:0041869C      mov ecx, dword ptr [0042B444]
:004186A2      add esp, 00000004
:004186A5      cmp eax, ecx
:004186A7      jne 004186B9
:004186A9       mov eax, dword ptr [0042B168]
:004186AE      mov dword ptr [0042B154], ebx
:004186B4      cmp eax, 0000001E                           In questo punto viene confrontato un valore con 30 (1E in esadecimale)
:004186B7      jle 004186C3                                     (1) salta se MINORE O UGUALE  !!!!
.................................
Ovviamente dovremo cambiare il JLE in JMP per farlo saltare chissà dove anche se il programma ha superato i 30 giorni. Ora se portiamo avanti la data non succede nulla nel senso che è come se non avessimo fatto niente. Portiamo la data indietro invece. Mettiamola prima della data di installazione e eseguiamo il programma. Ecco che ci compare una bella MessageBox che ci dice che non trova un giusto valore nel registro.Ora a me non interessa sapere come lavora sul registro ma mi interessa non avere più messaggi di errore di ogni tipo e quindo vediamo come eliminare questa MesageBox.
Dunque, quando il programma salta da (1) dove va ? Va qui:

.................................
Jump at Addresses:
:004185A9(C), :0041862D(C), :004186B7(C)

:004186C3      cmp ebp, ebx
:004186C5      jne 00418700                     (2) Se questo salto viene eseguito saltiamo una MesageBeep e una MessageBoxA
:004186C7      push 00000010

* Reference To: USER32.MessageBeep, Ord:0194h
[.................................]
* Reference To: MUAPP.GetMuString, Ord:0004h
[.................................]
* Reference To: USER32.MessageBoxA, Ord:0195h
[.................................]
Jump at Address:
:004186C5(C)
.................................
Se il salto all'indirizzo 004186C5 (2) viene eseguito saltiamo, appunto, una MesageBeep e una MessageBoxA quindi potrebbe essere il check sulla data antecedente a quella di installazione. Verifichiamo subito trasformandolo in JMP. Ed effettivamente era proprio quello. Ora vediamo dove abbiamo fatto saltare il programma perchè, ricordiamoci bene, il nostro obbiettivo è quello di mantenere sempre il messaggio "(Evaluation day xxx of 30)" anche dopo quarantamila giorni. Dunque dal salto dall'indirizzo 004186C5 arriviamo qui:

.................................
Jump at Address:
:004186C5(C)
:00418700      push 00000012
:00418702      push 0042B180
:00418707      push 00000005

* Reference To: MUAPP.GetMuString, Ord:0004h
:00418709      Call 0041E7FA
:0041870E      mov eax, dword ptr [0042B168]
:00418713      cmp eax, 0000001E                             **** (3) Nota Bene   
:00418716      jge 0041872F                                     **** queste due righe
:00418718      lea ecx, dword ptr [esp+18]
:0041871C      push 00000063
:0041871E       push ecx
:0041871F       push 00000006

* Reference To: MUAPP.GetMuString, Ord:0004h

:00418721      Call 0041E7FA
:00418726      mov edx, dword ptr [0042B168]
:0041872C      push edx
:0041872D      jmp 00418750                                     (4)
.................................
Nel punto (3) il programma confronta Eax (i giorni) con 30 e subito dopo salta se è MAGGIORE O UGUALE. Visto che noi dobbiamo fargli credere che i giorni di utilizzo siamo sempre minori di 30 dobbiamo noppare il JGE obbligando così il programma a eseguire il codice fino ad arrivare al JMP (4).

Fermiamoci un attimo e cerchiamo di ricapitolare quello che abbiamo fatto:
1- Abbiamo cambiato un primo JLE in un JMP per obbligare il programma a continuare ad andare avanti nel codice qualsiasi siani i gioni di utilizzo.
2- Abbiamo cambiato un JNE in JMP per far si che possiamo mettere la data anche prima del giorno di installazione.
3- Abbiamo noppato un JGE per far si che non vada mai in quella parte di codice che dovrebbe raggiungere se i giorni sono più di 30.

Quindi se abbiamo fatto tutto correttamente ci manca da eliminare il secondo messaggio, il terzo e il Nag e poi per questo file abbiamo finito. Allora andiamo a vedere dove salta il programma dall'indirizzo (3) e vediamo che arriva qui:

.................................
Jump at Address:
:0041872D(U)

:00418750      lea eax, dword ptr [esp+1C]
:00418754      push eax
:00418755      push 0042CF80

* Reference To: USER32.wsprintfA, Ord:0264h

:0041875A      Call dword ptr [004307E8]
:00418760      mov eax, dword ptr [0042B168]
:00418765      add esp, 0000000C
:00418768      cmp eax, 0000002C                                     (5) QUESTE DUE RIGHE
:0041876B      jge 0041877E                                              SONO IMPORTANTI
:0041876D      mov dword ptr [0042B9C4], ebx
:00418773      pop edi
:00418774      pop esi
:00418775      pop ebp
.................................

All'indirizzo (5) il programma confronta Eax con 2C che in decimale corrisponde a 44 (vi ricordate la faccenda dei 14 giorni bonus? 30 + 14 = 44 !!!) e visto che subito dopo salta se i giorni sono maggiori o uguali a 44 mi sembra quasi inutile dire che dovete noppare questo JGE e così facendo avrete reso eterno muani (non proprio eterno però visualizza sempre il messaggio: (Evaluation day xxx of 30) perchè crede che siano passati meno di 30 giorni). Ora dobbiamo sopprimere il nag iniziale e questa stringa. Ma prima dobbiamo modificare gli altri quattro programmi. Visto che il procedimento è perfettamente identico mi rifiuto di scrivere tutta sta roba altre quattro volte, quindi fatevelo da soli! Non potete mica avere sempre la pappa pronta! :-)))) Non spaventatevi perchè quando dico che è perfettamente uguale vuol dire che è veramente perfettamente uguale in tutti i files (nel mumgr.exe nel punto (1) il confronto è fatto con 19 mentre il salto (2) è seguito da delle stringhe diverse ma non c'è problema è comunque quello il pezzo da cambiare) e questo perchè i programmatori non creerebbero mai 5 routine diverse per il controllo della data Eh Eh Eh Eh !!.

Ed ora dedichiamoci a dare un aspetto più gradevole a questi 5 programmi. Ovvero sopprimiamo la stringa: (Evaluation day xxx of 30) e il Nag iniziale. Per fortuna tutte queste informazioni sono contenute in muapp.dll e quindi ci basterà modificarla una volta che tutti i programmi la leggeranno modificata.
Adesso lavoreremo solo sulla stringa del conteggio dei giorni. Forza ! Apriamo la dll con il Symantec Resource Studio e oltre  alla finestra piccola se ne aprirà un'altra più grossa. Ora cominceremo a modificare la stringa. Per fare ciò dobbiamo cliccare su "String Table" e poi ancora su "String Table" nella finestra sotto però. Ora vediamo tutte le stringhe del programma e spero che noterete che quella che interessa a noi è la numero 6. Per poterla modificare facciamo doppio clic nella finestra con tutte le stringhe e poi selezioniamo la numero 6. Ora possiamo mettere il testo che vogliamo semplicemente scrivendo nella finestra delle proprietà che si è aperta e poi premendo invio per applicare la modifica. Possiamo mettere una scritta tipo "CraCkeD bY DaRk PlaGuE" o lasciare tutto vuoto. Ora salviamo e controlliamo che tutto si andato bene eseguendo un programma a caso (io userò ancora il muani). Lo eseguiamo aspettandoci la nostra scritta modoficata in alto e......... merd@ ma porc@ pu##@n@ ! Cosa cavolo è quel messaggio:"Shareware-sensitive area contains unauthorized changes. Terminating now!" come si è permesso!?
Disassembliamo la Dll con WDasm e cerchiamo tra le stringhe il messaggio. Doppio clic e siamo in una parte del codice. Facciamo doppio clic ancora e siamo in un'altra. Caxxo! Il programma richiama questa stringa in due casi diversi ma non è un problema perche ora analizzerò entrambi i casi.

Prima situazione.
In questo caso arriviamo dove c'è il segno *****    

.................................
:10001141      test eax, eax
:10001143      je 10001177                         Se questo salto viene eseguito saltiamo il messaggio di errore
:10001145      mov edx, dword ptr [1000CEEC]
:1000114B      push 00000100
:10001150      push 1000CDE0

* Possible Reference to String Resource ID=00011: "Shareware-sensitive area contains unauthorized changes. Ter"

:10001155      push 0000000B                  ***** Arriviamo qui
:10001157      push edx
:10001158      call ebx
:1000115A      push 00000030

* Possible StringData Ref from Data Obj ->"Microangelo"

:1000115C push 10009050
:10001161 push 1000CDE0
:10001166 push 00000000

* Reference To: USER32.MessageBoxA, Ord:0195h

:10001168      Call dword ptr [1000F394]
:1000116E      xor eax, eax
:10001170      pop edi
:10001171      pop esi
:10001172      pop ebp
:10001173      pop ebx
:10001174      ret 000C

Jump at Addresses:
:10001025(C), :10001143(C)

:10001177      pop edi
:10001178      pop esi
.................................

Se il salto segnato viene esseguito noi saltiamo una MessageBoxA (che sarebbe il nostro messaggio di errore) e quindi ci basterà cambiare quel JE in JMP. Ora analizziamo la seconda situazione

.................................
:100065E2      cmp eax, ebp
:100065E4      je 10006848
:100065EA      cmp dword ptr [1000CB00], ebp
:100065F0      jne 10006613                      Nota bene a dove porta questo salto
:100065F2      xor eax, eax
:100065F4      push 1000CB00
:100065F9      mov ax, word ptr [1000CB5C]

* Possible Reference to String Resource ID=00011: "Shareware-sensitive area contains unauthorized changes. Ter"

:100065FF      push 0000000B                   Noi arriviamo qui
:10006601      push eax
:10006602      push ebp
:10006603      call 10006950
:10006608      add esp, 00000010
:1000660B      test eax, eax
:1000660D      jne 10006809

Jump at Address:
:100065F0(C)
:10006613      push 00000202
:10006618      call 10004120
:1000661D      add esp, 00000004
.................................

Anche in questo caso se il salto dall'indirizzo 100065F0 viene eseguito saltiamo la stringa del messaggio di errore e quindi dovremo cambiare quel JNE in JMP. Fatto! Ora la dll non mostra più messaggi di errore e quindi possiamo eseguire tranquillamente il programma e vedremo le modifiche che abbiamo effettuato.
Ora dobbiamo sopprimere il Nag-Screen iniziale.
Come avevo detto prima anche le informazioni sul Nag sono contenute nella dll. Riapriamola con il Symantec Resource Studio e questa volta clicchiamo su "Bitmap" e nella finestra sotto su "32" ed ecco il disegno che c'è sul Nag. Ora dobbiamo eliminarlo. Io vi consiglio di non cancellarlo completamente ma di cambiare la sua ID in un numero che non c'è già (io le ho dato il 36). Poi dobbiamo prendere il resto del Nag e questo lo troviamo in "Dialog" sotto il numero 901. Anche qua non cancellatelo completamente ma cambiate l'ID (io ho messo 905). Salviamo e godiamoci il Microangelo sprotetto... Eseguiamo un programma e ...."Cannot display shareware diaolg.  Terminating execution !" COSA ? Un altro controllo ? Che palle !!!!
Ok, sopprimiamo pure questo.
Apriamo la dll con Wdasm e cerchiamo la stringa di errore. Vediamo subito una String Resource ID=00010: "Cannot display shareware dialog. Terminating execution!" ma non è questa quella che ci interessa. Lo possiamo verificare molto facilmente cancellando completamente la String Table nella Dll con il resource studio; infatti se facciamo così il programma continuerà comunque a mostrarci il messaggio di errore. La stringa che ci ineressa è più sotto ed è semplicemente un "Cannot display shareware dialog.". Clicchiamoci due volte sopra e arriviamo in questa parte di codice:

.................................
* Reference To: USER32.DialogBoxParamA, Ord:008Eh

:10002341      Call dword ptr [1000F3C8]
:10002347      mov esi, eax
:10002349      test esi, esi
:1000234B      jge 10002365                                       Questo salto ci porta a dopo il messaggio di errore.

* Possible Reference to String Resource ID=00016: "Licensing of this program is now OVERDUE, and should be atte"

:1000234D      push 00000010

* Reference To: USER32.MessageBeep, Ord:0194h

:1000234F      Call dword ptr [1000F3D8]

* Possible Reference to String Resource ID=00016: "Licensing of this program is now OVERDUE, and should be atte"

:10002355      push 00000010
:10002357      push 00000000

* Possible StringData Ref from Data Obj ->"Cannot display shareware dialog. "           Noi arriviamo qui
                                                               ->" Terminating execution!"

:10002359      push 10009208
:1000235E      push edi

* Reference To: USER32.MessageBoxA, Ord:0195h

:1000235F      Call dword ptr [1000F394]

Jump at Address:
:1000234B(C)

:10002365      mov eax, esi                                                (7)
:10002367      pop esi
:10002368      mov dword ptr [1000CC64], 00000000
:10002372      pop edi
:10002373      ret 0008                                                      (8)
.................................

Ora, se diamo un'occhiata più in alto rispetto alla stringa di errore noteremo subito un JGE (6) che ci porta dopo il messaggio. Quindi dovremo forzare quest'ultimo per far si che ci porti sempre in questo punto (lo trasformeremo un un JMP). Ora il programma non dovrebbe più presentare messaggi di errore. Ma se proviamo a eseguirme uno a caso (io indovinate un po' quale scelgo?)noteremo subito che parte e si chiude da solo. Per vedere cosa fa dobbiamo rimettere a posto il JMP che abbiamo appena cambiato in JGE e poi ci faremo dare una mano da Soft-Ice.
Piazziamo un bel breakpoint su MessageBoxA (bpx mesageboxa) ed eseguiamo un programma. Ecco che ci compare softice. Siamo nella messagebox, premiamo F12 e windows ricompare, clicchiamo su "OK" ed eccoci di nuovo in softice nel punto (7). Ora steppiamo con F10 fino al ret (8) per vedere dove va il programma dopo. E vediamo che dopo il ret ritorna dalla dll al programma che avevamo eseguito (io ritorno in muani.exe) nel mio caso all'indirizzo 00416EC1. Apriamo l'eseguibile con WDasm e ecco dove ci troviamo dopo aver inserito l'indirizzo:

.................................
* Reference To: MUAPP.InitializeMuApp, Ord:0009h

:00416EBC      Call 0041E7EE
:00416EC1      test eax, eax                                  Arriviamo qui
:00416EC3      jg 00416EEC                                (9) IMPORTANTISSIMO !!!!
:00416EC5      push 00000000
:00416EC7      push 00000000
:00416EC9      push 00000010
.................................

Se il salto (9) non viene eseguito il programma si chiude da solo e quindi dobbiamo cambirlo in JMP. Poi dobbiamo rimettere a posto anche il salto all'indirizzo 1000234B nella Dll e finalmente abbiamo finito. Dovrete ripeter tutto questo anche per gli altri files ovviamente. Spero che siate riusciti a seguirmi fino a qua. Se avete dei problemi scrivetemi pure e sarò ben felice di rispondere (se riesco) ai vostri dilemmi su Microangelo 98.
                     
                                                                                                           DaRk PlaGuE
Note finali

Volevo ringraziare Quequero perchè questo è terzo tutorial che mi pubblica e saluto il mio discepolo, ovvero l'amico che sto portando sulla via del cracking, TheJackal_2.

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 (sono praticamente CAXXI VOSTRI !!). 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