Reversing della lezione II


9/9/99

by "Steda"

 
 

UIC's Home Page

Published by Quequero

Siete un pubblico stupendo, veramente.
Anzi, ditemi dove siete domani sera che vi vengo a vedere

Tutorial piuttosto sintetico ma comunque impeccabile e chiaro (un momento di pigrizia steda?)

 Se aiuti qualcuno che è nei guai, stai certo che se ne ricorderà.
La prossima volta che è nei guai!
UIC's form
E-mail: La mail della Tin non la metto, potresti passare dei guai, scusami per la censura NdQue
Steda
UIC's form

Difficoltà

(X)NewBies ( )Intermedio ( )Avanzato ( )Master

 

 

Scaricate que l'allegato

Con questo tutorial cercherò di far capire come ho modificato il prog. di Quequero per ricavarne un Keygenerator.


Tutorial lezione II
Written by Steda

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.
 
Tools usati
 
SoftIce per il reversing
Hex Workshop per modificare il programma e creare il Keygenerator
WDasm per riportare il codice del prog. in questo tutorial

URL o FTP del programma

http://quequero.members.easyspace.com/prj/corsosecondo.html

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

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.
Capitoooooooo????? Bhè credo di si ;)))) 

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    ContactMe  CrackMe   Links   
NewBies   News   Forum   Lezioni  
Tools   Tutorial 

UIC