PE Crypter

Der PE (Kürzel: Portable Executable) Crypter ist im Grunde nichts anderes als ein Verschleierungsprogramm.
Ich werde euch erläutern wie so ein Crypter funktioniert und was er macht.

Der Sinn eines PE Crypters ist es Programme vor Einblicken anderer (durch Disassemblierer z.B.) zu schützen und somit den Quellcode geheim zu halten. Sowas wird häufig bei größeren Firmen benutzt.

Ein Beispiel dafür wäre der SFT-Loader. Ziel bei dem SFT-Loader ist es die Entschlüsselung der Container geheim zu halten.

.

PE-Header

Schauen wir uns einmal die grobe Struktur einer PE Datei an:

DOS Header
Unwichtig
PE- (Sog. NT-  ) Header
Section Table
Section 1
Section n

Im PE Header sind allemöglichen Informationen über die Struktur der Datei, wie z.B. die Größe der Datei, der Einstiegspunkt (In C/C++: main()) und die Anzahl der Sektionen.

.

Verschlüsselung

In der Regel befindet sich in der sog ‚.text‘ Sektion der Code des Programms, den es zu schützen gilt. Eine Möglichkeit wäre jeden Befehl ab Einstiegspunkt bis Ende der ‚.text‘ Sektion bitweise per XOR zu verändern:

Befehl ^= 0xFF;

Das einfache und gute daran ist, dass das gleiche nötig ist um den Befehl wieder in den Urzustand zurückzuversetzen. Recht simpel.

Nach einer solchen Verschlüsselung ist es nur schwer nachvollziehbar, wie der Code voher ausgesehen haben könnte bei der o. g. Verschlüsselung ist es jedoch kein Hindernis für erfahrene Leute, allerdings ist das ja nur ein Beispiel.

.

Der Stub

Wir schreiben nun eine sog. Stub Sektion, die das Entschlüsseln für uns übernimmt. Also schreiben wir den Code, speisen ihn in eine neue von uns erstelle Sektion in die Anwendung ein und setzen den Einstiegspunkt auf unseren Stub, damit wir zu Start des Programmes den Code entschlüsseln und zum originalen Einstiegspunkt springen. Dennoch gibt es noch ein Hindernis bei div. Programmen und zwar sind es die Addressen.

.

– DMA

In der Importtable (Meistens die ‚.idata‘ Sektion) stehen Addressen zu externen Funktionen die das Programm verwendet.
Verwenden wir in unserem Programm z.B. die Funktion Sleep() so wird der Compiler den Befehl auf die Addresse zum Eintrag in die
Importtable umleiten und genau hier entsteht das Problem.

Unser Programm wird nicht jedesmal in den gleichen Addressraum geladen, d.h. das sich die Addressen zu den jeweiligen Sektionen immer ändern und sich somit auch die Einträge ändern. Das ganze hängt aber auch vom Compiler oder dessen Flags zusammen. Eine PE muss nicht zwangsweise immer eine unterschiedliche Basisaddresse haben, jedoch wird ein PE Crypter nicht für eine einzelne, sondern für mehrere PEs geschrieben und sollte uns daher auch mit diesem Problem vertraut machen.

Der PE Loader wird die Addressen im Normalfall automatisch an den Addressraum anpassen, da unser Code allerdings verschlüsselt ist
geschieht eben dieses nicht. Also müssen wir selbst ran. Wir suchen uns per Disassembler also einen unverschlüsselten Eintrag finden,
welcher die korrekte Addresse hat. Diesen Befehl (Er sollte eindeutig sein) suchen wir in unseren Stub und haben somit eine korrekte Addresse,
rechnen diese so um, dass wir den Anfang der Importtable bekommen und können unsere Addressen selber korrigieren.

.

– Schutz

Man könnte jetzt jedoch sagen, dass man den Code, sobald er geladen und entschlüsselt ist, einfach aus dem Speicher kopieren könnte und somit
den Crypter umgeht. Das ganze kann man umgehen, in dem man im Stub einen Check einbaut, ob man z.B. in einem Disassembler steckt, und das Programm ggf. abbricht.

.

Abschluss

Nunja. Das war jetzt viel Information in wenig Text.
Ich kann euch natürlich eine seitenlange Lektüre darüber schreiben, aber das ist nicht Sinn und Zweck.
Etwas Eigeninitiative gehört immer dazu, vorallem um zu lernen.

Ich hoffe ihr habt einen kleinen Einblick in einen Crypter bekommen.
Solltet ihr noch Fragen haben, wie die Struktur im Detail aussieht, so kann ich euch an MS weiterleiten:

http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx
http://msdn.microsoft.com/en-us/library/ms809762.aspx

Hier findet ihr in den RR-Thread.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *