Seite 1 von 2 12 Letzte
  1. #1

    Registriert seit
    06.11.2011
    Beiträge
    418
    Thanked 686 Times in 246 Posts

    Standard [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Reverse Engineering
    Teil II - Cracking (.NET)
    Teil I


    Im zweiten Teil meiner Tutorialreihe über Reverse Engineering beschäftigen wir uns erstmals mit Cracking. Dazu habe ich zwei relativ simple, nicht virtualisierte oder obfuskierte (zu Deobfuskation kommen wir aber auch noch) Crackmes vorbereitet. Wir werden uns diese erstmal zusammen anschauen, zum Üben werde ich euch später dann noch weitere zur Verfügung stellen.


    .NET Reflector installieren und konfigurieren

    Zuerst solltet ihr Visual C# 2010 Express (wird in diesem Teil noch nicht benötigt, höchstwahrscheinlich aber schon im nächsten) und Redgate .NET Reflector installieren, die Download-Links findet ihr im ersten Teil. Im Archiv von .NET Reflector sind auch ein Keygen und eine Anleitung zum Aktivieren enthalten, entweder aktiviert ihr es wie dort beschrieben oder ihr kauft euch eine Lizenz. Sofern ihr zukünftig nicht mit diesem Programm arbeiten wollt, sondern lieber ein anderes bevorzugt oder euch gar nicht auf's Cracken von .NET-Anwendungen spezialisieren wollt, reicht es wenn ihr es als Testversion nutzt (sind glaube ich 14 Tage, möglicherweise schließen wir das Thema .NET bis dahin auch schon komplett ab). Dann braucht ihr auch noch das Add-In Reflexil (kommt beim zweiten Crackme zum Einsatz), den Download-Link findet ihr ebenfalls im ersten Teil. Um das Add-In zu laden geht ihr in .NET Reflector auf Tools -> Add-Ins... und fügt dann Reflexil.Reflector.dll hinzu.


    Crackme #1

    Download: Zippyshare.com - Crackme1.exe

    Beim unserem ersten Crackme geht es darum das Passwort herauszufinden. Wie schon im ersten Teil erwähnt haben wir zwei Möglichkeiten, wir können versuchen es zu erraten oder wir dekompilieren das Programm und schauen dann was wir hier an Möglichkeiten haben. Da wir keinerlei Hinweise haben probieren wir gar nicht erst es zu erraten, also schauen wir uns mal an wie das Crackme in .NET Reflector aussieht (File -> Open Assembly...).

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    An dieser Stelle würde ich euch empfehlen erst einmal ein wenig rumzuspielen (möglichst ohne etwas zu verstellen) bevor ihr weiter lest, ich persönlich halte nämlich sehr viel von Learning by Doing.

    Crackmes bestehen meist, sowie auch dieses, nur aus ein oder zwei Klassen. Von daher sind sie recht überschaulich und wer jetzt schon ewtas rumgespielt hat der kennt auch schon das Passwort. Aber wir wollen hier ja was lernen, deshalb stellen wir uns einfach mal vor, dass das Programm aus 100 Klassen besteht. Wie finden wir jetzt die Klasse, in der sich das Passwort befindet? Wir haben zwei Möglichkeiten, erste wäre zum Einstiegspunkt zu gehen und sich von dort aus durch den Quelltext zu arbeiten, die andere Möglichkeit (gerade dann nützlich wenn das Programm tatsächlich so viele Klassen aufweist) ist den Quelltext nach uns bekannten Hinweisen zu durchsuchen. Ich würde vorschlagen, dass wir bei diesem Crackme erst einmal ersteres versuchen, beim nächsten wenden wir dann die andere Methode an. Dazu klicken wir mit der rechten Maustaste auf unser geladenes Assembly und wählen Go To Entry Point.

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    Jetzt müsstet ihr in der Methode Main() der Klasse Program gelandet sein.

    Code:
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    Den Code sollte jeder einigermaßen verstehen, habe ja im letzten Teil schon gesagt gehabt, dass grundlegende C#-Kentnisse erforderlich sind. Ihr könnt oben auch die Sprache ändern, es wird unter anderem auch Visual Basic unterstützt, da kann ich euch bei Fragen aber nicht weiterhelfen.
    Was sofort auffällt ist new Form1(), hier wird ein neues Form1-Objekt erstellt. Wenn wir im Editor auf Form1 klicken landen wir im Konstruktor der Klasse, wo wir das Passwort schon sehen können. Leider ist das nicht immer so einfach, beispielsweise dann wenn die Variablen nicht password heißt, das Passwort nicht im Konstruktor zugewiesen wird, es verschlüsselt ist oder wenn das gar nicht die Klasse ist, die wir suchen. Um das Ganze noch etwas zu vertiefen schauen wir uns die Klasse mal etwas genauer an, obwohl wir das Passwort jetzt schon kennen. Um den Quelltext der ganzen Klasse anzuzeigen, klicken wir links im Assembly Browser (nenn ich jetzt mal so) auf Form1.

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    Wir sehen jetzt alle Datenfelder (auch globale Variablen genannt) und Methoden der Klasse, aber keine zugewiesenen Werte oder Rümpfe. Um auch diese anzuzeigen, klicken wir im Editor auf Expand Methods. Das Ganze ist jetzt recht überschaulich und die Methode, die wir suchen. sticht sofort ins Auge. Hier wird überprüft, ob der Wert der Eigenschaft Text unserer TextBox mit dem Wert des Datenfeldes password übereinstimmt und der Wert sollte euch spätestens jetzt bekannt sein, steht ziemlich Weit oben im Quelltext.


    Crackme #2

    Download: Zippyshare.com - Crackme2.exe

    Beim zweiten Crackme gehen wir etwas anders vor, dieses mal öffnen wir es in .NET Reflector und suchen im Quellcode nach Hinweise. Dazu klicken wir in der Menüleiste auf die Lupe bzw. drücken auf unserer Tastatur die Taste F3. (Bitte sicherstellen, dass im Assembly Browser auch Crackme2 ausgewählt ist, dieses Assembly wollen wir schließlich auch durchsuchen). Jetzt müssen wir nur noch wissen wonach wir eigentlich suchen, dazu überlegen wir was wir eigentlich über das Crackme wissen. Wir wissen, dass eine Nachricht ("Falsch") ausgegeben wird wenn wir ein falsches Passwort eingeben. Nach dieser Nachricht suchen wir, also geben wir im Suchfeld Falsch ein und da es sich um ein String handelt müssen wir auch nach einem String suchen (dazu rechts vom Suchfeld das vorletzte Symbol auswählen bzw. STRG + S drücken). Die Suche kann bei größeren Assemblies etwas Zeit in Anspruch nehmen, bei unserem Crackme geht das aber relativ schnell.

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    Voila! Wir sind fündig geworden. Wenn wir jetzt doppelt auf das Suchergebnis klicken landen wir in der gesuchten Methode. (Das Suchfenster könnt ihr jetzt wieder schließen, brauchen wir nicht mehr).

    Code:
    private void button1_Click(object sender, EventArgs e)
    {
        MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
        byte[] bytes = Encoding.Default.GetBytes(this.textBox1.Text);
        if (BitConverter.ToString(provider.ComputeHash(bytes)).Replace("-", string.Empty).ToLower().Equals(this.password.ToLower()))
        {
            MessageBox.Show("Richtig");
        }
        else
        {
            MessageBox.Show("Falsch");
        }
    }
    Wir sehen, dass das Passwort wieder im Datenfeld password gespeichert ist. Wir sehen aber auch, dass es ein MD5-Hash ist. Ein Hash lässt sich anders als eine Verschlüsselung nicht entschlüsseln, stattdessen können wir das Passwort aber ändern und hier kommt das Add-In Reflexil im Spiel. Um das Passwort zu ändern müssen wir den Konstruktor manipulieren, denn hier wird dem Datenfeld password ein Wert zugewiesen. Wir klicken im Assembly Browser auf Form1 und dann im Editor unter Methoden auf Form1() (im Assembly Browser heißt der Konstruktor sonst auch .ctor()). Dann rufen wir Reflexil hervor indem wir in der Menüleiste Tools -> Reflexil v1.5 auswählen.

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    Wir sehen sogenannte Instruktionen, um ein Programm zu manipulieren müssen wir solche hinzufügen, löschen, austauschen, verschieben oder verändern. Dabei ist es gar nicht so wichtig, dass wir die Bedeutungen aller Instruktionen kennen, dafür zeige ich euch später noch Trick 93. Für uns ist gerade nur die zweite Instruktion interessant, deren Operand mit dem Wert übereinstimmt, den wir manipulieren wollen. Relativ einleuchtend, dass es sich hier um die Zuweisung des Werts innerhalb des Konstruktors handelt. Wir klicken mit der rechten Maustaste auf die Instruktion -> Edit und es öffnet sich ein Fenster, in welches wir einen neuen Wert festlegen können. Ich ändere das Passwort zu Flav-ist-geil, der MD5-Hash lautet demnach d207abfb46670eb135e0c314f7c56dce. Nachdem wir den Wert geändert haben klicken wir im Assembly Browser mit der rechten Maustaste auf unser Assembly und wählen Reflexil v1.5 -> Save As... und speichern es.

    BILD ANZEIGEN [Warum wird das Bild nicht angezeigt?]

    Wer will kann auch noch versuchen den Fenstertitel zu bearbeiten (Klasse: Form1, Methode: InitializeComponents(), Instruction: [#: 129, Offset: 450]).

    Statt das Passwort zu ändern hätten wir den Check auch komplett entfernen können, dazu müssen wir uns im nächsten Teil aber erst noch etwas näher mit Instruktionen auseinandersetzen (Trick 93 klärt). Thema des nächsten Teils wird wahrscheinlich auch Deobfuskation.
    Geändert von Flav (05.10.2012 um 01:46 Uhr)

  2. The Following 17 Users Say Thank You to Flav For This Useful Post:

    AFU (11.11.2012), AmJano (13.10.2012), Dbzfreak1337 (13.10.2012), Devon (04.10.2012), dynxX (04.10.2012), Gangstersheep (04.10.2012), HandZup (04.10.2012), Individuum (04.10.2012), iToxic (04.10.2012), Mentos (04.10.2012), moan (23.03.2013), Roxithro (04.10.2012), rVs14 (07.10.2012), Saad (04.10.2012), Snees (04.10.2012), Sploxfreak (06.12.2012), uncopyable (04.10.2012)

  3. #2
    Avatar von iToxic
    Registriert seit
    18.11.2011
    Beiträge
    918
    Thanked 1.773 Times in 913 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Zitat Zitat von Flav Beitrag anzeigen
    Thema des nächsten Teils wird wahrscheinlich auch Deobfuskation.
    Wird dies auf irgendwelchen Tools basieren oder doch alles manuell per Hand gemacht?


  4. The Following User Says Thank You to iToxic For This Useful Post:

    Gangstersheep (04.10.2012)

  5. #3

    Registriert seit
    06.11.2011
    Beiträge
    418
    Thanked 686 Times in 246 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Macht nicht viel Sinn selbst zu deobfuskieren, dazu muss man sich viel mehr mit Instruktionen beschäftigen und wenn man das so gut drauf hat muss man den Quelltext erst gar nicht in C# dekompilieren. Ich möchte viel mehr darauf eingehen was Obfuskation ist und ein Tool vorstellen, dass bei mir bisher immer geklappt hat und auch noch geupdated wird.

  6. The Following 2 Users Say Thank You to Flav For This Useful Post:

    Gangstersheep (04.10.2012), iToxic (04.10.2012)

  7. #4
    Avatar von Snees
    Registriert seit
    18.11.2011
    Beiträge
    1.001
    Thanked 591 Times in 319 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Name:  Unbenannt.PNG
Hits: 1255
Größe:  17,2 KB

    Richtig geil Hätte niemals gedacht, dass es sooo einfach ist #

    /e: Name:  Unbenannt.PNG
Hits: 1221
Größe:  33,5 KB
    Bitte nicht ernst nehmen
    Geändert von Snees (04.10.2012 um 16:53 Uhr)

  8. The Following User Says Thank You to Snees For This Useful Post:

    Gangstersheep (04.10.2012)

  9. #5
    Avatar von Saad
    Registriert seit
    18.11.2011
    Beiträge
    786
    Thanked 621 Times in 219 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Dabei ist es gar nicht so wichtig, dass wir die Bedeutungen aller Instruktionen kennen, dafür zeige ich euch später noch Trick 93. Für uns ist gerade nur die zweite Instruktion interessant, deren Operand mit dem Wert übereinstimmt, den wir manipulieren wollen. Relativ einleuchtend, dass es sich hier um die Zuweisung des Werts innerhalb des Konstruktors handelt. Wir klicken mit der rechten Maustaste auf die Instruktion und es öffnet sich ein Fenster, in welches wir einen neuen Wert festlegen können.
    Meinst du mit der zweiten Insturktion die Zeile mit "bbd17dd0b7d3702224f2df687e2647d6" oder die Zeile darunter?
    Weiters wenn ich dann mit der rechten Maustaste draufklicke, öffnet sich bei mir kein Fenster, wo ich einen neuen Wert festlegen kann..Da kommt nur so ein Fenster wo steht:
    Create new, Edit, Replace all with code.. und so weiter
    Bis auf Sonderschüler kannst du alle Leute fragen - Saad ist PERFEKT wie 'ne Zeitform der deutschen Sprache.

  10. #6
    Avatar von Snees
    Registriert seit
    18.11.2011
    Beiträge
    1.001
    Thanked 591 Times in 319 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Name:  23nezx4.jpg
Hits: 1232
Größe:  44,6 KB
    Name:  24.jpg
Hits: 1235
Größe:  60,8 KB
    Name:  25.PNG
Hits: 1235
Größe:  49,5 KB

    Siehe Screenshot 2: Rechtsklick -> Edit -> Neuen MD5-hash eintragen -> Update

    LG

  11. The Following User Says Thank You to Snees For This Useful Post:

    Saad (04.10.2012)

  12. #7

    Registriert seit
    06.11.2011
    Beiträge
    418
    Thanked 686 Times in 246 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Da hab ich wohl was vergessen, um die Instruktion zu bearbeiten muss man natürlich noch Edit auswählen. Ich finde leider nur nachts Zeit an den Tutorials zu arbeiten wenn ich mal nicht schlafen kann und sitze dann oft bis zu drei Stunden daran, da kann das mal passieren. Deshalb ist es wichtig, dass ihr mich dann korrigiert oder nachfragt wenn ihr nicht weiterkommt. Werde das nachtragen wenn ich zuhause bin.

    Edit: Hab's hinzugefügt.
    Geändert von Flav (05.10.2012 um 01:46 Uhr)

  13. The Following 2 Users Say Thank You to Flav For This Useful Post:

    Gangstersheep (05.10.2012), Saad (05.10.2012)

  14. #8

    Registriert seit
    06.11.2011
    Beiträge
    418
    Thanked 686 Times in 246 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    Wollte eigentlich spätestens heute den dritten Teil meiner Tutorialreihe fertigstellen, wie es aussieht schaffe ich das aber nicht mehr, habe heute noch einige Sachen abzuarbeiten. Die kommende Woche wird nochmal richtig stressig für mich, da werde ich wohl auch nicht dazu kommen. Und die Woche darauf bin ich in Alanya, ich flieg am 23. hin und am 31. zurück. Ich werde versuchen den dritten Teil noch vor meinem Urlaub zu schreiben. Nach meinem Urlaub, wenn ich mal richtig abschalten konnte und alles was mein Kopf gerade fickt hinter mir gelassen habe, nehm ich mir auch wieder mehr Zeit für UH und werde die Teile in regelmäßigeren Abständen schreiben.

  15. The Following 6 Users Say Thank You to Flav For This Useful Post:

    AmJano (13.10.2012), Devon (13.10.2012), Gangstersheep (13.10.2012), Individuum (13.10.2012), Snees (13.10.2012), uncopyable (13.10.2012)

  16. #9
    Avatar von Saad
    Registriert seit
    18.11.2011
    Beiträge
    786
    Thanked 621 Times in 219 Posts

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    höhö

    Spoiler:
    Name:  1443rk.jpg
Hits: 1160
Größe:  46,5 KB
    Bis auf Sonderschüler kannst du alle Leute fragen - Saad ist PERFEKT wie 'ne Zeitform der deutschen Sprache.

  17. The Following 2 Users Say Thank You to Saad For This Useful Post:

    AmJano (26.10.2012), dynxX (26.10.2012)

  18. #10

    Registriert seit
    26.10.2012
    Beiträge
    7
    Thanked 1 Time in 1 Post

    Standard AW: [Tutorial] Reverse Engineering - Teil II - Cracking (.NET)

    gutes anfänger tutorial. empfehle aber sae weil reflector viel zu einfach und schnell crashed
    freue mich auf dein deob tutorial solange du nicht nur de4dot erwähnst

Seite 1 von 2 12 Letzte

Ähnliche Themen

  1. Reverse Engineering - Crackme v5
    Von Snees im Forum Aufgaben
    Antworten: 6
    Letzter Beitrag: 19.07.2013, 15:34
  2. Reverse Engineering - Crackm3
    Von Snees im Forum Aufgaben
    Antworten: 9
    Letzter Beitrag: 06.05.2013, 18:49
  3. Antworten: 11
    Letzter Beitrag: 11.11.2012, 20:14
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.