The Italian CRaCKiNG Encyclopedia vol. 3 ------------------------------- ------------------------- CRaCKiNG with SoftIce --------------- --------- --- Scritto da ---==: ALoR :==--- ---==> Proud member of NEURO ZONE 2 <==--- Maggio 1998 Target = **, *** (*=Lamer, **=Novizio, ***=Apprendista, ****=Esperto, *****=CrackMaster) ============================================================================== Table of context : 1.0 Disclaimer. 2.0 I tools necessari. 3.0 IceCracking Appendice -A- Usare SoftIce 4.0 Conclusioni ============================================================================== ----------------- 1.0 DISCLAIMER ----------------- Every reference to facts, things or persons (virtual, real or esoteric) are purely casual and involuntary. Any trademark nominated here is registered or copyright of their respective owners. The author of this manual does not assume any responsability on the content or the use of informations retriven from here; he makes no guarantee of correctness, accuracy, reliability, safety or performance. This manual is provided "AS IS" without warranty of any kind. You alone are fully responsible for determining if this page is safe for use in your environment and for everything you are doing with it! Ormai lo saprete a memoria.....ma mi Φ necessario per pararmi il culo !!! ------------------------ 2.0 I TOOLS NECESSARI ------------------------ I tools necessari per crackare li abbiamo giα visti nel primo volume. Comunque Φ meglio ricordarli. * WDasm 8.9 or higher * Un editor esadecimale (Es.: UltraEdit) * Un manuale di Assembly * Un manuale delle API. (importantissimo !!) In oltre Φ necessario anche un debugger in realtime, che svolge le funzioni che mancano a WDASM quindi Φ necessario * Soft-Ice 3.2 or higher ------------------ 3.0 ICECRACKING ------------------ Questo capitolo Φ dedicato al cracking dei programmi shareware per Windows. Il metodo utilizzato qui Φ diverso e notevolmente migliorato rispetto a quello usato nel primo volume dell'enciclopedia. Vedremo tra poco come utilizzare le innumerevoli funzioni che ci offre Soft-Ice (vedi Appendice -A-). In particolare analizzeremo come utilizzare al meglio il breakpoint sulle API GetdlgitemTextA e GetWindowTextA. Il nostro obbiettivo Φ trovare il codice di registrazione abbinato al nome che gli forniamo. Proceder≥ con un approccio diverso rispetto agli altri manuali. Proceder≥ ora ad illustrare, con un esempio pratico, come registrare uno shareware. Per il nostro scopo, utilizzer≥ uno dei pi∙ famosi shareware per Windows: Winzip 6.3. Per prima cosa testiamo il programma per dedurre tutte le varie "scocciature" che presenta lo shareware, per winzip possiamo trovare: - Un nag screen iniziale - La scritta "Unregistered" nella barra del titolo del programma - Possiamo registrarci attraverso il menu Help - About - Register Secondo, dobbiamo decidere come crackare il programma, ci si presentano varie ipotesi: - Trovare la giusta Key in memoria - Jumpare la registration check all'avvio - Rimuovere tutte le "scocciature" dello shareware Il terzo tipo Φ molto poco raffinato ed Φ tipico dei crakers stupidi. In questo modo si camuffa il programma, non lo si cracka !! :-) Il secondo l'abbiamo giα affrontato nei precedenti manuali. Ma talvolta non funziona o porta al crash di sistema. La nostra scelta ricade quindi sul primo tipo. E' molto pi∙ semplice. E' raffinato. NON modifica il codice del programma, ottima cosa !! E lo trovo pi∙ da cracker :-) OK. Martini... Sigaretta... e si parte... :-) ** Carichiamo Soft-ice e Winzip 6.3. Andiamo al menu Help - About - Register. Qui ti verrα chiesto il tuo nome e il codice di registrazione. Io inserir≥ name: ALoR e code: 123456789. Ok. Apparirα un messaggio di errore. Il nostro obbiettivo Φ trovare il punto del codice che richiama questa procedura. In questo ci viene in aiuto Soft-ice. Una cosa che non si poteva fare con WDasm era mettere breakpoint sulle API (vedi Appendice -A- ). Invece con Soft-ice sfrutteremo proprio le API di Windows che sono utilizzate per leggere il testo da un Textbox come quelli del name e del code. Le API uste comunemente sono : GetWindowTextA GetDlgItemTextA Mettiamo i BreakPoint sulle API (BPX GetDlgItemTextA e BPX GetWindowTextA). Continuando con l'esecuzione del programma (CTRL+D). Soft-ice prenderα il controllo e si fermerα sulla nostra API. Siccome i campi da leggere sono 2, Soft-ice si bloccherα un'altra volta. In tutto 4, 2 per ogni campo. Ctrl+D, e noteremo che prima del messaggio non legge pi∙ dai textbox. Ora, dopo la quarta interruzione, tracciamo la call con F8. Ora ci troviamo nel codice dell'API. Possiamo tracciare fino al RET oppure F12 e... siamo all'istruzione appena successiva alla CALL GetDlgItemText. Togliamo tutti i Breakpoint (BC *) e ne mettiamo uno su questa istruzione. Che, se avete fatto bene, dovrebbe essere : xxxx:00409D73 MOVZ EAX, BYTE PTR [00471258] Ora il programma ha letto il nome e il codice. Se steppiamo, probabilmente troveremo un jump condizionale che segue una call di controllo del codice. Troviamolo insieme steppando (F10) fino a che non compare il messaggio di errore. Dopo poco, il messaggio appare, annotiamo l'indirizzo della call che richiama il messaggio (00409DA8). Cos∞ abbiamo scoperto che il controllo sul codice viene effettuato da qualche parte tra 00409D73 e 00409DA8. Per trovare la funzione e per capire a fondo il codice, ci viene in aiuto il buon vecchio WDasm. Disassambliamo... ed ecco il codice... * Reference To: USER32.GetDlgItemTextA, Ord:00F5h | :00409D6D Call dword ptr [00476AC8] :00409D73 movzx eax, byte ptr [00471258] <- memorizza il nome :00409D7A test eax, eax :00409D7C je 00409D92 <- salta se il campo Φ vuoto :00409D7E movzx eax, byte ptr [0046F578] <- memorizza il codice :00409D85 test eax, eax :00409D87 je 00409D92 <- salta se il campo Φ vuoto :00409D89 call 004096EA <- controllo sul codice :00409D8E test eax, eax :00409D90 jne 00409DD3 <- Jmp se Φ sbagliato * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00409D7C(C), :00409D87(C) | :00409D92 call 00409F9C <- funzione "codice errato" * Possible Reference to String Resource ID=00654: "Incomplete or incorrect information" :00409D97 push 0000028E :00409D9C call 00424ECF :00409DA1 pop ecx :00409DA2 push eax :00409DA3 push [ebp+08] :00409DA6 push 0000003D :00409DA8 call 004230FD <- messaggio di errore :00409DAD add esp, 0000000C :00409DB0 mov eax, dword ptr [0046C860] :00409DB5 inc eax :00409DB6 mov dword ptr [0046C860], eax :00409DBB cmp dword ptr [0046C860], 00000003 :00409DC2 jne 00409DCF :00409DC4 push 00000000 :00409DC6 push [ebp+08] * Reference To: USER32.EndDialog, Ord:00B4h :00409DC9 Call dword ptr [00476AE4] * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00409DC2(C) | :00409DCF xor eax, eax :00409DD1 jmp 00409E45 <- jmp alla fine della funzione * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00409D90(C) | :00409DD3 push 00471258 * Possible StringData Ref from Data Obj ->"Name" :00409DD8 push 0046396C * Possible StringData Ref from Data Obj ->"WinZip" :00409DDD push 00466F00 * Reference To: KERNEL32.WriteProfileStringA, Ord:0288h .......... .......... In queste righe il programma usa le API .......... WriteProfileStringA .......... WritePrivateProfileStringA .......... rispettivamente per scrivere la registrazione .......... nel file Win.ini e nel Winzip32.ini :00409E16 Call dword ptr [00476AE4] :00409E1C xor eax, eax :00409E1E jmp 00409E45 <- jmp alla fine della funzione .......... .......... * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00409C45(U), :00409CF9(U), :00409D44(U), :00409DD1(U), :00409E1E(U) |:00409E2D(U), :00409E41(U) | :00409E45 leave :00409E46 ret 0010 <- FINE PROCEDURA Possiamo facilmente verificare che la call giusta Φ quella all'indirizzo 00409d89, modificando il flag "Z" (vedi Appendice -A-) prima di eseguire il jne 00409DD3. Ora che sappiamo quale Φ la procedura che controlla il codice... sarα un gioco da ragazzi trovare il codice giusto in memoria... :-) Ricordando che winzip aveva salvato in [00471258] il nome e in [0046F578] il nostro codice... sarα ancora pi∙ facile... Il metodo che utilizzo Φ controllare i parametri passati alle call attraverso i PUSH. Analizzandoli prima e dopo la call... si noterα la differenza :-) Ecco cosa ho trovato : :004097E4 push eax :004097E5 push 00471258 <-- indirizzo del nome :004097EA call 004098C3 <-- calcolo codice :004097EF pop ecx :004097F0 pop ecx <-- provate "d ECX" :-) :004097F1 push 0046F578 <-- vi ricordate cos'era ?... :004097F6 lea eax, dword ptr [ebp+FFFFFDF8] <-- in questo istante EBP contiene 0012F950. +FFFFFDF8 in complemento a 16 Φ -208. Quindi stα mettendo in EAX qualcosa che si trova all' indirizzo 0012F748. Cosa ci sarα mai a quell'indirizzo.:) :004097FC push eax :004097FD call 004465D0 <-- parametri passati: 0046F578 il nostro codice EAX il codice giusto :00409802 pop ecx :00409803 pop ecx OK. Facendo "d ECX" oppure "d 0012F748" abbiamo trovato il codi giusto, nel mio caso 11AA0220. Tolgo tutti i breakpoint (bc *) e scrivo il codice giusto. WOW... abbiamo registrato winzip, e senza modificare il codice... :-) Trovata la procedura di calcolo del codice, Φ facile ricavarne un key generator... Probabilmente affronter≥ questo argomento nel prossimo volume dell'enciclopedia. ------------------------------ Appendice -A- USARE SOFTICE ------------------------------ Visto che con Soft-ice non Φ fornito un manuale dei comandi, cercher≥ ora di spiegarvi le sue principali funzionalitα. Iniziamo quindi dall'interfaccia. La finestra principale di Soft-ice Φ divisa in settori, ognuno di questi pu≥ essere abilitato oppure no. Vediamo quali sono, e i comandi per richiamarle: Code Window - Qui si pu≥ leggere il codice del programma. Comando WC Data Window - Segmento Data. Comando WD Floating Point Window - Registri in floating point. Comando WF Register Window - Tutti i registri e i Flag. Comando WR Watch Window - Per seguire i cambiamenti di un registro. Comando WW Io consiglio di tenere attivate solo WC e WR. Per impostare di default queste finestre, in modo da avere sempre la stessa configurazione ad ogni avvio di Soft-ice. Lanciate il Symbol Loader e selezionate dal menu edit la voce Soft-Ice inizialization setting. Nella sezione general scrivete nella textbox Inizialization String i comandi che pi∙ desiderate. Fate attenzione a dividerli con un ; e a terminare la stringa sempre con X; Appena installato Soft-ice visualizza wc e wl quindi nel nostro caso la stringa sarα "wr;wl;X;" per avere la configurazione WR WC. Nella versione per Windows 95 questa configurazione si trova nel file "winice.dat" e pu≥ essere modificato come un file di testo. Vediamo ora i comandi che useremo pi∙ di frequente: *** Breakpoint BPX indirizzo - Breakpoint su indirizzo BPX nome api - Breakpoint sull'API BL - Visualizza la lista dei breakpoint BC numero breakpoint - Cancella il breakpoint relativo al numero di lista *** Stepping F8 - Step Into F10 - Step Over F12 - RET ritorna all'istruzione dopo la call *** Memoria D indirizzo - Visualizza il contenuto di quell'indirizzo D registro - Visualizza il contenuto del registro *** Flag Nella finestra dei registri (WR) basta selezionare un Flag (es. Z) e pigiare il tasto "ins", il suo valore cambierα da 0 a 1 e viceversa. ------------------ 4.0 CONCLUSIONI ------------------ Il prossimo numero Φ giα in cantiere... argomento: Key Generator. Per avere eventuali future release di questo manuale scrivete a: nz2@usa.net oppure visitate il sito http://Alor.home.ml.org "If you give a man a crack he'll be hungry again tomorrow, but if you teach him how to crack, he'll never be hungry again" +ORC .-. .-. / \ .-. .-. / \ / \ / \ .-. .-. / \ / \ ---/-------\-------/-----\-----/---\---/---\-----/-----\-------/-------\--- / \ / \ / `-' \ / \ / \ / \ / `-' `-' \ / \ / `-' `-' \ Greetings to: LordKasKo (my cracking teacher...) The other NEURO ZONE 2 members (10t8or, DK2DEnd, LordKasKo, MaPHas, Ob1, TurboSnail, XXXX) All the Cracker on the NET from whom I have learned something. ============================================================================== .________ ._ / .__ ) / / .________ ._____ / (___) / / / / .__ ) / ._ ) ..: . . . . / .___ / / / / / ) / / / /_/ .. : : . . / / / / / /____ / /___/ / / / :: .:: . . . . (__/ (__/ (________)(_________/ (__/ .:. : . : . . . --==> ALoR <==---------------------- - - - ICQ: 10666678 In IRC: WhiteFly e-mail: ALoR@thepentagon.com www: http://ALoR.home.ml.org/ ==============================================================================