Zoom Icon

Corso UIC Avanzato 02 Steda

From UIC Archive

Corso UIC Avanzato 02 Steda

Contents


Corso UIC Avanzato 02 Steda
Author: Steda
Email: Email
Website: Home page
Date: 09/09/1999 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Flag Italian.gif
Comments:



Tools


Link e Riferimenti

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



Introduzione

Verrà spiegato nel migliore dei modi il funzionamento del progr. di Quequero, appartenente alla seconda lezione della U.I.C. Spero che Quequero non si arrabbi quando scoprirà che ho utilizzato il suo stesso programma per creare il Keygenerator, ma non sono ancora in grado di scriverne uno dall'inizio. Un saluto a tutti by Steda.


Notizie sul Programma

Il programma è costituito da un solo form di registrazione e da tre message box.


Essay

00401215 mov al, byte ptr [ecx+0040219F] ;Porta il primo carattere il "al" 0040121B test eax, eax 0040121D je 00401279 Se il campo è vuoto salta (quando finisce la 1. modifica al codice) 0040121F xor al, cl 00401221 mov edi, ecx 00401223 mul edi ;Vedi spiegazione in fondo 00401225 sub al, 25 00401227 add al, cl 00401229 xor al, byte ptr [ecx+00402000] Xorra "al" con un byte preso dalla memoria. 0040122F mov edx, 00402193 00401234 mov ebx, dword ptr [0040219F] 0040123A xor ebx, edx 0040123C mov edx, 00402183 00401241 xor ebx, edx 00401243 add ebx, ecx 00401245 add al, byte ptr [ecx+00402000] 0040124B xor bl, byte ptr [ecx+00402000] 00401251 shl al, 02 00401254 ror al, 04 00401257 shr bl, 03 0040125A rol bl, 08 0040125D xor bl, al 0040125F xor bl, byte ptr [00402002] 00401265 xor bl, cl 00401267 rol bl, 08 0040126A add bl, al 0040126C sub al, 05 0040126E sub bl, al 00401270 mov byte ptr [ecx+0040218F], al Il codice viene salvato in memoria 00401276 inc ecx 00401277 jmp 00401215 // Torna all'inizio della procedura

Questa è la prima routine di modifica del codice. Attenzione... il primo carattere del codice non serve praticamente a nulla; infatti la stringa "mul edi" (essendo Edi=0) , nel primo passaggio azzera Eax(il primo carattere) e di conseguenza la routine genera un numero identico per qualsiasi carattere immesso all'inizio. Tutte le altre istruzioni non fanno altro che crittare il codice da noi immesso.

00401279 xor ecx, ecx 0040127B mov al, byte ptr [ecx+0040218F] "40218F" Contiene il nostro codice modificato; C1 è fisso 00401281 test al, al 00401283 je 00401331 Se il campo è vuoto salta(quando finisce la 2. modifica al codice) 00401289 cmp al, 66 0040128B jg 0040131B // Salta se il valore è troppo elevato 00401291 cmp al, 30 00401293 jl 00401326 // Salta se il valore è troppo basso 00401299 inc ecx 0040129A mov byte ptr [ecx+004021A7], al 004012A0 jmp 0040127B // Torna all'inizio della procedura

Sia il jmp condizionale in 40128B che quello in 401293 non fanno altro che bloccare il nostro codice in un range di valori accettabili (Perchè altrimenti sarebbe impossibile poi dare una pass. valida via tastiera).

00401331 xor ecx, ecx 00401333 mov al, byte ptr [ecx+004021A7] // Ancora il nostro codice 00401339 test al, al 0040133B je 004012C8 Se il campo è vuoto salta(quando finisce la 3. modifica al codice) 0040133D mov ah, byte ptr [ecx+004021A8] 00401343 je 004012C8 Inutile dato che il test è in comune ed il jump cond. è lo stesso 00401345 cmp ah, al Controlla se il primo ed il secondo carattere sono uguali 00401347 inc ecx 00401348 inc edx 00401349 jne 004012BA Riferito al cmp di 401345 Salta se i valori sono diversi (La maggior parte delle volte, credo) 0040134F add al, 02 00401351 cmp al, 66 00401353 jg 00401366 // Salta se "al" è maggiore di 66 * 00401355 cmp al, 30 00401357 jl 0040135B // Salta se al è minore di 30 ** 00401359 jmp 00401333 // Torna all'inizio della procedura

Non capisco perché ma in questo punto viene letto il nostro codice un carattere prima (il 12 è fisso e risiede in memoria)

Queste sono altre due routine che costringono il codice a rimanere in un range di valori accettabili:

  • Questa routine non fa altro che sottrarre 3 ad "al" fino a quando non è sceso al di sotto di 66; il valore viene poi salvato con la routine di prima: la 4012BA.
  • Questa routine invece addiziona 2 ad "al" fino a quando non è al di sopra di 30; il valore viene ancora una volta salvato con la routine 4012BA.

004012BA mov byte ptr [ecx+00402173], al // Salva "al" in ecx+402173 004012C0 mov byte ptr [ecx+00402174], ah // Salva "bl" in ecx+402174 004012C6 jmp 00401333 // Torna all'inizio della procedura 004012C8 push 00000019 004012CA push 004021A3 004012CF push dword ptr [004020DB]

Questa è la routine di lettura della pass. che viene salvata in 4021A3

004012DA xor ecx, ecx 004012DC mov eax, dword ptr [ecx+004021A3] // Porta la pass. in EAX 004012E2 mov ebx, dword ptr [ecx+004021A8] // Porta il nick. in EBX 004012E8 inc ecx 004012E9 cmp eax, ebx // Controlla se il nick e la pass. sono uguali 004012EB jne 004012A2 Salta se i valori sono diversi (La pass. è sbagliata) 004012ED mov al, byte ptr [ecx+004021A3] 004012F3 mov bl, byte ptr [ecx+004021A8] 004012F9 test al, al 004012FB je 00401303 Se il campo è vuoto salta al nag di registrazione avvenuta 004012FD cmp al, bl 004012FF jne 004012A2 Ulteriore controllo della pass.(salta se è sbagliata) 00401301 jmp 00401303 // Salta al nag di registrazione avvenuta

Fatto!!! adesso che abbiamo capito come viene modificato il codice ed appurato che sulla pass. non viene effettuata alcuna crittazione siamo in grado di creare un Keymaker in grado di fornirci una pass. valida per qualsiasi nick inserito.

Io ho utilizzato lo stesso programma di Quequero perché non sono ancora in grado di scriverne uno da solo, ma di sicuro con i suoi corsi in breve ci riusciremo tutti.

Ho modificato il prog. in modo da far visualizzare la scritta Keygenerator - - - By Steda.

Se il nick non viene immesso il message box visualizzerà la scritta: "Dammi il nick! inseriscilo nel 1° campo"

Inserendo un nick e premendo il tasto "Keymaker" verrà visualizzata una message box intitolata "La tua Key!!Byez by Steda!!!" e contenente la pass. giusta per quel nick.

Anche all'interno del Keygenerator si può controllare la validità della pass.; infatti per creare il Keymaker ho modificato solo in jmp condizionale che portava alla visualizzazione della message box di errore, rimanendo invariata quella di complimenti per aver indovinato la pass.

Passiamo ora dalla teoria alla pratica:

Vi serve solo un editor esadecimale per poter modificare il programma (dopo averlo copiato in un altro file, naturalmente per non perdere la copia originale).

Aprire il file e cercare le stringhe da cambiare: io le ho praticamente modificate tutte tranne quella di complimenti per aver indovinato la pass.

ATTENZIONE!!!: MODIFICATE SOLO LE SCRITTE, ALTRIMENTI IL PROGRAMMA NON FUNZIONERA'.

Per quanto riguarda la message box con la pass. giusta ho modificato il push che prima mandava il messaggio di errore con la locazione di memoria in cui è stato salvato il nostro nick, poco prima di procedere alla verifica con la pass. da noi immessa.

In pratica per creare il nostro Keymaker non serve altro che modificare il push in 4012A9 in modo che ci visualizzi la parte di memoria in cui c'è il nostro codice modificato: 4021A8

004012A2 push 00000010 004012A4 push 004020DF 004012A9 push 004020C3 004012AE push 00000000

Questa è la routine che ci dovrebbe far visualizzare il messaggio di errore; opportunamente modificata sarà molto utile ai nostri loschi scopi. HeHeHeHe

ATTENTISSIMI adesso perché dobbiamo modificare il vecchio opcode con il nuovo:

push: 68 004020C3 : C3204000 004021A8 : A8214000

La vecchia istruzione è 68c3204000, la nuova è 68a8214000

Fate la ricerca della vecchia stringa con l'editor esadecimale oppure annotatevi l'Offset dell'istruzione e modificate solo quello che vi ho detto altrimenti va tutto a puttane.


Note Finali

Credo che tutti abbiate capito, in fondo ho cercato di spiegare nel migliore dei modi il lavoro che ho effettuato sul programma. Un saluto a tutti i partecipanti di questo corso ed in particolare a Quequero che ci sta dando la possibilità di imparare tutto ciò. Saluti anche a Giò... come chi è??? l'iguana di Quequero, che ne dici può andare??? Ma è una lei :))) NdQueByez a tutti.

P.S. Le frasi riportate in testa al tutorial sono prese da Buongiorno!20 secondi di buonumore quotidiano via e-mail http://www.buongiorno.it


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.