InstallShield & Hardlock crack

(ovvero come eliminare la dongle già in fase di installazione)

Data

by kribio

 

28/06/2001

UIC's Home Page

Published by Quequero

 

Mi tolto tanto di cappello, complimenti

 

....

E-mail: [email protected]

....

Difficoltà

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

 

Qui andrà un piccolo commento di 2-8 righe riguardante il progetto che stai per affrontare, tanto per far capire al lettore cosa si stà per fare.


InstallShield & Hardlock crack

(ovvero come eliminare la dongle già in fase di installazione)
Written by kribio


Introduzione

In questo tutorial ci occuperemo di bypassare il check alla dongle che viene effettuato sia in fase di installazione del programma sia in fase di esecuzione dello stesso.   

Tools usati

IsDcc

W32Dsm

SoftIce

Hiew  o un qualunque altro hexeditor

URL o FTP del programma

Il CD l’ho avuto da un amico possessore di regolare licenza che intendeva utilizzare su più pc il programma. Non so se è possibile reperirlo altrove.

Notizie sul programma

Si tratta di un bel programma di calcolo strutturale, anche in ambiente sismico con analisi statica e dinamica. Davvero completo, si arriva fino ai disegni delle armature delle varie strutture: travi, pilastri, plinti, solai e pareti.  

Essay

Un Martini, un pacchetto di sigarette e via. Beh, per la verità non fumo ne tantomeno bevo, sono quello che si dice un virtuoso, vuol dire che mi accontenterò di un pacchetto di gomme ed una coca. Intendiamoci mi riferisco ad un bicchiere di Coca Cola.

PARTE PRIMA

INSTALLSHIELD CRACK

Facciamo partire l’installazione del prog. Uhm… notiamo immediatamente che è stato utilizzato InstallShield, buono a sapersi!

Compare la prima finestra e facciamo un click su Avanti, leggiamo ed accettiamo il contratto di……licenza pigiando su Si, ed arriviamo alla finestra di Selezione Componenti. Scegliamo sicuramente la versione Full, penso siate d’accordo no? Oh c*zz!, “RILEVAMENTO CHIAVE HARDWARE”; ci vuole altro per impressionarci non è vero? Quindi andiamo avanti premendo l’omonimo bottone. Nuova finestra  che ci avvisa che “Il programma non è stato in grado di leggere la chiave.” Bella scoperta, non ce l’ ho! E qui l’installazione non va più avanti.

Quindi è evidente che già in fase di installazione il prg fa il check della chiave. E’ arrivato il momento di utilizzare iDcc che non è altro che un decompilatore di file, con estensione .ins, di InstallShield. Bene, copiamo l’intera cartella d’installazione del programma sul desktop, dopodicchè copiamoci all’interno il file isdcc.exe che ci servirà per decompilare il file setup.ins presente nella cartella. Prima però occorre cambiare gli attributi del file, infatti adesso risulta in sola lettura e quindi non modificabile. Andiamo con il mouse sull’icona del file setup.ins, tasto destro e nel menù che compare scegliamo proprietà, in fondo alla dialog che compare scegliamo tra gli attributi “archivio”  quindi tasto applica. Ora apriamo una finestra “Prompt di MS-DOS” pigiando su “Start-Programmi-Prompt di MS-DOS” dalla barra di stato di Windows, e digitiamo cd\windows\desktop\IspaceInstall per posizionarci nella cartella creata sul desktop dove sono stati copiati i files di installazione di Ipersp*ce++. Diamo il seguente comando:

isdcc setup.ins > decomp.txt         per decompilare il file setup e redirigere il listato nel file decomp.txt.

Appena finito la decompilazione, chiudiamo la finestra MS-DOS e leggiamo il file decomp.txt con WordPad. Il listato è abbastanza leggibile non trovate? Cerchiamo la stringa “Il programma non è stato in grado di leggere la chiave.”. Eccola nella function104():

// ------------- FUNCTION function104 --------------

    function function104()

        number lNumber0;

        number lNumber1;

        number lNumber2;

        number lNumber3;

        string lString0;

        string lString1;

        string lString2;

    begin

        ListCreate(0);

        lNumber3 = LAST_RESULT;

        lString2 = "IMPORTANTE:";

        ListAddString(lNumber3, lString2, 0);

        lString2 = "";

        ListAddString(lNumber3, lString2, 0);

        lString2 = "a) Assicurarsi che la chiave hardware sia inserita correttamente sul una";

        ListAddString(lNumber3, lString2, 0);

        lString2 = "    porta parallela.";

        ……………………………………………………………..

        bla bla bla

        lString0 = "Rilevamento chiave hardware.";

        lString1 = "Il programma non \xff stato in grado di leggere la chiave hardware.";

        Disable(51);

        function7(lString0, lString1, lNumber3);

        lNumber0 = LAST_RESULT;

        Enable(51);

        ListDestroy(lNumber2);

        return(lNumber0);

    end;

Questa funzione è chiamata dalla label126 a sua volta chiamata dalla label98 che riporto qui sotto:

label98:

        AddressStruct(string5);

        lNumber19 = LAST_RESULT;

        KEYDLL.GetKeyValue(lNumber19);

        lNumber2 = LAST_RESULT;

        lNumber19 = lNumber2 = 0;

        if (lNumber19 = 0) then

            goto label126;-------------------------- chiamata alla routine di errore

        endif;

        UnUseDLL(lString3);

        lNumber19 = LAST_RESULT;

        lNumber19 = lNumber19 < 0;

        if (lNumber19 = 0) then

            goto label99;

        endif;

        lString10 = "Errore nello scaricamento di \'" + lString3; ----------- ricordiamo questa stringa

        lString10 = lString10 + "\'";

        MessageBox(lString10, -65533);

        goto label99;

Non vi ricorda il listato di un programma VB? In effetti è molto simile.

Bene, bene. Notiamo che la chiamata alla label126 incriminata è inserita in un banale blocco if………endif; brevemente, se la condizione posta in parentesi (lNumber19 = 0) si verifica allora verrà eseguita la label126. Quindi basta invertire la condizione! Nel listato di isDcc la condizione “salta se è uguale a 0” è espressa con l’opcode 95 mentre la condizione “non salta se è diverso da 0” con 96. Ma come individuare nel file setup.ins il punto dove intervenire. E’ molto più semplice di quanto si immagina. Ci viene in aiuto l’editor esadecimale: Hiew, Hex Workshop, UltraEdit ecc. Io preferisco il primo. Selezioniamo il modo Hex e cerchiamo la stringa “Errore nello scaricamento di” la troviamo a 37F4.

 00003770:  61 01 00 27-2A 00 62 91-FF 41 01 00-FF FF 00 00  a  '* b‘ÿA  ÿÿ   

 00003780:  0E 00 BB 00-52 1E 00 21-00 32 88 FF-42 00 00 B4    » R  ! 2ˆÿB  ´ 

 00003790:  00 80 6C 00-42 88 FF 21-00 32 99 FF-42 00 00 28   €l Bˆÿ! 2™ÿB  ( 

 000037A0:  01 32 88 FF-42 99 FF 41-05 00 00 00-41 00 00 00   2ˆÿB™ÿA    A    

 000037B0:  00 22 00 70-7F 00 95 42-88 FF 41 00-00 00 00 B3   " p •BˆÿA    ³ 

 000037C0:  00 62 98 FF-21 00 32 88-FF 42 00 00-28 01 32 88   b˜ÿ! 2ˆÿB  ( 2ˆ 

 000037D0:  FF 42 88 FF-41 01 00 00-00 41 00 00-00 00 22 00  ÿBˆÿA    A    "  

 000037E0:  70 64 00 95-42 88 FF 41-00 00 00 00-24 01 52 91  pd •BˆÿA    $ R‘ 

 000037F0:  FF 61 1E 00-45 72 72 6F-72 65 20 6E-65 6C 6C 6F  ÿa  Errore nello 

 00003800:  20 73 63 61-72 69 63 61-6D 65 6E 74-6F 20 64 69   scaricamento di

un po’ più sopra troviamo la notazione 95 42 alla linea 37B6, quindi posizioniamoci sul 95 e con F3 entriamo nella modalità edit, cambiamo 95 con 96 quindi F9 per registrare la modifica. Ora però se facessimo partire l’installazione avremmo un errore di CRC, per evitarlo  occorre togliere un byte nel file setup.ins visto che con la precedente modifica (95 -> 96) ne abbiamo aggiunto uno. Bene togliamolo alla notazione 37F4 cambiando 45 72 in 44 72 in modo che “Errore nello scaricamento” diventi “Drrore nello scaricamento”, stringa che peraltro non comparirà mai sullo schermo. Ok ora facciamo ripartire l’installazione e arriveremo al dialog che ci avverte che :”La chiave hardware presente sulla porta parallela non è”. Rifacciamo la strada già percorsa sopra ma stavolta cerchiamo quest’ultima stringa che troviamo nella function107():

function function107()

        number lNumber0;

        number lNumber1;

        number lNumber2;

        number lNumber3;

        string lString0;

        string lString1;

        string lString2;

    begin

        ListCreate(0);

        lNumber3 = LAST_RESULT;

        lString2 = "IMPORTANTE:";

        ListAddString(lNumber3, lString2, 0);

        lString2 = "";

        …………………………………………

        bla bla

        lString0 = "Rilevamento chiave hardware.";

        lString1 = "La chiave hardware presente sulla porta parallela non \xff abilitata.";

        Disable(51);

        function7(lString0, lString1, lNumber3);

        lNumber0 = LAST_RESULT;

        Enable(51);

        ListDestroy(lNumber2);

        return(lNumber0);

    end;

chiamata dalla label124 a sua volta chiamata dalla label116 richiesta dalla label100

label100:

        lNumber20 = lNumber1 <= lNumber19;

        if (lNumber20 = 0) then

            goto label116;

        endif;

        CopyBytes(lString0, 0, lString4, lNumber1, 3);

        StrCompare(lString0, "065");

        lNumber20 = LAST_RESULT = 0;

        if (lNumber20 = 0) then

            goto label106;

        endif;

        lNumber4 = lNumber4 + 1;

        lNumber20 = lNumber4 = 1;

        if (lNumber20 = 0) then

            goto label103;

        endif;

        lString6 = "Versione Full";

        lNumber9 = 0x3e8;

        goto label105;

Guarda guarda, “Versione Full”, è quella che ci interessa o sbaglio? Allora apriamo di nuovo Hiew e cerchiamo in setup.ins la stringa incriminata. Premo F7 quindi nel rigo ASCII scrivo la stringa e premo return. Immediatamente Hiew si posiziona sulla prima occorrenza eccola:

 000038F0:  01 32 87 FF-42 00 00 41-05 00 00 00-41 00 00 00   2‡ÿB  A    A    

 00003900:  00 22 00 70-6B 00 95 42-87 FF 41 00-00 00 00 19   " pk •B‡ÿA      

 00003910:  01 32 97 FF-42 97 FF 41-01 00 00 00-29 01 00 00   2—ÿB—ÿA    )    

 00003920:  05 00 28 01-32 87 FF 42-97 FF 41 05-00 00 00 41    ( 2‡ÿB—ÿA    A 

 00003930:  01 00 00 00-22 00 70 68-00 95 42 87-FF 41 00 00      " ph •B‡ÿA   

 00003940:  00 00 13 00-52 95 FF 61-0D 00 56 65-72 73 69 6F      R•ÿa  Versio 

 00003950:  6E 65 20 46-75 6C 6C 21-00 32 92 FF-41 E8 03 00  ne Full! 2’ÿAè

Come visto nel listato di IsDcc l’ if…endif che ci interessa è il terzultimo prima della stringa “Versione Full”, quindi cerchiamo il terzultimo 95 precedente alla stringa e cambiamolo in 96; lo troviamo alla linea 3906. Non dimentichiamo di togliere un byte per evitare l’errore di CRC. Il gioco è fatto, ora in prog si installa come versione full.

PARTE SECONDA

DONGLE CRACK

Ora sul desktop abbiamo IperSp*ce++ con la sua bella icona. Facciamolo partire ed ecco un box di avvertimento: “Errore Controllare Chiave hardware !”, e dove la vado a prendere? Forse non ci siamo ancora capiti che è quella che manca? Vediamo di convincere il programma a deporre le armi. Usiamo allo scopo SICE, anche se è un po’ ridicolo eliminare un moscerino con un MIG. Quindi Ctrl+D e poniamo un bel bpx MessageBoxExA per aggrapparci al box di avvertimento per poi risalire alla call della chiave hardware. Avviamo il prog e SICE immediatamente poppa in USER32 quindi premiamo una volta su F12 e ci ritroviamo in ISPACE, il nostro programma, ancora F12 e ci ritroviamo qui:

call     .000482B0B<----------- Call alla dongle                       

test      eax,eax                     

je       .00044C2CF<----------- jmp da modificare                       

call     .00043C1D0  

test      eax,eax                     

je       .00044C2CF  

call     .00043D4A7<----------- Call alla messagebox                    

push      000      <----------- SICE poppa qui                  

call     .0005E0A6A  

jmps     .00044C303       

push      001                         

push      d,[ebx]                      

call     .00048EB3F  

add       esp,008 ;" "                

mov       esi,[0005EA950]             

push      000                         

push      esi

il check alla donale è all’indirizzo 0044C2AF, la call da bypassare è all’indirizzo 0044C2C1 prima della quale vi sono due je, quindi basta trasformare il je in jmp per saltare la messagebox di errore. Diamo un’occhiata al codice con W32Dsm. Disassembliamo, per sola conferma, il file Ispace.exe ed andiamo all’indirizzo 0044C2AF, click sul bottone Call e arriviamo alla routine della dongle:

* Referenced by a CALL at Addresses:

|:0044C2AF   , :0045FB5D  

|

push ebp

mov ebp, esp

push ebx

push esi

push edi

xor edi, edi

push 005F2854

* Possible StringData Ref from Data Obj ->"HARDLOCK."

                                  |

push 005F284C

........................

........................

Come vedete nella string data reference è riportato il nome della chiave hardware utilizzata.

In definitiva con Hiew entriamo in Isp*ce.exe e con F4 mettiamoci in modalità Decode, quindi con F5 cerchiamo l’indirizzo .0044C2B6 (attenzìone a non mancare il punto iniziale) quindi F3 e cambiare l’opcode 7417 in EB17 che equivale a jmp. Se si vuole editare direttamente il codice assembler, dopo F3 premere F2 e cambiare je 00004B8CF in jmp 00004B8CF quindi return ed F9. Questo è tutto. Attenzione però che nel corpo del prog vi sono altre due chiamate alla dongle precisamente all’indirizzo 004CF24 e 0043CF24, occorre modificare il codice come sopra. Detti check vengono richiesti con la maschera di About del programma e quando si avvia il calcolo di una struttura. Non c’è altro e godetevi questo programma che è davvero intreressante.

Dimenticavo, vi sono tre programmi aggiunti, precisamente Fond*zioni, Wiztr*vi e C*pri*te nella cartella Aggiunte, sono appunto delle routine aggiunte e protette con lo stesso sistema di check alla chiave, datela voi la sistematina!

Spero di essere stato chiaro ed esauriente, comunque ho fatto del mio meglio. Per il prossimo tute vorrei creare un patchgen in asm per questo programma, almeno spero.

kribio

Note finali

Un arrivederci a tutti gli amici di TN1 e della UIC un particolare saluto ad Oldman e Quequero.

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.