(by +RoXrOb)
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 copiatinella 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"
:
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.
(by +RoXrOb)