Serial bypass

Dieses Thema im Forum "Support & Discussion" wurde erstellt von 3HMonkey, 24. September 2017.

  1. 3HMonkey

    3HMonkey Administrator Mitarbeiter Administrator

    Registriert seit:
    28. Juni 2017
    Beiträge:
    50
    Zustimmungen:
    33
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Hallo Leute,

    nun ich möchte mich mal endlich damit beschäftigen etwas über den Tellerrand zu schauen uns mache mich nun über einige Tutorials zum Thema "Reverse Engineering" und "Serial bypassing" her. YouTube ist dabei leider nur bedingt eine Hilfe, kann aber zum Start gut sein. Leider geht es in einer schwierigeren Liga nicht so einfach, weshalb ich mich an euch wenden möchte, da ich denke, dass ihr mir da besser weiterhelfen könnt. Nun aber zu meinen konkreten Fragen. Ich hoffe, dass wir davon alle profitieren können:

    Angenommen ich habe ein Fentser einer CrackME mit einer Registrierung, welche umgangen werden soll:

    upload_2017-9-24_19-12-52.png

    Ich nutze zur Zeit ganz gerne x64dbg oder ollydbg als Debugger, was aber keinen Unterschied macht.

    1. Gibt es eine Art roten Faden, wie ich ab diesem Zeitpunkt vorgehen soll?
    2. Muss man dabei etwas beachten?
    3. Viele Tutorials schreiben oder zeigen in ihren Videos, dass diese nach Texten (ASCII) etc. suchen, welche in den Textboxen usw. stehen. Was wenn man keine Texte findet?
    4. An welcher Stelle sollte man die Calls durchsuchen?
    Ich würde ganz gerne soetwas mal exemplarisch durchspielen. Wahrscheinlich läuft aber alles erstmal auf Frage eins hinaus. Gerne würde ich daraus dann einen Leitfaden erstellen. Zur Zeit bin ich damit nur etwas überfordert, weil jeder etwas anderes dazu sagt und jeder ja der Profi ist :)

    Hoffentlich könnt ihr mir mit eurem Wissen helfen, oder zumindest könnt ihr mir ein Vorgehen nennen.
    Vielen Dank für eure Zeit.
     
    susesKaninchen gefällt das.
  2. susesKaninchen

    susesKaninchen New Member

    Registriert seit:
    3. Juli 2017
    Beiträge:
    21
    Zustimmungen:
    13
    Punkte für Erfolge:
    3
    Ich kann dir leider auch nicxht helfen bin aber auch sehr daran interessiert das auch mal zu lernen und dann wäre alles was hier geantwortet wird sehr hilfreich.
     
    3HMonkey gefällt das.
  3. source++

    source++ New Member

    Registriert seit:
    3. Juli 2017
    Beiträge:
    24
    Zustimmungen:
    22
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Ich kenne es auch nur so das man nach dem Text der Fehlermeldung z.B. "Dieser Key ist ungültig" oder was auch immer ausgegeben wird sucht, hab aber auch nicht viel Erfahrung in dem Bereich sorry.
     
  4. Mastodon

    Mastodon New Member

    Registriert seit:
    1. Juli 2017
    Beiträge:
    14
    Zustimmungen:
    23
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Hi!
    Zuerst solltest du herausfinden in welcher Sprache das Programm geschrieben ist.
    Das geht zum Beispiel mit CFF-Explorer.

    Wenn das Programm zum Beispiel in C#, Delphi oder Visual Basic geschrieben ist, ist es anders als ob es in C oder C++ geschrieben ist.
    So gibt es für Delphi zum Beispiel spezielle Programme, welche es dir noch etwas leichter macht und die normalen Debugger wie OllyDBG oder x64dbg sind dafür alleine ungeeignet.

    Hast du schon den gesamten Adressbereich des Programmes nach den Strings abgesucht?
    In manchen BASIC-Sprachen, konnte ich zum Beispiel keine Strings mittels der standard Suche finden.

    Sonst suche nach allen intermodularen Aufrufen.
    Und zwar geht es um die API-Calls, welche man unter Windows verwenden kann um Inhalte von GUI-Elementen auszulesen und in Strings zu speichern.
    In deinem Fall würde ich GetDlgItemTextA probieren.

    Andere Funktionen wären zum Beispiel:
    Code (Text):

    DialogBoxParamA
    GetDlgItem
    GetDlgItemInt
    GetDlgItemTextA
    GetWindowTextA
    GetWindowWord
     
    Ich würde sagen im gesamten Bereich des Programmes, welcher ausgeführt werden kann.
    Sollten spezielle DLLs importiert werden, welche mit dem Programm mitgeliefert werden, diese natürlich auch.

    Sollte der API-Call VirtualProtect vorhanden sein, kann es sich um selbstmodifizierenden Code handeln und es sollte immer angesehen werden, welchen Zweck dieser Call erfüllt.

    Zuerst solltest du Informationen zum Programm sammeln.
    In welcher Sprache ist dieses geschrieben? Welchen Zweck soll dieses erfüllen?
    Ist es verschlüsselt?

    Das findest du ganz einfach mit einen identifier heraus. CFF-Explorer hat solchen eingebaut, wenn auch einen nicht mehr aktuellen.
    Reicht aber in den meisten Fällen.

    Wenn es sich zum Beispiel um C oder C++ handelt und keiner Sprache wie C#, VB, Delphi, Python mit Py2Exe, usw. deaktivierst du vorher ASLR im PE-Header des Programmes. Das ist einfach nur nervig und destruktiv fürs debuggen. (Befindet sich unter "DLL Characteristics" im optionalen Header)

    Zuerst startest du das Programm ganz normal. Wenn es sich nicht starten lässt besitzt es irgendeinen Schutz.
    Das kann alles mögliche sein. Von IsDebuggerPresent-Call bis zur Ausnutzung von Fehlern im Debugger.
    Diesen Schutz gilt es zum Herausfinden und zu "beseitigen", damit das Programm normal startet.

    In deinen CrackMe würde ich auch zuerst nach Strings suchen. Wenn keine gefunden werden nach intermodularen Aufrufen wie die oben erwähnten.

    Dann würde ich einen Breakpoint bei jeden dieser Aufrufe setzen und das Programm starten, einen zufälligen Text eingeben und auf den Button zum Prüfen drücken.
    Sollte kein weiterer Schutz vorhanden sein, sollte das Programm bei einen Breakpoint halten.
    Manche Strings sind zu dieser Zeit schon entschlüsselt. Suche danach.
    Die anderen werden dann erst später entschlüsselt.

    Irgendwann wird der eingegebene String verglichen. Damit du das nicht übersehen kannst, setze einen Memorybreakpoint bei der Adresse des eingegebenen Strings. Oft werden die eingegebenen Strings noch zu einer Prüfsumme umgewandelt oder sonst irgendwie verändert und erst dann verglichen. Darum sollte auch ein Memorybreakpoint für die Veränderung des Strings gesetzt werden, falls du mehr darüber wissen willst oder das man zumindest nachher nicht verwirrt ist.
    Sollte ein API-Call verwendet werden wie lstrcmpA ist das auch ein gutes Zeichen.

    Nun muss irgendwann ein JUMP wie JE, JNE oder JZ folgen. Und danach sollte spätestens der letzte String entschlüsselt werden um die entsprechende Meldung anzuzeigen (halte ausschau nach oft wiederholdenden Schleifen).

    Hier gilt es herauszufinden welches der richtige ist und diesen zu ändern.

    Gibt auch ein gutes Tutorial dazu:
    http://octopuslabs.io/legend/blog/archives/654.html

    (Es wäre vielleicht auch einfach möglich nach MessageBoxA und SetDlgItemTextA zu suchen und dann auf gut Glück die Call-Adressen zu ändern oder die Funktionen anzusehen, welche diese Aufrufen.)
     
    Zuletzt bearbeitet: 24. September 2017
  5. 3HMonkey

    3HMonkey Administrator Mitarbeiter Administrator

    Registriert seit:
    28. Juni 2017
    Beiträge:
    50
    Zustimmungen:
    33
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Hallo und vielen Dank für die schnelle Antwort. Ich werde mir das ganze in den kommenden Tagen einmal anschauen. Die Seite die du empfohlen hast finde ich schon mal total klasse. Ich denke da gibt es sehr viele gute Informationen. Gerne würde ich diese Infos auch dazu nutzen ein Tutorial oder eine Art Anleitung darüber zu verfassen. Weiterhin habe ich festgestellt dass das ganze doch sehr situationsabhängig erscheint, Was ist einem sehr schwer macht alle Bereiche abzudecken. Also nochmals vielen Dank für deine Infos, ich werde mit hoher Wahrscheinlichkeit wieder auf dich zurückkommen müssen :)
     
  6. 3HMonkey

    3HMonkey Administrator Mitarbeiter Administrator

    Registriert seit:
    28. Juni 2017
    Beiträge:
    50
    Zustimmungen:
    33
    Punkte für Erfolge:
    18
    Geschlecht:
    männlich
    Sooooo,

    ich habe mich mal darangesetzt und die Ausführungsdatei mit dem CFF Explorer geöffnet und siehe da, es handelt sich um C++, sofern ich das richtig beurteile:

    upload_2017-9-29_13-33-13.png


    Danach habe ich ASLR deaktiviert, sofern ich das auch richtig deuten konnte:
    upload_2017-9-29_22-14-38.png


    Nun habe ich das Originalfile überschrieben. Es lässt sich ohne weitere Probleme mit x64dbg öffnen.
    Nach der Suche nach den Strings etc. erscheint ein für mich nun unbrauchbares Ergebnis, aber dennoch die Erkenntnis, dass es sich um eine JVM (Java) handelt oder? Zumindest kann eihc dabei keinen brauchbaren String usw. feststellen. Oder handelt es sich beispielsweise in der zweiten Zeile bei "/%I64u" oder "%s%s" um verschlüsselte Strings?

    upload_2017-9-29_13-49-35.png


    Intermodulare Aufrufe lassen sich auch keine in der Liste finden:
    • DialogBoxParamA
    • GetDlgItem
    • GetDlgItemInt
    • GetDlgItemTextA
    • GetWindowTextA
    • GetWindowWord
    Ich erhalte dabei eher sowas wie:
    upload_2017-9-29_13-54-20.png

    Wie sollte ich nun weiter verfahren?
     
    Zuletzt bearbeitet: 29. September 2017
    krusty gefällt das.
  7. krusty

    krusty New Member

    Registriert seit:
    1. Juli 2017
    Beiträge:
    21
    Zustimmungen:
    10
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    Ort:
    Wadiya
    jvm... hört sich nach java stuff an...

    EDIT:
    Ich idiot, ist dir ja auch schon aufgefallen xD
     
    3HMonkey gefällt das.
  8. Mastodon

    Mastodon New Member

    Registriert seit:
    1. Juli 2017
    Beiträge:
    14
    Zustimmungen:
    23
    Punkte für Erfolge:
    3
    Geschlecht:
    männlich
    ASLR hast du bereits deaktiviert.

    Das dient zur Formatierung von Datentypen.
    Das gibt es in C und C++ zum Beispiel bei printf oder scanf, aber auch bei Java.

    %s%s wären zum Beispiel zwei Strings und %I64u ein 64 Bit Integer.

    Ein Beispiel in C:
    Code (Text):

    #include <stdio.h>
    #include <stdint.h>

    int main()
    {
        char *string_1 = "String 1\n";
        char *string_2 = "String 2\n";
        uint64_t number = 1000000000123456;

        printf("%s%s",string_1,string_2);
        printf("%I64u\n",number);
        return 0;
    }
     
    Die Datei die du gerade geladen hast ist nicht zufällig jvm.dll? Diese ist nämlich die standard DLL zur Ausführung von Java-Bytecode.
    Ich vermute also mal, dass dein Programm in einer Sprache geschrieben ist, welche die JVM verwendet. Also zu 99% Java. ;)

    Selbst hatte ich noch nie mit Java-Programmen zu tun, welche eingebettet in einer .exe Datei sind. (Vermutlich mit einem Converter wie jar2exe erstellt?)

    Da aber jvm.dll geladen wird, nehme ich an, dass der Bytecode weiterhin vorhanden ist.

    Ich würde versuchen den Java-Bytecode zu extrahieren und diesen dann in Java-Code dekompiliern, editieren und ihn dann wieder kompilieren.
    Mit den Bytecode selber zu Arbeiten halte ich für zu umständlich.

    Glücklicherweise gibt es dafür bereits eine Anleitung.

    Hoffe ich konnte dir helfen.
     
    source++ und krusty gefällt das.

Diese Seite empfehlen

Die Seite wird geladen...