Corso UIC Newbies 02 Guancy
From UIC
Totally Newbies 2°
Contents |
| Infos | |
|---|---|
| Author: | Guancy |
| Email: | ilm_sat@yahoo.it |
| Website: | *** |
| Date: | 05/01/2007 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | Corso n° 2 per totali NewBies |
Tools
Link e Riferimenti
Questo è il Corso UIC Newbies n°02 disponibile alla pagina Corsi UIC Newbies
Introduzione
This is lesson n° 2 of NewBies course.
There are 3 program: 1st NagScreen, 2nd and 3rd serial number.
Essay
CrackMe 1
Il primo CrackMe è di una semplcità disarmante. Lo scopo è quello di patchare l'eseguibile in modo tale che si elimini il NagScreen iniziale.
Caricando il programma in OllyDbg (d'ora in poi Olly) appare immediatamente il codice relativo alla MessageBox da eliminare.
0040100E PUSH 00402079// |Title = "CrackMe 1.0 by PhoX"
00401013 PUSH 0040208D// |Text = "Plz registrate this CrackMe... [...]
00401018 PUSH DWORD PTR DS:[402048]//|hOwner = NULL
0040101E CALL <nowiki><</nowiki>JMP.&USER32.MessageBoxA<nowiki>></nowiki>//MessageBoxA
A questo punto è sufficiente noppare (ovvero sostituire i comandi con dei NOP) le PUSH relative alla MessageBox ed il gioco è fatto. Per fare questo selezioniamo tutto il codice, clicchiamo sul primo PUSH con il tasto destro del mouse e scegliamo "View-->Executable File". A questo punto si preme CTRL+E e si sostituiscono tutti i byte con dei bei 90 90 90 90 90...tutte NOP.Ora sarà sufficiente cliccare con il tasto destro del mouse e selezionare Save file per salvare il file craccato.
CrackMe 2
Per questo programma dobbiamo trovare un Serial Number valido. Avviamolo, inseriamo il nostro serial di prova 666111666, e clicchiamo su OK. Ci appare una bella MessageBox con scritto Wrong Serial. Carichiamo il programma con OllyDbg ed effettuiamo una ricerca delle stringhe referenziate tramite Search for --> all referenced text string per trovare la stringa della messagebox incriminata.
4011A7 CALL <nowiki><</nowiki>JMP.&USER32.GetWindowTextLengthA<nowiki>></nowiki>
Chiamata all'API GetWindowTextLengthA
4011AC MOV DS:[4020E9],EAX sposta la lunghezza del serial in
DS:[4020E9]
4011B1 MOV ESI,EAX //sposta EAX in ESI
4011B3 CMP ESI,0C //confronto con &0C
4011B6 JNZ SHORT 004011D6 //se non è uguale salto a Errore
4011B8 PUSH 30
4011BA PUSH 00402091
4011BF PUSH 00402097
4011C4 PUSH DWORD PTR DS:[402048]
4011CA CALL <nowiki><</nowiki>JMP.&USER32.MessageBoxA<nowiki>></nowiki> //MessageBox di congratulazioni
4011CF POP ESI
4011D0 POP EDI
4011D1 POP EBX
4011D2 LEAVE
4011D3 RETN 10
4011D6 PUSH 30
4011D8 PUSH 004020ED
4011DD PUSH 004020FB
4011E2 PUSH DWORD PTR DS:[402048]
4011E8 CALL <nowiki><</nowiki>JMP.&USER32.MessageBoxA<nowiki>></nowiki> //MessageBox di ERRORE
Come si evince chiaramente dal codice la routine di controllo del seriale è molto semplice: è sufficiente inseire un seriale la cui lunghezza sia pari a &0C=12 char. Quindi GuancyRulez! è una password che va bene.
CrackMe 3
Procedendo come al CrackMe precedente ovvero cercando fra le stringhe referenziate del programma quella relativa alla MessageBox di errore giungiamo in questo punto:
4011B1 CALL <nowiki><</nowiki>JMP.&USER32.GetWindowTextLengthA<nowiki>></nowiki>
Chiamata all'API GetWindowTextLengthA
4011B6 MOV ESI,EAX
4011B8 CMP ESI,12 //confronta che il serial inserito sia di 12 char
4011BB JNZ SHORT 0040121C //se non è di 12 ERRORE
4011BD CMP BYTE PTR DS:[EBX],46 //confronta il 1° byte con &46='F'
4011C0 JNZ SHORT 0040121C //se non è uguale ERRORE
4011C2 CMP BYTE PTR DS:[EBX+1],69 //confronta il 2° byte con &69='i'
4011C6 JNZ SHORT 0040121C //se non è uguale ERRORE
4011C8 CMP BYTE PTR DS:[EBX+3],72 //confronta il 4° byte con &72='r'
4011CC JNZ SHORT 0040121C //se non è uguale ERRORE
4011CE CMP BYTE PTR DS:[EBX+4],65 //confronta il 5° byte con &69='e'
4011D2 JNZ SHORT 0040121C //se non è uguale ERRORE
4011D4 CMP BYTE PTR DS:[EBX+6],57 //confronta il 7° byte con &69='W'
4011D8 JNZ SHORT 0040121C //se non è uguale ERRORE
4011DA CMP BYTE PTR DS:[EBX+7],6F //confronta il 8° byte con &69='o'
4011DE JNZ SHORT 0040121C //se non è uguale ERRORE
4011E0 CMP BYTE PTR DS:[EBX+8],72 //confronta il 9° byte con &69='r'
4011E4 JNZ SHORT 0040121C //se non è uguale ERRORE
4011E6 CMP BYTE PTR DS:[EBX+A],78 //confronta il 11° byte con &69='x'
4011EA JNZ SHORT 0040121C //se non è uguale ERRORE
4011EC CMP BYTE PTR DS:[EBX+C],53 //confronta il 13° byte con &69='S'
4011F0 JNZ SHORT 0040121C //se non è uguale ERRORE
4011F2 CMP BYTE PTR DS:[EBX+D],75 //confronta il 14° byte con &69='u'
4011F6 JNZ SHORT 0040121C //se non è uguale ERRORE
4011F8 CMP BYTE PTR DS:[EBX+10],78 //confronta il 17° byte con &69='x'
4011FC JNZ SHORT 0040121C //se non è uguale ERRORE
4011FE PUSH 30
401200 PUSH 0040207F
401205 PUSH 0040208B
40120A PUSH DWORD PTR DS:[402048]
401210 CALL <nowiki><</nowiki>JMP.&USER32.MessageBoxA<nowiki>></nowiki> //MessageBox di COMPLIMENTI
401215 POP ESI
401216 POP EDI
401217 POP EBX
401218 LEAVE
401219 RETN 10
40121C PUSH 30
40121E PUSH 004020C0
401223 PUSH 004020D1
401228 PUSH DWORD PTR DS:[402048]
40122E CALL <nowiki><</nowiki>JMP.&USER32.MessageBoxA<nowiki>></nowiki> //MessageBox di ERRRORE
Ora leggendo il codice si capisce subito quale sia il seriale esatto: prima di tutto ha una lunghezza di &12=18 char; poi il programma effettua un controllo solo su alcuni char e precisamenti quelli in posizione 1 2 4 5 7 8 9 11 13 14 17, gli altri possono essere qualunque cosa.
Quindi come password va bene sia FiGreUWorAxNSuCYx! sia Fi re Wor x Su x.
Note Finali
Grazie alla U.I.C. di esistere.
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.