Rebelx crackme 1 Reversing (.NET)

Data

by "Misanthropic"

 

16/01/2005

UIC's Home Page

Published by Quequero

+ me la -, + vengo...

Che bello vedere un po' di doc sul reversing del .NET bravo Misa.

...x non venir +, non me la - +, o x lo - me la - di - (Pierino)

....

Home page (se presente): http://korn88.altervista.org/
E-mail: [email protected]
Misanthropic, su #crack-it@AzzurraNET

....

Difficoltà

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

 

Introduzione

In questo tutorial vi mostrerò come crackare in modo semplice e veloce una applicazione scritta per il framework .NET. Analizzeremo un crackme scritto da un tizio di crackmes.de.

Tools usati

Reflector
Visual Studio .NET (opzionale...)

URL o FTP del programma

http://www.crackmes.de/users/jules/crackmes/rebelx_crackme_one (hai bisogno del framework .net installato)

Essay

Prima di tutto apriamo Rebelx crackme 1.exe, noteremo subito una editbox e un pulsante.
Inseriamo un serial a caso [es: 666111666 (que ti rubo il dummy serial...l'ho sempre usato :P)] e clickiamo ok; una MessageBox apparirà e ci dirà "Incorrect Serial". bene.
Ora apriamo Rebelx crackme 1.exe con Reflector, spulciamo l'albero degli assembly cercando Rebelx crackme 1, Rebelx crackme 1.exe, WindowsApplication3, Form.
Adesso vedremo la struttura della classe Form; doppio-clickiamo nella sub Button1_Click(Object, EventArgs): Void e reflector disassemblerà la funzione.
La funzione Button1_Click apparirà così:

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    Me.nofx = ((Convert.ToInt32(DateTime.Now.Day.ToString) * Convert.ToInt32(DateTime.Now.Month.ToString)) * Convert.ToInt32(DateTime.Now.Year.ToString))
    Me.misfit = StringType.FromInteger(((Strings.Len(Convert.ToString(WindowsIdentity.GetCurrent.Name)) * Me.indk) * Me.nofx))
    Me.dk = CType(Math.Round(CType(((DoubleType.FromString(Me.misfit) * Me.nofx) * DoubleType.FromString(Me.misfit)),Double)),Integer)
    Me.af = CType(Math.Round(CType((((DoubleType.FromString(Me.misfit) * DoubleType.FromString(Me.misfit)) * Me.nofx) * 4),Double)),Integer)
    Me.misfit = Conversion.Hex(((((DoubleType.FromString(Me.misfit) * DoubleType.FromString(Me.misfit)) * DoubleType.FromString(Me.misfit)) * Me.nofx) - Me.nofx))
    Me.dk = CType(Math.Round(CType((DoubleType.FromString(Conversion.Oct((Me.dk * Me.dk))) * (Me.dk * 5)),Double)),Integer)
    Me.vandals = (Convert.ToString(Me.misfit) & Convert.ToString(Me.dk) & Convert.ToString(Me.af))
    Me.snfu = (Convert.ToString(Me.af) & Convert.ToString(Me.dk) & Convert.ToString(Me.misfit))
    If (StringType.StrCmp(Me.serialbox.Text, Me.vandals, False) = 0) Then
        Interaction.MsgBox("Serial is correct! Checking Keyfile", 0, Nothing)
        If File.Exists("rbx.crckme.txt") Then
            Dim reader1 As New StreamReader("rbx.crckme.txt")
            Me.pennywise = Convert.ToString(reader1.ReadToEnd)
            If (StringType.StrCmp(Me.pennywise, Me.snfu, False) = 0) Then
                Interaction.MsgBox("Keyfile is correct! [email protected] :)", 0, Nothing)
            Else
                Interaction.MsgBox("Keyfile is incorrect", 0, Nothing)
                reader1.Close
            End If
        Else
            Interaction.MsgBox("Keyfile not found", 0, Nothing)
        End If
    Else
        Interaction.MsgBox("Incorrect Serial", 0, Nothing)
    End If
End Sub
 
Bene, come possiamo vedere il crackme fa alcune operazioni sul giorno corrente, mese e anno, altre operazioni con l'username di windows e molte altre con le variabili interne.
Il branch logico che controlla se il seriale inserito è quello valido è questo:
 
If (StringType.StrCmp(Me.serialbox.Text, Me.vandals, False) = 0) Then
...
 
Molto bene, dopo aver calcolato il serial lo mette in vandals.
Il check del keyfile è il seguente:
 
Me.pennywise = Convert.ToString(reader1.ReadToEnd)
If (StringType.StrCmp(Me.pennywise, Me.snfu, False) = 0) Then
...
 
Assegna a pennywise l'intero contenuto del keyfile e dopo lo compara con una variabile interna chiamata snfu. Così il contenuto del keyfile è dentro snfu.
 
Se vogliamo trovare un seriale valido e un numero valido per il keyfile dobbiamo far questo:

    Me.nofx = ((Convert.ToInt32(DateTime.Now.Day.ToString) * Convert.ToInt32(DateTime.Now.Month.ToString)) * Convert.ToInt32(DateTime.Now.Year.ToString))
    Me.misfit = StringType.FromInteger(((Strings.Len(Convert.ToString(WindowsIdentity.GetCurrent.Name)) * Me.indk) * Me.nofx))
    Me.dk = CType(Math.Round(CType(((DoubleType.FromString(Me.misfit) * Me.nofx) * DoubleType.FromString(Me.misfit)),Double)),Integer)
    Me.af = CType(Math.Round(CType((((DoubleType.FromString(Me.misfit) * DoubleType.FromString(Me.misfit)) * Me.nofx) * 4),Double)),Integer)
    Me.misfit = Conversion.Hex(((((DoubleType.FromString(Me.misfit) * DoubleType.FromString(Me.misfit)) * DoubleType.FromString(Me.misfit)) * Me.nofx) - Me.nofx))
    Me.dk = CType(Math.Round(CType((DoubleType.FromString(Conversion.Oct((Me.dk * Me.dk))) * (Me.dk * 5)),Double)),Integer)
    Me.vandals = (Convert.ToString(Me.misfit) & Convert.ToString(Me.dk) & Convert.ToString(Me.af))
    Me.snfu = (Convert.ToString(Me.af) & Convert.ToString(Me.dk) & Convert.ToString(Me.misfit))
E scrivere il risultato finale di vandals nell'editbox del crackme, creare un keyfile chiamato rbx.crckme.txt (nella stessa directory del crackme) e metterci dentro il contenuto di snfu.
Il keygen è semplice da codare :) vi rimando all'allegato per il codice sorgente scritto in VB.NET.
                                                                                                                 Misanthropic

Note finali

Ringrazio Jules per aver scritto questo simpatico crackme, la comunità di crackmes.de per fornirmi sempre bei crackmes ;p
Ringrazio poi i pochi che hanno scritto tutorial per il reversing di applicazioni .NET.
Inoltre saluto pnluck (che amicone :), Ntoskrnl (secondo dio in terra... dopo xoanon ovviamente), Quequero (che mi pubblica il tutorial ;p), Evilcry (sento la sua mancanza...), LonelyWolf (vtuèyptrb bobr, ti aspettiamo :) e tutti quelli che conosco e che ho omesso... per questioni di spazio :P

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 che ogni sviluppatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili.

Reversiamo al solo scopo informativo e per migliorare la nostra conoscenza del linguaggio Assembly. 

Arrestatemi perché ho reversato un crackme.