Ergebnis 1 bis 1 von 1
  1. #1
    Anfänger Avatar von Cardano
    Registriert seit
    06.07.2010
    Beiträge
    17

    Standard [SRC] Kleiner Crypter in C++

    Guten Abend.
    Ich möchte euch hier einen kleinen Crypter zeigen den ich vor ~3 Monaten gecoded habe. Es ist mein erstes C++ Programm und mein erstes Programm in diese Richtung gewesen, weshalb das ganze auch sehr experimentell funktioniert:lol
    Nichts desto trotz habe ich in dieser Zeit viel über das PE Format gelernt und immer mehr versucht das Ganze zu erweitern, weshalb der Source vielleicht für einige Leute, die sich gerade mit dem PE Format beschäftigen, eine Einstiegshilfe sein kann.

    Wenn ihr euch mit dem Thema beschäftigen wollt, empfehle ich euch das Tutorial von BlackBerry als ersten Einstieg:
    http://free-hack.com/ansi-c-c-c/3850...schreiben.html

    Und parallel, um mehr Infos über das PE-Format zu kriegen, das "Portable Executable File Format Compendium v11 " von Goppit:
    ARTeam Website: Downloads / Tutorials / Portable Executable File Format Compendium v11

    Ich habe das Ganze wie folgt aufgebaut:
    1 kleine Klasse, welche eine PE-Datei einliest und diese bearbeitet (z.B. Sektion hinzufügen usw.)

    1 Source für eine RC4 Verschlüsselung welche später im Crypter zum Tragen kommt.

    Und den eigentlichen Source des Crypters.

    Aus zeitlichen Gründen kann ich leider kein vollständiges Tutorial dazu schreiben, aber wenn viel Interesse daran besteht werde ich versuchen es nachzureichen.

    Bei meinen Sourcecode in meinen Beschreibung sind folgende Abkürzungen:
    RO = RawOffset, das Offset innerhalb der ungestarteten Datei im Speicher.
    VA = VirtualAddress, die Adresse wenn die Datei als Programm gestartet wurde
    RVA = Relative Virtual Address. Addiert mit der ImageBase ist erhält man aus ihr die VA. RVA'S sind somit wichtig, wenn die ImageBase geändert wird. Da man nur die NEUE ImageBase hinzuaddieren muss um wieder eine legitime VA zu erhalten.
    OEP = Original Entry Point. Die Addresse bei der das Programm startet.

    Ich werde nun grob den Ablauf des Crypters beschreiben:


    1. Die erstellt Klasse PEFile liest eine Datei ein die über die Kommandozeile angegeben wird.
    2. Es wird die ImageBase bestimmt (Z. 66)
    3. Es wird angegeben, dass die Datei aufjedenfall bei ihrer Standart ImageBase bleiben soll, also dass Sie nicht die Charakteristik DYMNAMIC_BASE hat da in der Copy- und RC4-Stub feste Addresse relativ zur aktuellen ImageBase benötigt werden. Bei einer Basenverschiebung wären diese natürlich sinnfrei. ACHTUNG: Wenn eine Relocation Sektion vorhanden ist, kann diese nun möglicherweise genutzt werden für unseren Shellcode. Denn mit dem deaktiven der Fähigkeit einer dymnamischen Base wird diese nun hinfällig
    4. In Z. 69 wird nun die SectionID der Section bestimmt, in welcher die Relocaions angegeben werden (häufig .reloc) . Sollte diese nicht existieren, ist in iNewSecId der Wert -1
    5. In Z.70 - Z.72 werden die Information (RVA, VA, RO) über den OEP bestimmt.
    6. In Z. 73 wird ein Section Header vorbereitet für unsere Section die wir uns später noch erzeugen werden.
    7. In Z. 74 wird in dem SectionHeader ishToCrypt die Referenz zum Section Header gespeichert, welche die Informationen zur Section des OEP hat.
    8. Es beginnt in Z. 80 die große Fallunterscheidung:
    9. 1. Es existiert eine Reloc Section, nächste Fallunterscheidung:
    10. 1.1 Die Section vor der Section, in welcher die Relocations liegen hat Schreibberechtigung, diese brauchen wie für das entschlüsseln unserers Crypters zur Laufzeit, somit werden die beiden Sections fusioniert. Die Relocsection wird gelöscht und der SectionHeader der Section vor der Relocsection entsprechend an die neue Sectiongröße angepasst.
    11. 1.2 Die Section vor der Relocsection ist nicht beschreibbar. Es wird nun die Relocsection schreibbar gemacht und die entsprechenden Größenangaben angepasst.
    12. 2. Es existiert keine Relocsection, somit muss eine neue hinzugefügt werden. Die ganze "Magie", also das Größen anpassen und soweiter ist alles in der addSection Methode der Klasse.
    13. Z. 120 Es wird der SectionHeader der Section wo unser ganze Shellcode landen soll + die 256 Byte für die SubstitutionsBox der RC4 Verschlüsselung.
    14. Z. 121 wir bestimmen die Adresse der Section wo unser Code hin soll.
    15. In Z. 125 wird nun bestimmt ob überhaupt genug Platz in unserer Section ist um unseren Code einzufügen.
    16. Nun werden ab Z.135 die Werte für die Platzhalter in unserem Shellcode bestimmt und gefüllt.
    17. Ab 168 wirds nun spannend. Wie verschlüsseln die Bytes am OEP wo gleich unser RC4-Shellcode landen soll.
    18. Wenn am Ende der CodeSection in der der OEP lag noch Platz für die Copystub war passiert folgendes:
    19. Z. 174: Die Verschlüsselten Daten vom OEP kommen in die vorhin ermittelte Section, also entweder die Reloc, oder Reloc+Sec vor Reloc oder eine neue Section
    20. Z.175: Der RC4-Shellcode wird beim OEP gespeichert.
    21. Z. 176: der Entschlüsselungscode wird in der "neuen" Section hinter den verschlüsselten Daten des OEP gespeichert.
    22. Z.177+Z.178: Die 256Byte große Substitutionbox wird hinter dem Entschlüsselungscode mit 0x00 initialisiert
    23. Z. 179: Am Ende der Section des OEP wird im Codecave der Kopiercode gespeichert.
    24. Der else Pfad ist fast derselbe wie der if, nur dass diesmal das Codecave, falls vorhanden, nicht großgenug war und somit wird nun der Copycode hinter der Substitutionsbox in Z.189 gespeichert.
    25. Z. 193: Die Section des OEP wird beschreibbar gemacht
    26. Die gecryptete Datei wird unter dem namen crypted.exe gespeichert
    27. Der Rest erklärt sich von selbst

    Und nochmal die kleine Zusammenfassung was beim Start der gecrypteten Datei passiert:

    Das Programm wird am OEP gestartet. Hier liegt unser RC4-Ver/Entschlüsslungscode. Dieser entschlüsselt mithilfe des Keys die gespeicherten Daten des OEP in unserer "neuen" Section. Nun wird zur Copy-Stub gesprungen. Diese kopiert die Originalen Bytes vom OEP aus der "neuen" Section zurrück zum OEP und springt anschließend wieder zum OEP.

    Ich hoffe euch hat dieses kleine Tutorial, wenn man es so nennen kann gefallen.

    Hier ein Screen von einer Beispielausgabe:


    Hier nun der Source (bei pastebin.com da ich leider auf ~55000 Zeichen im Post komme)

    main.cpp: http://pastebin.com/ZDe6KNu5
    RC4.h: http://pastebin.com/AWR5nnwD
    RC4.cpp: http://pastebin.com/XV8gdd4w
    pefile.h: http://pastebin.com/5LztCiCC
    pefile.cpp: http://pastebin.com/P5u9WuW5

    Btw: Nicht jede Methode in pefile ernst nehmen, wie gesagt es war ein reines Lernprojekt, solche Sachen wie CreateCodeCave funktionieren (noch?!:o) nicht.

    Vielen Dank schonmal für alle Feedbacks

    MfG Cardano
    Geändert von Cardano (24.10.2010 um 22:44 Uhr)


  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    SUCHTI (30.10.2010), XX (20.11.2010)

Ähnliche Themen

  1. Kleiner Internetlog
    Von Sirect im Forum Biete Tutorials
    Antworten: 7
    Letzter Beitrag: 09.01.2009, 14:18
  2. Nur ein kleiner Stern
    Von Eldra im Forum GFX Angebote & Wünsche
    Antworten: 6
    Letzter Beitrag: 15.08.2008, 22:08
  3. kleiner MSN HACK
    Von elihaas im Forum Instant Messaging
    Antworten: 14
    Letzter Beitrag: 14.09.2007, 19:59

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •