premetto dicendo che potreste non vedere le immagini che ho inserito, in questo caso ho inserito sotto il link in modo da poterle vedere ugualmente
Prima di cominciare con il reverse vero e proprio volevo solo fare una piccola introduzione per i salti:
i salti, in assembly possono essere di due tipi:
-incondizionato (jmp) ovvero jump = salto in inglese
-condizionato (je, jne, jz, jnz, ecc.) questo tipo di salti agiscono a seconda che una condizione avviene o non avviene.
Per uqesto reverse ci interesseremo ai salti condizionati je e jne:
-je (jump if equal = salta se è uguale) salta se si è verificata una condizione di eguaglianza in un confronto.
-jne (jump if not equal = salta se non è uguale) salta se non si è verificata una condizione di ugualglianza in un confronto.
Bene, dopo questa piccola introduzione ai salti direi che possiamo cominciare con il reversing vero e proprio:
cominciamo ad aprire il crackme: vedremo una finestra che chiede di inserire un codice, se ne inseriamo uno a caso, per esempio 1234 una messagebox ci dirà che il codice inserito è errato.
Ora apriamo il crackme con W32Dasm e clicchiamo sul tasto 2 (in questa immagine ho solo elencato due tasti visto che sono gli unici due che useremo in questo reverse)
http://www.rk0x14578.altervista.org/tasti.GIFe poi selezioniamo dalla finestra che ci appare la scritta "Wrong Serial" (che è il testo della messagebox di quando sbagliamo codice).
Arriveremo ora a una schermata simile a questa:
http://www.rk0x14578.altervista.org/Immagine01.GIFil cerchio blu indica le informazioni (titolo e testo) della messagebox che dobbiamo ottenere.
vedete circondato in rosso il testo wrong serial e una frecia lo collega a questa scritta:
* Referenced by a (U)nconditional or (C)onditional jump at Address:
|:004011B6(C)
Cosa sarà mai?
Semplicemente spiega che quella sarà la destinazione di un salto condizionato (si capicsce dalla (C) affianco al numero (una specie di indirizzo)), ma da dove proviene il salto?
E'presto detto: clicchiamo sul tasto 1 e inseriamo nella finestra che compare il codice che troviamo (004011B6)
Il programma cercherà la provenienza di questo indirizzo, e ci porterà molto lontano...
http://www.rk0x14578.altervista.org/Immage02.GIFLa freccia rossa indica la provenienza dell'indirizzo, e vediamo un jne (jump if not equal, ricordate?).
Possiamo vedere che salta se non è uguale e quindi se non è uguale si effettuerà il percorso indicato dalla linea blu altrimenti (se è uguale) seguirà la linea viola.
Una domanda vi sarà sorta, ma uguale a cosa?
beh, allora, analizziamo il punto 1:
viene richiamata una funzione API di windows, ovvero GetWindowTwxtLengthA. ovvero una routine che restituisce la lunghezza della stringa di una casella di testo.
il template della funzione è il seguente:
int GetWindowsTextLength(
HWND hWnd //handle of the window or control with text
);
la funzione chiede coma parametro un handle (numero univoco che referenzia ogni processo, finestra, pulsante, ecc di windows) E restituisce un numero di tipo intero, che in poche parole ci dice quanto è lunga la stringa.
questo valore viene messo nel registro eax, e poi viene spostato nel registro esi con l'istruzione mov (figura 2).
il testo inserito viene poi confrontato con l'handle, ovvero 0000000C (sempre figura 2), naturalmente 0C è un numero esadecimale, che trasformato in decimale con la calcolatrice di windows diventa 12.
quindi il flusso del programma è questo:
si prende la lunghezza del testo inserito,
confronto con 12
è uguale?
si
finestra congratulazioni
no
finestra di errore
il nostro scopo è quello di fare in modo che ogni valore inserito sia quello giusto per la finestra di congratulazioni quindi dovremo modificare quel jne, che regola tutto.
chiudiamo W32Dasm e apriamo il crackme con HIEW. Prima però prendiamo nota i quel 751E che troviamo affianco al jne.
ora, con HIEW, premiamo due volte invio da quando abbiamo aperto il crackme, e comparirà qualcosa tipo:
http://www.rk0x14578.altervista.org/Immagine03.GIFora premiamo F7 e inseriamo il codice 751E senza spazi e premiamo invio
arriveremo a un punto cosi
.oo4o11B6: 751E jne .004011D6 -------- (3)
ora premiamo F3 e potrmo modificare quel 751E, inseriamo al suo posto 9090 (ovvero nop nop, con il codice 90 non verrà eseguita nessuna operazione)(ah, il 'codice', come l'ho definito io si chiama opcode, l'opcode di je è 74, quello di jne è 75, infatti basta guardare la prima parte del codice 751E per vedere l'opcode di jne
anche se i due 90 saranno su due linee differenti non importa, premiamo F9 per salvare e poi ESC per uscire.
In questo modo, mettendo 9090 non ci sarà più nessun salto, quindi troveremo in ogni caso la routine di congratulazioni.
semplice, vero?
ciao ciao