Corso UIC Newbies 02 Jnzero
From UIC
Corso UIC Newbies 02 Jnzero
Contents |
| Infos | |
|---|---|
| Author: | Jnzero |
| Email: | jnzer0@interfree.it |
| Website: | Home page |
| Date: | 16/06/2001 (dd/mm/yyyy) |
| Level: |
|
| Language: | Italian |
| Comments: | |
Tools
- SoftIce (va benissimo anche OllyDbg v1.10)
- Hexworkshop oppure un editor esadecimale qualunque
Link e Riferimenti
Questo è il Corso UIC Newbies n°02 disponibile alla pagina Corsi UIC Newbies
Notizie sul Programma
3 semplici crackme, ovvero programmi costituiti dalla sola protezione fatti apposta per essere crackati.
Essay
CrackMe1
Questo è il più semplice tra questi crackme, bisogna esclusivamente togliere la nag che si presenta all'apertura del programma. Ok aprimamo con "anteprima" crackme1.exe e vediamo le api che utilizza: quella che ci interessa è MessageBoxA, che viene utilizzata per fare i nagscreen. Bene, premiamo Ctrl+d per entrare in SoftIce e scriviamo:
bpx messageboxa, ovvero breakpoint on execution sull'api messageboxa.
Premiamo poi F5 per tornare a Windows e avviamo il programma, e SoftIce farà la sua comparsa, e saremo all'interno di USER32.dll, ovvero la dll in cui è contenuta MessageBoxA; ora premiamo F11 per tornare alla call che ha chiamato MessageboxA e saremo di nuovo in Windows, con il nostro bel nagscreen davanti al naso. Premiamo Ok e il controllo passa di nuovo al SoftIce; ora siamo all'interno del crackme (lo si capisce dal fatto che nella barra verde sopra al prompt dei comadi c'è scritto crackme1.exe)un istruzione sotto la call, dovreste vedere più o meno questo:
MOV DWORD PTR [00402000], 00004003 // qui dovrebbe essersi fermato il cursore del Sice
MOV DWORD PTR [00402001], 0040113d
adesso apriamo crackme1.exe con hexworkshop e clicchiamo sul tasto a forma di lente di ingrandimento,ovvero find, adesso scriviamo nel box che si è appena aperto "E8DA010000" (senza gli apici) e lo mettiamo al posto di E8DA010000 9090909090. Bene, adesso il primo crackme è stato patchato.
CrackMe2
In questo crackme viene richiesto un serial, e se immettiamo un nome sbagliato viene fuori un massagebox che ci dice "Wrong Serial" . Bene, vediamo con "anteprima" che api utilizza, quella che ci interessa questa volta è getwindowtextlenghta, questa funzione serve per "salvare la lunghezza in caratteri della barra del titolo di una specificata finestra" (come dice il Que ;0).
Mettiamo un bel: bpx getwindowtextlengtha, apriamo il crackme2.exe e clicchiamo Ok sotto la barra dove si deve mettere il serial (lasciate pure "Enter Serial Here") e Sice farà la sua apparizione, premiamo F11 per uscire da USER32.dll, e vedremo qualcosa del genere:
MOV [004020E9], EAX // qui si è fermato il cursore del SoftIce
MOV ESI, EAX
Adesso apriamo hexworkshop e premiamo l'icona con la lente di ingrandimento e scriviamo "751E" (ovvero "jnz 000007d6" all'indirizzo 000007b6; per la conversione da asm a esedecimale ho usato il PHOG, scaricatevelo, è utile @:0) Estremamente utile oserei dire...NdQue e sotituitelo con 741E, ovvero jz (l'opposto di jnz).Prima del Jump(che sia jnz o Jz adesso non importa) il programma confrotava ESI con 0C, ovvero 12 decimale, questo vuol dire che prima il programma si registrava se si inseriva un serial di 12 caratteri mentre adesso il box di errore appare solo se si inserisce un serial di 12 caratteri. Volendo si potrebbe modificare il programmino in modo che si registri solo con 8 caratteri, o con quanti ne volete, ma adesso vado un po' di fretta.
CrackMe3
Questo è quello che ho risolto in più tempo, comunque non è difficile.
Apriamo come sempre "anteprima" e vediamo che anche questo crkme utilizza getwindowtextlengtha (api più corte no eh?) per salvare il serial. Apriamo il SoftIce e mettiamo un: bpx getwindowtextlengtha. Ora schiacciamo Ok e SoftIce popperà, schiacciamo F11 e ci ritroviamo nel codice di crackme3.exe, la situazione sarà la seguente:
MOV ESI, EAX // muove in esi il numero di caratteri immessi
CMP ESI, 12 // vede se il numero di caratteri immessi è uguale a 12 esedecimale
// ovvero 18 decimale
JNZ 0040121C // se i caratteri non sono 18 salta alla messagebox di errore
CMP BYTE PTR [EBX], 46 // vede se il primo carattere inserito è uguale a 46h ovvero
// F(maiuscolo)
JNZ 0040121C // se non è così và immediatamente alla messagebox di errore
CMP BYTE PTR[EBX+01], 69 // secondo carattere=69(i)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+03], 72 // quarto carattere(perchè si parte da 00, quindi 03 è il
// quarto)=72(r)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+04], 65 // quinto carattere=65(e)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+06], 57 // settimo carattere=57(W maiuscolo)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+07], 6F // ottavo carattere=6F(o)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+08], 72 // decimo carattere=72(r)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+0A], 78 // undicesimo carattere(A=11 decimale)=78(x)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+0C], 53 // tredicesimo carattere=53(S maiuscolo)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+0D], 75 // quattordicesimo carattere=75(u)?
JNZ 0040121C // se sì và avanti nel controllo, se no salta alla messagebox di errore
CMP BYTE PTR[EBX+10], 78 // diciassettesimo carattere=78(x)?
JNZ 0040121C // se sì và alla messagebox di congratulazioni, se no salta alla messagebox di errore
Quindi il serial corretto deve essere così: Fi*re*Wor*x*Su**x* (sarà qualcuno che gli stà sulle palle), dove gli asterischi sono caratteri scelti da voi. Si ma, noi vogliamo che compaia la messagebox di congratulazioni quando inseriamo un serial sbagliato ,non quando inseriamo il serial giusto. Io non sono riuscito subito a risolvere punto, e alla fine ho dovuto utilizzare il WDasm, apriamo crackme3.exe e clicchiamo sul penultimo dei tastini quadrati, ovvero StringDataReferences, nel box che appare si possono vedere tutte le stringhe contenute nel programma, e clicchiamo 2 volte su "Nice Works!!" che se vi ricordate è la caption (ovvero il testo contenuto nella righa alta blu delle finestre) della messagebox di congratulazioni. Adesso ci ritroveremo il cursore su "push 0040207F", *non muovetelo* e guardiamo nella riga bassa della finestra e tra le tante scritte dovrebbe esserci @Offset 00000800h, questo è l'offset della primo parametro della messagebox di congratulazioni. Adesso apriamo il crackme con hexworkshop e clicchiamo sul tasto find (la lente di ingrandimento), e cerchiamo 755F con 7543; così facendo il crackme quando fa il primo controllo se la prima lettera non è F(maiuscola) salta immediatamente al box di congratulazioni.
Note Finali
Vorrei ringraziare QueQuero Quequero plz :) Quèquéro così ora sai anche la pronunia :P che ha fondato la UIC, che senza di essa non sarebbe uguale @:0) e voglio scusarmi per gli errori che probabilmente ho commesso in questo tute. Io non mi ritengo un neanche un newbie, ma un wannabe e ringrazio tutti quelli che hanno partecipato alla uic, che così facendo mi danno l'opportunità di imparare qualcosa di nuovo.
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.