Wie funktioniert ein Crypter in C/C++?

Also ich möchte gerne als Projekt einen Crypter Programmieren in C++.
Mir ist klar das der Crypter die Datei verschlüsselt in sich selber speichert doch da frage ich mich wie kann ich eine datei ausführen aus meinem eigenen Programm ohne sie vorher zwischenzuspeicher ..? Dachte mir das ganze geht entweder mit ASM oder Shellcode doch wie produziere ich shellcode unter windows ? arbeite normalerweise unter Linux.


Danke
 
Grobe Aufteilung der Lösungwege: entweder spielst Du Windows' PE-Loader und initialisierst die Exe selbst oder Du verschlüsselst bloß den Codebereich. In beiden Fällen brauchst Du eine Stub, die das wieder entschlüsselt - im zweiten Fall ist sowohl der entschlüsselungscode wie auch der Crypter an sich deutlich einfacher zu schreiben.

erster Lösungsweg:
kleine Auflistung, was man so berücksichtigen sollte:
http://grn.0x33.de/board/viewtopic.php?t=60&sid=

eine Übersicht über das PE Format mit weiterführenden Links:
https://www.buha.info/wiki/index.php?title=Unpacking/Keygenning_SirusBlack_Keygenme_2
alternativ
Unpacking&PE-Format
(Wiki ist übersichtlicher und "korrekter")

Sonst würde ich nach ein paar OpenSource Cryptoren/Packern/Protectoren suchen (z.b UPX, Yodas Crypter/Protector (gibt sowohl MASM wie C++ Code)).
http://www.programmersheaven.com/2/PE-Protector
http://www.programmersheaven.com/download/35321/download.aspx


die zweite Lösung gibt es hier:
http://209.85.135.104/search?q=cach...pter+egocrew+crypter&hl=de&ct=clnk&cd=1&gl=de
(googlecache, weil egocrew bei mir schon paar Wochen nicht erreichbar ist).
PE Formatkenntnisse sind auch hier Pflicht ;)

Also im groben: Codebreich bestimmen, diesen crypten, an die Exe eigenen Code (Stub) anhängen, der den Codebereich wieder entschlüsselt und natürlich den EntryPoint der Executable auf den eigenen Code umbiegen.

code von exe an code von anderen exe hängen? (c++)
Lescos UnFSG (FSG Unpacker) sollte auch in C++ und hilfreich bezüglich PE-Format auslesen sein (entweder hier oder im Buha Board suchen).

Nachteil der zweiten Methode ist: unzuverlässige Bestimmung des Codebreichs ->
Sectionnamen sind "Schall und Rauch" (frei wählbar und nicht zwingend), BaseOfCode Angaben im PE Header sind optional (bzw. müssen zumindest nicht übereinstimmen), einige exotische Linker verlagern IAT auch in den Codebreich usw. -> gepackte Executables funktionieren nicht mehr.
Wobei das in der Praxis doch nicht soo relevant sein sollte. Denn bei der ersten Methode hat man viel mehr Aufwand, wenn man auch nur ansatzweise die "HauptCompiler/Linker" unterstützen will.


Was C++ Nutzung angeht: kommt darauf an, ob und wie Du den Compiler beherrschst. Imho ist ASM zumindest für die Stub (in die Exe integrierter eigener Code) sinnvoll. Sonst sieht man auch hier in CodeKitchen ab und zu, dass es bei solchen low-level Aufgaben arge Unterschiede zwischen den Compilern gibt und diese oft nicht das gewünschte produzieren ;)
 
Danke für deinen umfassenden Post .
Ein paar Fragen:

Wie kann ich nur den .Code Berreich verschlüsseln und nicht die ganze Exe ?
Muss ich den verschlüsselten Code Berreich dann in eine Variable schreiben ?
Ich lasse die Exe so wiesie ist nur mit verschlüsseltem Code berreich und hänge einfach meinen encrypter an und füge am Anfang der EXE einen jump ein ?
Doch wie kann ich an einer bestimmten Stelle ASM Code injizieren ? und wie muss ich die Befehle anhängen ?

Vielleicht kannst du mir das ganze an einem einfachen PseudoCode erklären .

Danke Vielmals

EDIT:\\Hat jemand die datein von http://209.85.135.104/search?q=cach...pter+egocrew+crypter&hl=de&ct=clnk&cd=1&gl=de ? Danke
 
Vielleicht kannst du mir das ganze an einem einfachen PseudoCode erklären .
das ist PE Manipulation, da gibt es keinen "einfachen" Pseudocode.
och wie kann ich an einer bestimmten Stelle ASM Code injizieren ? und wie muss ich die Befehle anhängen ?
Der Code, der injiziert wird, muss zwingend in Asm geschrieben werden (bei Verwendung einer Hochsprache muss man aufjedenfall das Resultat kontrollieren und in die "adressunabhängige" Form bringen). Das ist dein erstes Problem. Es sei denn du findest jemanden, der das macht.

Wie man eigenen Code anhängt:
code von exe an code von anderen exe hängen? (c++)

Code:
Wie kann ich nur den .Code Berreich verschlüsseln und nicht die ganze Exe ?
solange die Exe nicht gepackt ist, wäre es am einfachsten die Grenzen so zu bestimmen:
EntryPoint auslesen und in der Section Liste nach dieser Section suchen.
(wieder verweise ich auf diesen Post: code von exe an code von anderen exe hängen? (c++) , da ich kein C++ nutze, kann ich das auch nicht wirklich in einer anderen Form darstellen)

lso zuerst die nötigen Werte auslesen/anpassen - dafür muss man den PE-Header suchen:
Am Anfang der Exe gibt es noch die "Altlasten" - aus Kompatibilitätsgründen ein DOS-Exe-Header (um unter DOS die schöne Meldung "This program can not be run in DOS mode" auszugeben).
erst an Position 0x03C ist die Adresse des "neuen" Headers (PE) angegeben.
Geht man zu dieser Adresse, sieht man die zwei Buchstaben "PE".
Weitere Angaben sind relativ zu dieser Adresse (als PE+0x geschrieben)

In PE + 0x28 befindet sich der Entry Point
Dieser Wert (als RVA) gibt an, an welcher Adresse der "echte" Code anfängt.
Um die Codeadresse im laufenden Programm anzuspringen, müssen wir allerdings die VA kennen - und diese berechnet sich aus Imagebase + RVA Angabe.
Imagebase können wir an: PE+0x34 auslesen.
also OEP (original entry point)=Wert an [PE+0x34]+Wert an[PE+28]
zu diesem Wert muss unser Code irgendwann mal springen, sonst läuft die normale Andwendung nicht ;)


Um Platz zu schaffen, kann man die letzte Section vergörßern:

in PE+6 befindet sich die Anzahl der Sections (als WORD)
in PE+0xF8 findet man ein Section-Array vor.
Die Einträge sind 0x28 Byte groß und so aufgebaut:
Code:
+0 8byte ANSI name 
+8 dword virtual size
+C dword virtual address (an rva to where it should bee mapped)
10 dword sizeofrawdata 
14 dword pointerToRawData (file based offset)
18 dword pointerToRelocations
1C dword PointerToLinenumbers
20 word NumberOfRelocations
22 word NumberOfLineNumbers
24 dword Characteristics   <--- dieser Wert ist für den alternativweg interessant

Du schaust also, ob der EntryPoint innerhalb der "virtual size"+"virtual address" liegt.
Das wäre dann die Codesection.

Alternativ könnte man alle Sections durchgehen
und "Characteristics" abrfagen: das ist ein DWORD
Code:
24 dword Characteristics
   - some of the flags in this are ;-
   0x00000020 contains code
   0x00000040 contains initialized data
   0x00000080 contains uninitialized data
   0x00000200 contains comments
   0x02000000 can be discarded
   0x10000000 This section is shareable. 
   0x20000000 This section is executable. 
   0x40000000 This section is readable. 
   0x80000000 The section is writeable.
(in C sollte die Abfrage so aussehen: if ( (characteristic & 0x20000000)== 0x20000000) {usw}
Wenn eine Section den "executable" Flag hat, dann liegt da höchstwahrscheinlich der Code ;)

Wenn es etwas komplizierter sein soll, kannst du noch den Fall berücksichtigen, dass die Import AdressTabelle auch in der Codesection liegt (normalerweise nicht der Fall). Ich würde diesen Fall allerdings erst betrachten, wenn ich schon funktionierenden Code hätte ;)

Muss ich den verschlüsselten Code Berreich dann in eine Variable schreiben ?
Nee, nur mittels angehängtem Code den Breich enschlüsseln
also so:
Ich lasse die Exe so wiesie ist nur mit verschlüsseltem Code berreich und hänge einfach meinen encrypter an und füge am Anfang der EXE einen jump ein ?

PS: um PE Format wirst du leider nicht herum kommen. Ich kann dir nur empfehlen, dich ein paar Tage damit auseinander zu setzen und dann nach Beispielcodes (c++) zu suchen.
 
Wie kann ich nur den .Code Berreich verschlüsseln und nicht die ganze Exe ?
Adressen vom Codebbereich stehen im Sectionheader. Codebereich ist der, auf den der Entrypoint (EP) zeigt.
Muss ich den verschlüsselten Code Berreich dann in eine Variable schreiben ?
Da brauchst du aber eine große Variable.
Ich lasse die Exe so wiesie ist nur mit verschlüsseltem Code berreich und hänge einfach meinen encrypter an und füge am Anfang der EXE einen jump ein ?
EP ändern ist besser (sonst überschreibt man ja was).
Doch wie kann ich an einer bestimmten Stelle ASM Code injizieren ? und wie muss ich die Befehle anhängen ?
Entweder neue Section erstellen und da den Code reinpacken oder Codesection im Sectionheader vergrößern und Code dann dahinterpacken.

EDIT: mist, war mal wieder wer schneller
 
ja sieht danach aus ... aber danke aufjedenfall für die ausgiebige hilfe...

EDIT:// Ich mache die Entschlüsselungs Routine am besten zu einer dll und injiziere die dll oder? oder kann ich asm Befehle irgendwie direkt injizieren?


Danke
 
Gibt es irgendwo noch eine Möglichkeit an den Content des Egocrew-Links zu kommen? Der google-cache Link scheint nicht mehr zu funktionieren.
 
Zurück
Oben