Zoom Icon

Corso UIC Avanzato 01 Syscalo

From UIC Archive

UIC Avanzato 01 Syscalo

Contents


Corso UIC Avanzato 01 Syscalo
Author: Syscalo
Email: [email protected]
Website: Home page
Date: 26/08/1999 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Flag Italian.gif
Comments:



Tools

SoftIce (credo sia sufficiente il nome;)


Link e Riferimenti

Questo è il Corsi UIC Avanzati n°01 disponibile alla pagina Corsi per Studenti


Introduzione

Soluzione lezione #1 di UIC. Tutorial su come fregare la protezione di questo programma. (non sono 2 righe ma fa niente;)

Il sistema di protezione di questo programma non è difficile da fregare! Basta individuare quelle poche istruzioni che determinano la giusta strada. È invece un po' più difficile comprendere il meccanismo di creazione del seriale, ma ci si può arrivare.


Essay

Purtroppo ho potuto dedicare solo mezza giornata a questo programma (lo so che per molti è anche troppo;) quindi non sono ancora riuscito a ricavare il seriale corretto; sono sulla buona strada ma ho ancora qualche problema. Bhe, forse è il caso di iniziare... Ovviamente softice deve essere già attivo sul vostro sistema, se no dove volete andare ;) La funzione usata dal programma per acquisire nome e seriale è GetWindowTextA. Per sgamarla non è necessario provare le tre consigliate da Quequero, basta fare l'anteprima dell'exe (una cosa utile di window$ ;). Syscalo ha ragione, questa tecnica può però essere usata solo in caso di programmi piccoli dal momento che un programma già di 100kb è probabile che le usi tutte e tre NdQue. Impostiamo un break sulla funzione: bpx GetWindowTextA, avviamo il programma, inseriamo nome e seriale e premiamo il pulsante. Ecco softice! Premere F11 per uscire dalla funzione e siamo subito nel nostro programma. Ora si può vedere che poche istruzioni dopo c'è la chiamata per leggere il seriale. Bene, premiamo F12 per fermarci proprio al ritorno da quest'ultima. Si può notare che prima delle chiamate viene impostato il # max di caratteri da leggere a 8 (istr. PUSH 08) quindi se ne scrivete di più non verranno nemmeno letti. Nei parametri passati vi sono anche gli indirizzi dove vengono memorizzati i dati: PUSH 00402165 (ind. nome) PUSH 00402169 (ind. serial); già da qui si può capire che del nome verranno conservati solo 4 chr (sta per caratteri:) perché ai successivi si sovrappongono quelli del seriale. Per vedere come sono memorizzati i dati dopo la lettura basta dare il comando: d 00402165. Inoltre dopo ognuna delle due funzioni si può vedere in EAX il # di chr effettivamente letti. Passiamo al codice puro: Troviamo le seguenti istruzioni MOV EBX,00402169 ind. inizio seriale MOV EDX,EAX EAX contiene il # chr letti dal seriale XOR ECX,ECX azzera ECX (1) MOV AL,[ECX+00402165] carica in AL il cod. ASCII dal primo chr del nome ADD AL,12 // algoritmo che calcola il valore di confronto XOR AL,CL // algoritmo che calcola il valore di confronto ADD AL,15 // algoritmo che calcola il valore di confronto ADD AL,02 // algoritmo che calcola il valore di confronto MOV EBX,00402169 //(inutile)

Semi-Errore: questo pezzo di codice non è assolutamente inutile, non potete considerarlo come junk, però potete considerare junk la stessa istruzione all'indirizzo 401221, infatti è più logico muovere l'offset di un buffer in un registro appena prima dell'operazione che lo userebbe piuttosto che alcune righe sopra, mi spiego meglio supponiamo di avere questa routine: CALL GetWindowTextA, EditHWnd, offset Buffer, 20 mov eax, offset Buffer CALL GetWindowTextA, Edit2HWnd, offset Altro_Buffer, 20 mov ebx, dword ptr[eax] ciò che succede è che dopo la prima chiama a GetWindowTextA sposto l'offset di ciò che leggo dalla prima casella in EAX, poi dopo la seconda chiamata muovo ciò che contiene eax in ebx, il problema è che il contenuto di eax è stato sovrascritto dopo la seconda chiamata e quindi non ho più nulla, conviene quindi spostare l'offset del buffer sempre prima dell'operazione che si deve eseguire, innanzitutto perché il contenuto nelle righe di codice successive rischierebbe di essere cambiato e poi il registro ci potrebbe sempre servire, questa è una piccolissima trappola che ho inserito e syscalo ci è cascato, non è grave però dovete starci attenti perché mi è capitato varie volte di trovare trappole di questo tipo nei programmi NdQue

MOV AH,[ECX+EBX]// carica in AH il cod. ASCII dal primo chr del seriale CMP AL,AH //confronta cod. chr nome elaborato con cod chr seriale (×) JNZ 00401311// se sono diversi visualizza msg di errore INC ECX //conteggio # confronti INC EAX CMP ECX,03 //esegue le istr precedenti per tre volte JNZ 0040122A //salta a (1)


qui è presente una serie di confronti e salti inutili; proseguire con F10 fino al seguente codice


(2) MOV AL,[ECX+00402165]// carica in AL cod ASCII dal primo chr del seriale XOR AL,16 // elabora il chr ADD AL,45 // elabora il chr ADD AL,CL // elabora il chr MOV BL,[ECX+00402169]// carica in BL cod ASCII dal quarto chr del seriale CMP AL,BL confronta cod ASCII chr seriale elaborato con chr dal quarto del seriale (×) JNZ 00401311 //se sono diversi visualizza msg di errore INC ECX //conteggio chr CMP ECX,08 //esegue le istr precedenti fino a quando ECX=8 JNZ 004012A9 //salta a (2)


qui è presente una serie di confronti e salti inutili;

proseguire con F10 fino al seguente codice 

(×) CALL 00401351 chiama una funzione che esegue ancora dei controlli sul nome e sul seriale CMP AL,01 // controlla in valore ritornato dalla funzione (ø) JZ 00401338 //se il valore ritornato è 1 visualizza il msg codice ESATTO ora tutto quello che c'è da fare è NOPpare le istuzioni indicate con (×) con il comando "e indirizzo_istr" e scrivendo sequenze di 90 al posto dell'opcode dell'istruzione. Va inoltre modificato il salto indicato con (ø) in un JMP tramite il comando "e indirizzo_istr" e scrivendo EB al posto di 74 Ora potete inserire qualsiasi nome e seriale che il programma si congratulerà sempre con voi ;)

LE MODIFICHE APPORTATE DA SOFTICE NON SONO PIU' VALIDE SE RIAVVIATE IL PROGRAMMA, DOVRETE QUINDI RIPETERE TUTTO :-{ RICORDATEVELO!


Note Finali

Insomma bene o male siamo giunti alla fine!!! Mi scuso per il brutto modo in cui si presenta il codice del programma ma il potentissimo stumento che ho utilizzato per modificare la pagina (notepad!) non mi permetteva di fare di meglio (visto che tutto il codice HTML che conosco l'ho imparato da questa pagina ;). Spero di essere stato il più comprensibile possibile, tenuto conto che è il primo tutorial che scrivo e visto che ho iniziato gli studi alla UIC da un paio di settimane. Il crack per me, prima d'ora, era solo il programma che permetteva di usare software gratis, ora è diventato una sfida personale per migliorare sempre e testare le proprie capacità.

Ora è giunto il momento dei ringraziamenti. Per questa prima volta voglio farne uno soltanto, ma credo che sarà il più importante che potrò mai fare:

GRAZIE QUEQUERO

(sa un po' di leccaculo o è una mia impressione;) Giusto un po' :)) NdQue-questa nota me la sono aggiunta da solo, non è di Quequero-

Ciao a tutti


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 malevole 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.