Generische Erkennung von gepackten/verschlüsselten Dateien

By dose | May 28, 2006
Under: technical stuff, Uncategorized

Im Rahmen meines Rootkit-Detector Projekts benötigte ich eine routine, die erkennen kann, ob eine Datei verschlüsselt oder gepackt ist, um eruieren zu können, ob die Datei auf der Festplatte der im Speicher gleichen kann oder nicht.
Auf alle Signaturen aller auf dem Markt befindlichen EXE-Packer/Crypter zu prüfen ist hier kein optimaler Ansatz.
Stattdessen sollte die Erkennung möglich generisch sein. Was also tun?
Im Prinzip ist die Lösung trivial: Durch was zeichnen sich gepackte Dateien aus? – Durch die Eigenschaft, dass sie sich
schwer weiter komprimieren lassen, sprich: ihre Entropie ist möglichst klein. Dies kann man leicht auch mit einem Hexeditor feststellen:
Sieht man sich eine gepackte, oder auch eine verschlüsselte Datei damit an, so wird man feststellen, dass es sehr viele unterschiedliche Zeichen gibt, die Zeichenauftrittswahrscheinlichkeit ist also ziemlich gleichmäßig verteilt, während bei unkomprimierten Dateien oftmals viele aufeinanderfolgende gleiche Zeichen vorzufinden sind (z.B. lauter 00 – Bytes).
Man kann schon beim Betrachten der Struktur einer Datei mittels eines Viewers mit bloßem Auge sehen,
ob eine Datei komprimiert ist oder nicht. Hier ein Beispiel (nicht gepackt vs. gepackt):
Nicht gepackt Gepackte Datei
Ich habe daher ein paar kleine Funktionen zum Prüfen der Entropie einer Datei geschrieben, um abschätzen zu können, ob eine Datei wahrscheinlich gepackt ist oder nicht. Ich habe das Ganze für WIN32 geschrieben, es lässt sich aber sehr einfach auf ANSI-C portieren:

Noch etwas zu den Konfigurationsparametern:
ENT_FREQ_MAX gibt an, wieviele Bytes der Datei maximal analysiert werden sollen. Diese Begrenzung ist durchaus sinnvoll, da eine Prüfung großer Dateien sonts ineffizient wäre.
ENT_EXE_OFFSET gibt an, wieviele Bytes an Anfang der Datei bei der Prüfung übersprungen werden sollen. dies ist sinnvoll, da der header einer Executable normalerweise nicht komprimiert sein kann und die Prüfung daher erst ab dem Codesegment sinnvoll ist (man köntne natürlich den EXE-header analysieren und erst bei merste ncode-segment zu prüfen beginnen, aber der Einfachheit halber habe ich hier darauf verzichtet).
ENT_BARRIER gibt den Schwellenwert an, bei dessen Überschreitung eine Datei als nicht gepackt/verschlüsselt gilt. 10 ist hier ein guter Wert.
Der Rest dürfte selbsterklärend sein. Bei Fragen –> Comment hinterlassen.

Leave a Comment

Name:

E-Mail :

Subscribe :
Website :

Comments :