Corso UIC Newbies 01 Fantoibed
From UIC
Soluzione al 1° corso newbies - Cracking...Chi era costui?
Contents |
| Infos | |
|---|---|
| Author: | fantoibed |
| Email: | fantoibed@iname.com |
| Website: | |
| Date: | 03/05/2000 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Mi fa molto piacere che tutti i newbies si stiano applicando con le varie soluzioni e vi faccio i miei complimenti, fantoibed oltretutto ha presentato un'ottima soluzione ed un ottimo form, oltretutto con una sapiente gestione delle tabelle, bravo fantoibed |
Introduzione
Quequero ha già scritto un tutorial sul crackaggio di questo programmino. Lui si è avvalso SoftIce e io, per non ripetere cose già dette, ho deciso di utilizzare di W32Dasm e Hiew.
Tools
...e magari una bella gnocca che vi fa i massaggini mentre lavorate! ;-)
Link e Riferimenti
Questo è la soluzione del Corso UIC Newbies n°01 disponibile alla pagina Corso UIC Newbies 01
Essay
Eccomi alle prese con il primo esercizio di crackaggio proposto dalla UIC. Darò per scontata la lettura del tutorial di Quequero e cerchero', per quanto possibile, di non ripetere le cose già dette. Approfondiro',inoltre, alcuni concetti che magari non sono chiarissimi ai principianti come me.
Veniamo al dunque. Appena installato il deskey, sono andato subito a leggermi le informazioni inerenti la registrazione. Ecco cosa viene detto all'interno dell'help:
This version of Deskey is for evaluation purposes only, and will run for only 60 minutes at a time before terminating itself. To obtain a non-timed version of the software, or to use the software beyond the 30-day evaluation period, you must register.
Quando l'ho letto ho pensato: porco cane, qui bisogna togliere anche il controllo su 30 giorni, oltre a quello sui 60 minuti già spiegato da Quequero. Ho provato a spostare avanti la data del mio computer di 2 mesi e ho provato a far ripartire deskey. Sorpresa! Funzionava regolarmente... Mah, che strano! Comunque, visto che non sembra esserci alcun controllo sulla data, mettiamoci al lavoro per eliminare il timer che disabilita il programma dopo 60 minuti.
Entriamo nel merito della questione. Facciamo partire W32Dasm e carichiamo il file Deskey.exe. Clickiamo il tasto con l'icona della torcia elettrica e cerchiamo l'istruzione Settimer. Tralasciando quella trovata nella dichiarazione delle API, possiamo trovare settimer in tre posizioni:
- Posizione 1
00402FB9 81FF68240000 cmp edi, 00002468
00402FBF 7549 jne 0040300A
00402FC1 833D1090400000 cmp dword ptr [00409010], 00000000
00402FC8 741F je 00402FE9
00402FCA 6A00 push 00000000
00402FCC A128904000 mov eax, dword ptr [00409028]
00402FD1 68E8030000 push 000003E8
00402FD6 6868240000 push 00002468
00402FDB 50 push eax
;*Reference To: USER32.SetTimer, Ord:01FEh |
00402FDC FF158CB44000 Call dword ptr [0040B48C]
00402FE2 33C0 xor eax, eax
- Posizione 2
00403010 0F85AE090000 jne 004039C4
00403016 833D1090400000 cmp dword ptr [00409010], 00000000
0040301D 741F je 0040303E
0040301F 6A00 push 00000000
00403021 A128904000 mov eax, dword ptr [00409028]
00403026 68E8030000 push 000003E8
0040302B 6834120000 push 00001234
00403030 50 push eax
;*Reference To: USER32.SetTimer, Ord:01FEh|
00403031 FF158CB44000 Call dword ptr [0040B48C]
00403037 33C0 xor eax, eax
- Posizione 3
0040397F 833D1890400000 cmp dword ptr [00409018], 00000000
00403986 7409 je 00403991
00403988 833D1C90400000 cmp dword ptr [0040901C], 00000000
0040398F 7421 je 004039B2
;*Referenced by a (U)nconditional or (C)onditional Jump at Address:|00403986(C)|
00403991 6A00 push 00000000
00403993 A128904000 mov eax, dword ptr [00409028]
00403998 6880EE3600 push 0036EE80
0040399D 6834120000 push 00001234
004039A2 50 push eax
;*Reference To: USER32.SetTimer, Ord:01FEh|
004039A3 FF158CB44000 Call dword ptr [0040B48C]
004039A9 8BBC24AC060000 mov edi, dword ptr [esp+000006AC]
In quale di queste tre parti dobbiamo andare a mettere le mani? Per saperlo, diamo un'occhiata al Win32SDK, documento che trovate allegato a qualsiasi compilatore (se proprio non ce l'avete, andate a scaricarvelo dal sito della Microsoft).
Ecco cosa dice:
| SetTimer
The SetTimer function creates a timer with the specified time-out value. UINT SetTimer(
);
hWnd
nIDEvent
uElapse
lpTimerFunc
If lpTimerFunc is NULL, the system posts a WM_TIMER message to the application queue. The hwnd member of the message's MSG structure contains the value of the hWnd parameter. Return Values If the function succeeds, the return value is an integer identifying the new timer. An application can pass this value, or the string identifier, if it exists, to the KillTimer function to destroy the timer. If the function fails to create a timer, the return value is zero. To get extended error information, call GetLastError. Remarks An application can process WM_TIMER messages by including a WM_TIMER case statement in the window procedure or by specifying a TimerProc callback function when creating the timer. When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER. The wParam parameter of the WM_TIMER message contains the value of the nIDEvent parameter. |
Tenendo presente che la chiamata ad una subroutine sfrutta il metodo LIFO nel passaggio dei parametri, possiamo risalire all'istruzione inserita dal programmatore nei tre stralci di disassemblato che stiamo analizzando. Ecco cosa otteniamo (scrivo direttamente i valori in decimale):
1) Settimer(hWnd,9320,1000,NULL) 2) Settimer(hWnd,4660,1000,NULL) 3) Settimer(hWnd,4660,3600000,NULL)
Osservando questi 3 comandi e tenendo conto che ho indicato per comodità con hWnd il puntatore alla locazione 403010, possiamo notare alcune peculiarita'. Innanzitutto il valore di uscita della funzione viene ignorato in tutti e tre i casi (si può notare che nelle tre porzioni di disassemblato, dopo la call c'è uno xor eax,eax). Come seconda cosa, possiamo notare che al posto del puntatore alla funzione timer, viene passato un valore nullo che indica che sarà l'applicazione stessa a rispondere all'evento WM_TIMER. Come terza constatazione, ma non per questo meno importante, (anzi è proprio qui il nocciolo della questione) dobbiamo analizzare il timeout del buffer. Nei primi due casi vale 1000 millisecondi, mentre nel terzo caso vale un'ora. Sarà proprio questa la zona da crackare!
Il resto è abbastanza semplice, ed è stato già brillantemente spiegato da Quequero. Si tratta di analizzare i due salti condizionati in modo che non venga chiamata l'api settimer. Dovremo, in pratica, sostituire il primo dei due salti con un jmp alla locazione di memoria puntata dal secondo.
Scriviamoci su un foglietto la riga da modificare, cioe' la 403986, chiudiamo il W32Dasm e apriamo l'Hiew. Andiamo a selezionare il deskey.exe e apriamolo. Facciamo F4->Decode per impostare una modalità di visualizzazione consona al lavoro che stiamo andando ad effettuare. Premiamo F5 e specifichiamo la locazione .403986 (mi raccomando il punto!!!). Premiamo F3 per modificare questa linea e successivamente F2 per modificare il codice in assembler. Come potete notare, le locazioni di memoria sono tutte cambiate, ma il codice è sempre lo stesso. Secondo la nuova numerazione, dobbiamo modificare la riga 2D86, che dice "je 000002d91" in "jmps 2db2".
Ci verrà mostrata una finestra di dialogo che dice "je 000002d91". Scriviamo la nuova riga e premiamo invio e poi esc. Attenzione a scrivere "jmps" e non "jmp", perché altrimenti viene fuori un po' di casino. Se avete fatto casino, potete sempre tornare indietro con F3. La modifica effettuata sarà segnata in giallo. Premete F9 per salvare le modifiche.
Dopo la pressione del tasto F9, torniamo al menù precedente, con la numerazione classica delle righe, e notiamo che tutto è stato modificato correttamente. Possiamo passare dalla numerazione locale a quella globale e viceversa premendo Alt+F1.
Premiamo F10 per uscire e salvare le modifiche, e voila', il file è stato crackato con successo!!!
Mi scuso se l'italiano non è così aulico, ma andavo un po' di fretta quando ho buttato giù questi appunti...
Mandi, fantoibed
Note finali
Sinceramente, non ho mai fatto trascorrere i 60 minuti occorrenti all'esecuzione del sistema di protezione, ma si potrebbe provare a modificare il file "al contrario", diminuendo i 60 minuti a pochi secondi... Vedremo di farlo un'altra volta...
Disclaimer
I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.
Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.