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).
- 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
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.