InstalSHIELD 5 Script Zen Cracking
E' fantastico come si possano crackare programmi anche se non si hanno tutte le informazioni necessarie a disposizione, ma solamente sentendo, immaginando, fantasticando e trovando la soluzione (Zen).
Quando ho incominciato a crackare questo programma, non sapevo ancora nulla su InstallShield e su come si potesse crackare un processo di installazione.
Poi grazie al sito di Fravia (+HCU) ho incominciato a trovare buone informazioni, che sono la base per poter risolvere i problemi che si presentano di volta in volta.
LIVELLO: Penso che anche i principianti possano capire questo tutorial, dato che non serve cimentarsi con tecniche complesse che entrano in profondità nel sistema operativo e non si usano tools come softice che entrano in profondità nel codice. Inoltre spiego passo passo il procedimento con cui sono arrivato alla soluzione di questo crack.
TOOLS:
1) I5Comp -----> utilità di compressione di InstallSHIELD ver. 5
2) IsDcc v. 1.22 -----> installSHIELD Decompiler supporta installshield fino alla ver 5.5
3) UltraEdit 32 v. 5.21 -----> Hex Editor va bene anche qualsiasi altro.
TARGET: MATHCAD 8, un programma per lo studio matematico di funzioni ecc. Non so dove si può trovare. Penso comunque che questo tutorial non sia fondamentale come crack per Mathcad 8 ma piuttosto può essere utile per comprendere un sistema di cracking per altri programmi con protezione simile, quindi anche chi non possiede Mathcad 8 (che tra l'altro sarebbe difficile da scaricare dato che è molto grosso circa 128 MB comprese utilitye doc), può usare questo procedimento su altri simili.
INFO
Durante l' installazione viene chiesto un numero seriale, poi e possibile installarlo solamente negli Stati Uniti e in Canada. Quindi ci sono 2 protezioni : 1) SERIAL 2) COUNTRY CODE VERIFICATION. Quando ho incominciato a crackare l' installazione di MathCad 8 , ho subito provato a usare Softice, però dopo poco ero stanco di controllare linee di codice e breakpoint su nag screen alla ricerca del flag giusto. Ho iniziato a informarmi su InstallSHIELD e ho scoperto utili informazioni. Naturalmente ci sono due file fondamentali : SETUP.EXE l' eseguibile che carica il processo, ma il più importante è SETUP.INS che è lo script che gestisce tutti i parametri di installazione di InstallSHIELD.
ADESSO INIZIAMO
Quando si lancia (SETUP.EXE), viene creata una directory "_istmp0.dir" nella directory di sistema temp (Es: C:\Windows\temp), dove vengono decompressi i file che servono al setup per l' installazione.
NOTA: ho ustao il tool I5COMP solo per verificare in quale file compresso (sistema di compressione proprietario InstallSHIELD) risiedevano ifile decompressi in questa directory. La struttura è questa:
_DATA.CAB = file che contiene tutti i file che verrano installati nel sistema per il funzionamento di MathCad 8.
_USER1.CAB = parte dei file che vengono copiati nella directory temporanea per l' installazione.
_SYS1.CAB = altri file copiati nella directory temporanea.
PRIMA PARTE : Aggirando il COUNTRY CODE
Quando ho iniziato questo crack avevo un seriale valido per Mathcad 8, ma purtroppo quando l' ho inserito mi è apparso il Nag Screen con il messaggio: "This product version is only for sale in the U.S. and Canada.
Setup will exit now." (COUNTRY CODE).
Il messaggio non è presente in nessun file dell' installazione (ricerca con windows), chiaro segno che era contenuto in qualche file compresso dentro i file _USER1.CAB oppure _SYS1.CAB. Ci sono 2 metodi per verificarlo :
1) Si può lanciare l' installazione e al momento della richesta delle informazioni si apre la directory temporanea "_istmp0.dir" prima menzionata e si esegue con la ricerca nei file di windows su tutti i file (*:*) la stringa presente nel Nag Screen "This product version is only.....".
2) SI decomprimono con I5COMP i file _USER1.CAB e _SYS1.CAB in una directory poi si esegue su questi file come prima la ricerca della stringa del Nag Screen.
Entrambi i metodi portano alla scoperta di un file che contiene tutti i messaggi dei MessageBox presentati durante l' installazione il file è (VALUE.SHL):
-[Data]
-STATUS_HBK=Copying Practical Statistics Electronic Book files...
-STATUS_IMPROC=Copying Image Processing patch files...
-MSG_DELETING_OLD=Cleaning up old Mathcad program files...
-MAX_MCAD_FOR_UPGRADE=8.0.2.0
-ZEOS=kbdru441.kbd
-MSG_INVALID_OLD_MEDIA=The media you inserted is not a valid Mathcad disk. Please enter a valid
- Mathcad disk or cancel the installation.
-KEYBIND_MSG=Select your initial key bindings. You can change them later in the View Preferences dialog.
-.
-. altre linee
-.
-MSG_DOMESTIC_SCARE=This product version is only for sale in the ----- ( QUESTA E' LA STRINGA
U.S. and Canada.\n\nSetup will exit now. ----- DEL COUNTRY CODE)
-.
-. altre linee
-.
-MSG_INVALID_SERIAL=Invalid serial number. Please check your serial ----- (QUESTA SERVIRA'
number and enter it again. ----- NELLA 2° PARTE)
-.
-. altre linee
-.
-MSG_INFO2a=this CD. Each book can be installed on your
-MSG_INFO3b=install Acrobat Reader from there if you need it.
-MSG_INFO2b= Practical Statistics
-.
-.
-etc
-[General]
-Language=0009
-Type=STRINGTABLESPECIFIC
-Version=1.00.000
Se ora si apre con un Hexeditor il file (SETUP.INS) si nota che non c'è la stringa "This product version is only....." ma si trova con una ricerca l' etichetta di questa stringa, cioè "MSG_DOMESTIC_SCARE", quindi il file (SETUP.INS) stampa un MessageBox che è proprio il Nag Screen del Country Code.
Ora che conosciamo il responsabile del Nag Screen, dobbiamo trovare un modo per capirci qualcosa in più su di esso. E' a questo punto che usiamo il tool "IsDcc" per decompilare il file (SETUP.INS).Si deve scrivere dal prompt di dos :
isdcc setup.ins > setup.lis (dove > serve per ridirezionare l' output del comando isdcc su un file setup.lis)
Ora che abbiamo il listato decompilato (SETUP.LIS) analizziamolo: dopo un po li label c'è:
- label130:
- lNumber4 = number50 = 68; -- lNumber4 = 0 oppure 1
- if (lNumber4 = 0) then ----- PROT1
- goto label132; -- se lNumber4 = 0 !!! GOOD GUY !!!
- endif;
- function174(); -- se lNumber4 = 1
- lNumber4 = LAST_RESULT;
- lNumber4 = lNumber4 < 0; -- lNumber4 = 0 oppure 1
- if (lNumber4 = 0) then ----- PROT2
- goto label132; -- se lNumber4 = 0 !!! GOOD GUY !!!
- endif;
- StrLoadString("", "MSG_DOMESTIC_SCARE", lString2)-- se lNumber4 = 1 !!! BAD GUY !!!
- MessageBox(lString2, -65535); -- "This product version is only....."
- abort;
questa è la parte che ci interessa per il controllo sul COUNTRY CODE.Nag Screen. Si può vedere la routine che lancia il Nag Screen.Purtroppo non conosco ancora abbastanza la struttura e il linguaggio del file (SETUP.INS) (script) già compilato per risalire con sicurezza ai parametri e alle funzioni usati (mi piacerebbe avere della documentazione su di essi), ma noto una cosa (ZEN): apriamo con "UltraEdit 32" il file (SETUP.INS) e anche (SETUP.LIS), qui di seguito c'è la parte del file (SETUP.INS) listato esadecimale vicino alla stringa "MSG_DOMESTIC_SCARE" :
62 99 FF 41 01 00 FF FF 21 00 32 9A FF 41 01 00 b..A....!.2..A..
00 00 21 00 32 9B FF 41 00 00 00 00 00 00 01 00 ..!.2..A........
2C 00 70 7F 00 00 00 09 00 28 01 32 97 FF 42 38 ,.p......(.2..B8
00 41 05 00 00 00 41 44 00 00 00 22 00 70 84 00 .A....AD...".p..
95 42 97 FF 41 00 00 00 00 B5 00 80 AE 00 70 BA .B..A.........p. ---- dword (0) PROT1
00 21 00 32 97 FF 42 00 00 28 01 32 97 FF 42 97 .!.2..B..(.2..B.
FF 41 01 00 00 00 41 00 00 00 00 22 00 70 84 00 .A....A....".p.. --- dword (0) lNumber4 < 0
95 42 97 FF 41 00 00 00 00 12 01 61 00 00 61 12 .B..A......a..a. ---- dword (0) PROT2
00 4D 53 47 5F 44 4F 4D 45 53 54 49 43 5F 53 43 .MSG_DOMESTIC_SC ---- Stringa
41 52 45 52 99 FF 2A 00 62 99 FF 41 01 00 FF FF ARER..*.b..A....
Si nota guardando i due file (SETUP.LIS in formato testo) e (SETUP.INS in formato esadecimale) che le costanti (sia stringhe che numeriche) appaiono in (SETUP.INS) nell' ordine come (SETUP.LIS), cioè andando verso l' alto dalla stringa "MSG_DOMESTIC_SCARE" si incontra una DWORD 00 00 00 00 che è il primo zero nel listato del codice in (SETUP.LIS) alla linea "if (lNumber4 = 0) then ----- PROT2" poi c'è una DWORD 00 00 00 00 che è lo zero della linea "lNumber4 = lNumber4 < 0;" e poi la DWORD 00 00 00 00 che è lo zero della linea "if (lNumber4 = 0) then ----- PROT1". Abbiamo 2 possibilità per modificare il flusso del programma attraverso questi flag. Il più efficace è il primo in alto dato che evita completamente l' esecuzione della funzione che ricava il COUNTRY CODE "function 174 ()" e salta il Nag Screen (PROT 1).
Cambiando la DWORD in PROT1 da 00 00 00 00 in 01 00 00 00 cambio il controllo sul flag che attiva il nag screen.
Ora si può lanciare (SETUP.EXE), ma un attimo, appere un messaggio che dice che il file (SETUP.INS) è danneggiato.Penso subito ad un check-sum sul file. Per compensare la somma, provo la cosa più semplice, diminuisco di 1 una lettera della stringa "MSG_DOMESTIC_SCARE" (che dopo il crack non sarà più usata) in "MSG_DOMESSIC_SCARE" cioè "S" al posto di "T" (53h al posto di 54h). Well Done.
Tutto funziona correttamente. (Naturalmente questa modifica funziona solo per i paesi diversi da U.S. & Canada)!!
SECONDA PARTE : SERIAL NUMBER
Mi sono chiesto, e se non avessi avuto il Numero Seriale ?? Visto che la mia intuizione sulla posizione delle costanti nel file (SETUP.INS) ha funzionato, allora ho seguito lo stesso ragionamento per il serial number. C'è il messaggio: "Invalid serial number. Please check your serial number and enter it again." che appare se viene immesso il seriale errato, questa stringa come si vede sopra è presente nel file (VALUE.SHL) come testo della label "MSG_INVALID_SERIAL", quindi andiamo nel file (SETUP.LIS) a cercare questa stringa:
-label126:
- lNumber4 = lNumber0 = 0; -- lNumber4 = 0 oppure 1(=1 if lNumber0=0) --- PROT3
- if (lNumber4 = 0) then --- PROT4
- goto label131; -- se lNumber4 = 0 !!! GOOD GUY !!!
- endif;
- function182(lString0, lString1, string5, string6, string7, lNumber1);
- lNumber0 = LAST_RESULT;
- lNumber4 = lNumber0 = 12; -- lNumber4 = 0 oppure 1
- if (lNumber4 = 0) then --- PROT5
- goto label128; -- se lNumber4 = 0 !!! BAD GUY !!!
- endif;
- return(lNumber0); -- se lNumber4 = 1 !!! GOOD GUY !!!
-
-label127:
- function171(string7);
- lNumber4 = LAST_RESULT;
- lNumber4 = lNumber4 = 1;
- if (lNumber4 = 0) then
- goto label129;
- endif;
- function3("", string5, string6, string7, 0);
- lNumber0 = LAST_RESULT;
- lNumber1 = 0;
- goto label130;
-
-label128:
- StrLoadString("", "MSG_INVALID_SERIAL", lString2); --- !!! BAD GUY !!!
- MessageBox(lString2, -65535);
- lNumber1 = 1;
- lNumber0 = 0;
-
-label129:
- goto label127;
questa è la parte che ci interessa per il controllo sul SERIAL NUMBER. Si può vedere la routine che chiama la funzione che mostra il messaggio che il seriale non è valido. Apriamo con "UltraEdit 32" il file (SETUP.INS) e anche (SETUP.LIS), qui di seguito c'è la parte del file (SETUP.INS) listato esadecimale vicino alla stringa "MSG_INVALID_SERIAL" :
45 52 49 41 4C 5F 50 52 4F 4D 50 54 52 9A FF 21 ERIAL_PROMPTR..!
00 32 9A FF 41 00 00 00 00 00 00 01 00 21 00 32 .2..A........!.2
9B FF 41 00 00 00 00 00 00 09 00 29 01 28 01 32 ..A........).(.2
97 FF 42 9B FF 41 05 00 00 00 41 00 00 00 00 22 ..B..A....A...." ---- dword (0) PROT3
00 70 83 00 95 42 97 FF 41 00 00 00 00 B5 00 80 .p...B..A....... ---- dword (0) PROT4
B6 00 70 41 01 62 9B FF 62 9A FF 52 1E 00 52 1F ..pA.b..b..R..R.
00 52 20 00 42 9A FF 21 00 32 9B FF 42 00 00 28 .R .B..!.2..B..(
01 32 97 FF 42 9B FF 41 05 00 00 00 41 0C 00 00 .2..B..A....A... -- Costante di rifer.
00 22 00 70 80 00 95 42 97 FF 41 00 00 00 00 2F .".p...B..A..../ ---- dword (0) PROT5
01 B7 00 42 9B FF 00 00 08 00 B5 00 80 AB 00 70 ...B...........p
87 00 62 20 00 21 00 32 97 FF 42 00 00 28 01 32 ..b .!.2..B..(.2
97 FF 42 97 FF 41 05 00 00 00 41 01 00 00 00 22 ..B..A....A...."
00 70 81 00 95 42 97 FF 41 00 00 00 00 B5 00 80 .p...B..A.......
03 00 70 77 01 61 00 00 62 1E 00 62 1F 00 62 20 ..pw.a..b..b..b
00 41 00 00 00 00 21 00 32 9B FF 42 00 00 21 00 .A....!.2..B..!.
32 9A FF 41 00 00 00 00 2C 00 70 82 00 00 00 04 2..A....,.p.....
00 12 01 61 00 00 61 12 00 4D 53 47 5F 49 4E 56 ...a..a..MSG_INV --- Stringa
41 4C 49 44 5F 53 45 52 49 41 4C 52 99 FF 2A 00 ALID_SERIALR..*.
Si nota guardando i due file (SETUP.LIS) e (SETUP.INS) e come fatto per il Country Code cioè andando verso l' alto dalla stringa "MSG_INVALID_SERIAL", qui però visto che i flag che chiamano il messaggio di seriale invalido sono molto più in alto della stringa, come punto di riferimento prenderemo il valore (12d) = (0ch) della linea "lNumber4 = lNumber0 = 12;".
Partendo da questo valore si trova verso il basso la prima DWORD 00 00 00 00 che corrisponde allo zero nel listato del codice in (SETUP.LIS) alla linea "if (lNumber4 = 0) then --- PROT5".
Invece da (0Ch) andando verso l' alto c'è una DWORD 00 00 00 00 che è lo zero della linea "if (lNumber4 = 0) then --- PROT4" e poi la DWORD 00 00 00 00 che è lo zero della linea "lNumber4 = lNumber0 = 0; --- lNumber4 = 0 oppure 1(=1 if lNumber0=0) ---- PROT3".
Abbiamo 3 possibilità per modificare il flusso del programma attraverso questi flag.
In particolare:
1) EVITA RICHIESTA SERIAL NUMBER e NO COUNTRY CODE: le modifiche su PROT3 oPROT4 (o una o l'altra) Cambiando DWORD 00 00 00 00 in 01 00 00 00.
2) ACCETTA QUALSIASI SERIAL NUMBER e NO COUNTRY CODE: le modifiche su PROT5 Cambiando DWORD 00 00 00 00 in 01 00 00 00.
Sempre non dimenticandosi del Check-Sum. All Done!!
Come si vede diversi tipi di crack sono possibili con o senza seriale, la scelta sta a voi, come pure le possibilità di crackare con un altro approccio l' installazione di Mathcad 8.A me pare che questa sia la più veloce una volta capito il procedimento, anzi mi meraviglia la facilità e la stupidità di questa protezione, (nonostante la mia parziale ignoranza sulla struttura degli script), specialmente del check-sum su (SETUP.INS), sarebbe stato meglio non mettere nessun check-sum.
Ma come ho imparato da +ORC, con lo Zen cracking e il tentare per prima cosa facili soluzioni può portare molto lontano.