Zoom Icon

Dot Net Framework Reversing(parte 1)

From UIC

.Net Framework Reversing

Contents


Infos
Author: Pbdz
Email: pbdz@libero.it
Website: http://pbdz.cjb.net
Date: 14/04/2004 (dd/mm/yyyy)
Level: Luck and skills are required
Language: Italian Image:Flag_Italian.gif
Comments: Grandissimo Pbdz, finalmente qualcuno che reversa un prog scritto in .net, complimenti, speriamo che questo serva da input per tutti gli altri :)



Introduction

Salve a tutti! È parecchio che non mi faccio vivo da queste parti! Ho scritto questa specie di tutorial perchè finora non ho trovato niente su internet riguardo questo argomento. Siccome programmo da quasi un anno col C# volevo vedere com'era "dall'altra parte"! :-)


Tools

Per disassemblare consiglierei IDA, altrimenti basta scrivere sulla nel prompt dei comandi: ildasm.
Per modificare il file basta un qualsiasi Hex Editor.


Link e Riferimenti

Ecco il link al mio programma. Per scaricare il framework andate sul sito di zio Bill! ;-)


Notizie sul Programma

Cos'è il Framework.NET?
Questo oscuro oggetto (di casa microsoft) non è altro che una piattaforma su cui possono girare determinati programmi, piattaforma anche chiamata CLR (Common Language Runtime).
Per farvi un esempio basta pensare alle varie dll che servono per far girare un programma in VB.
Il concetto è lo stesso, se fate un programma in C# VB.Net ecc...e non avete il framework installato, il programma non vi funzionerà mai. Il programma non funzionerà perchè conterrà istruzioni differenti dalle solite... Supponiamo che faccia un programma in c#, compilando il codice sorgente ottengo un tipo di file chiamato Assembly, ha l'estensione .exe, ma non contiene al suo interno del codice macchina, bensì I.L. (intermediate language). Questo I.L. sarà tradotto dal CLR in linguaggio macchina vero e proprio, e quindi sarà adatto per l'esecuzione. Il vantaggio di questo meccanismo sta nel fatto che il CLR compila solo il codice che serve, perciò si risparmia tempo, in più una volta che ha compilato il codice questo viene salvato e non sarà più necessario ricompilarlo al momento di una futura esecuzione.
Inutile dire che il framework lo trovate sul sito di ZiA Bill! :-) Potete scaricare quello "normale" che pesa una 20ina di Mb o, se volete divertirvi potete scaricare l'SDK, ma pesa molto di più! (sconsigliato se avete ancora un 56K come me! Consigliato se avete un amico con l'adsl! ;-))
Spero di essere stato abbastanza esaustivo!


Essay

Per analizzare un file assembly io consiglierei IDA, ho la versione 4.3 e mi riconosce il framework.
Per modificare il file ci serviremo di un classico editor esadecimale, va bene qualunque marca!
Iniziamo!
Siccome per parecchi di voi è la prima volta che avete a che fare con questo I.L. vi posto prima il codice sorgente in modo da raffrontare le varie istruzioni!

/*Programma di esempio*/
using System;
using System.Windows.Forms;

class crackme
{
public static void Main()
{
int num;
num = 13;
if(num == 23)
{
MessageBox.Show("Registrato!","Crackme");
}
else
{
MessageBox.Show("Devi registrarmi! :-(","Crackme");
}
}
}
/*Programma di esempio*/

Credo che sia chiaro quello che il programma fa! No? Vabè ve lo spiego: Dichiaro una variabile, le assegno il valore 13. La variabile è uguale a 23? Se si mostra la MsgBox "Registrato" altrimenti mostra la MsgBox d'errore! Naturalmente il programma mostrerà sempre il messaggio d'errore a meno che qualche birbantello non lo modifichi a dovere! ;-) Provate ad avviare il programma e vedrete!

Andiamo ora a disassemblare il file con IDA, ecco la parte principale:

.class private auto ansi crackme extends [mscorlib]System.Object
{


.method public static hidebysig void Main()
{
.entrypoint
.locals init (int32 V0)
ldc.i4.s 13
stloc.0
ldloc.0
ldc.i4.s 23

loc_16:
bne.un.s loc_2A
ldstr "Registrato!"
ldstr "Crackme"
call value class [System.Windows.Forms]System.Windows.Forms.DialogResult \
[System.Windows.Forms]System.Windows.Forms.MessageBox::Show(class System.String, \
class System.String)
pop
br.s loc_3A

loc_2A:
ldstr "Devi registrarmi :-("
ldstr "Crackme"
call value class [System.Windows.Forms]System.Windows.Forms.DialogResult \
[System.Windows.Forms]System.Windows.Forms.MessageBox::Show(class System.String, \
class System.String)
pop

loc_3A:
ret
}

Non spaventatevi! La prima volta che ho visto una cosa del genere ho detto "E mo che è sta roba?"
Questo è il famigerato I.L.! :-) È una specie d'assembler, un pò contorta come cosa, ma che ci possiamo fare? Almeno abbiamo qualcosa di nuovo da imparare! :-)

Quello che ci interessa sono le istruzioni presenti in Main():

.locals init (int32 V0) // Dichiaro una variabile di tipo int32 --> int num;
ldc.i4.s 13 // questa funzione è composta da ldc che pusha un valore numerico nello stack,
// i4 significa che il numero è di tipo int32, la s sta per short, serve per immagazzinare
// variabili piccole, per risparmiare memoria in questo vengono usati solo 4 byte,
// senza la s vengono usati 8 byte. In sintesi carichiamo nello stack il numero 13.
stloc.0 // Inserisce il valore contenuto nello stack (13) nella nostra
// variabile...lo zero sta a significare il numero della posizione della nostra
// variabile, se per esempio avevo dichiarato 4 variabili e io dovevo mettere
// il valore 13 nella 3a variabile avrei dovuto scrivere stloc.2
// (funziona come l'indice di un vettore o un array).
ldloc.0 // Carica il valore della nostra variabile nello stack (sintassi analoga a stloc)
ldc.i4.s 23 // Carica il valore 23 nello stack (serve per fare il confronto con 13!)
bne.un.s loc_2A // Questa è la funzione chiave, in pratica possiamo equipararla
// ad un "jne loc_2A". In pratica se i 2 valori pushati nello stack non sono
// uguali, il programma salta alla locazione loc_2A! E guarda caso proprio
// li c'è la nostra MessageBox d'errore!
// Letteralmente significa Branch on equal. Questa istruzione
// non salta, ma si "ramifica" :-)

Come crackare questo programma? Ci sono 2 modi, o cambiamo il secondo valore pushato con 13 in modo da avere 2 valori uguali e quindi non far verificare la condizione di disuguaglianza o cambiare il salto da "jne" a "je" :-) Io opto per la seconda, almeno modifichiamo un pò di codice! :-)
Se dovessimo modificare il codice sorgente dovremmo fare solo questa modifica:
da if(num == 23) a if(num != 23)
L'istruzione che fa tutto al contrario della nostra si chiama "beq.s addr" che significa Branch on equal...il programma salterà solo quando si verificherà una condizione di uguaglianza...quindi..è come se mettessimo un nop! :-)
AGIRE:
Ci siamo! Il momento clou è arrivato...ci appresteremo a modificare il nostro bel eseguibile! (!?!?!?)
Sapete che ogni istruzione ha un Opcode, queste istruzioni hanno opcode differenti da quelli che siamo abituati a vedere di solito!
L'istruzione bne.un.s ha come opcode 33, se non usavamo la s aveva come opcode 40. Per "crackare" il programma dobbiamo inserire il l'opcode 2E che equivale a beq.s e il gioco è fatto!
Apriamo l'hex editor, portiamoci all'offset della nostra istruzione (0000262h), modifichiamo, salviamo e riavviamo...TADAAAAAAAAA!!! Il programma è "Registrato"! :-) Questo è tutto! Byez!


Note Finali

Ringrazio in primis me stesso. Un saluto a tutti gli amici di #asm...anche se faccio il "vegetale"! Un saluto ai Metallica, Megadeth, Ac/Dc, Testament, Pantera...


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.