Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#27

Re: Wie herausfinden ob eine Ausführbare gepackt ist?

  Alt 22. Jun 2006, 01:20
Metal_Snake2 fragte mich per PN:

Zitat:
hi,

falls ich störe einfach ignorieren.

Meine Frage: Hast du villeicht eine idee wie ich die Entropie einer Datei(exe datei) berechnen kann.
Mein ziel ist es damit herauszufinden ob eien exe gepackt/komprimiert wurde.
Da ja die zeichen in einer Komprimierten datei wesentlich Chaotischer(mehr nach dem zufall) geordnet sind
als bei einer unkomprimierten(eher mit mehr ordnung) kann man da ja eigentlich die Entropie anwenden.

Wie müßte ich deinen Code aus der libary umändern??


danke für eine antwort.
Ich stelle mal hier meine Antwort rein, hoffe Metal_Sbake2 hat nichts dagegen.

Hi

Fragende stören nie

Also erstmal: welcher Code aus welcher Library ?

Ich habe den Thread der DP mit Spannung mitgelesen.

Technisch gesehen gibt es nur eine Möglichkeit mit 100% Sicherheit eine ausführbare Datei zu klassifizieren. Dazu benötigt man eine SandBox und einen teil-softwarebasierten Emulator. Das ist eine Machine die quasi jeden Befehl der gestarteten EXE emuliert und somit die absolute Kontrolle darüber hat was der Code der EXE macht. Dies funktioniert deshalb weil ja das Ziel der EXE es ist ausgeführt zu werden. Dagegen gibt es auf Hackerseite keinen "Schutz" Der Emulator kann nun erkennen wie die EXE geladen wird und die notwenigen Codesegment Manipulationen, eg. das Entpacken/Entschlüsseln in das Codesegment im Speicher, erkennen.

Leider ist dies sehr aufwendig

Bleiben noch zwei Wege übrig:

1.) Klassifikation über selektierte Merkmale. Man versucht also das was zb. Himitsu im Thread vorschlug, nämlich die Eigenheiten aller bekannten Packer/Crypter zu ermitteln und quasi wie bei einem Virenscanner auf bekannte Signaturen in einer Datenbank zurückzugreifen. Das funktioniert im Falle von Viren sehr gut, benötigt aber eine ständig auf aktuellem Stand gehaltene Datenbank.

2.) der mathematische Weg wie Olli ihn vorschlug. Entropie bzw. mal größer gefasst Mustererkennung ist das Stichwort. Es gibt dabei mehrere Möglichkeiten:

a.) packe die EXE mit einem ZIPer. Eine gepackte EXE lässt sich logischerweise weit weniger packen als eine ungepackte EXE. Durch ein Preprozessing, sprich Zerlegung des EXE Images in seine Sektionen und Resourcen, kannst du jeden relevanten Teil einer EXE separat packen. Als Indiz ergibt sich das Bild das das CODE und RESOURCE Segment meistens gepackt wurden und die Relocationtable entfernt wurde.

b.) neben dem Zippen die einfache Entropie ermitteln. Man geht dabei davon aus das eine EXE auf Grund der Opcodes/Jump etc. eine Struktur aufweist die sich deutlich von anderen Daten unterscheidet. Tja, leider muß dies nicht so sein. Zb. die Entropie (Verteilung/Anzahl von Symbolen) von Text ist deutlich unterschiedlich von ausführbarem Code. Aber in jeder heutigen EXE werden Stringkonstanten, ja ganze Texte ebenfalls im Codesegment gespeichert. Oder die Entropie von gepacktem zu verschlüsseltem Code im Vergleich: beide haben die gleiche Entropie, diejenige die Zufall entspricht. Und beide sollte nicht weiter komprimierbar sein.

c.) höhere Mathematik und reale Mustererkennungen. Auf diesem Gebiet habe ich selber längere Zeit ge-hobby-forscht Ich kann hier aber nur über das reden was ich selber als Idee verfolgt hatte.
Als erstes wird die Datei in ein 2D Frequenzspektrum umgewandelt, quasi einer zeitlicher Spektralanalyse unterzogen und die Bytedaten der Datei dient als sequentieller Datenstrom als Input.

Warum macht man diesen Schritt ?
1.) Quantisierung der Datenmenge. Jede Datei ist unterschiedlich groß, hat unterschieldiche Anordnungen der Segmente und Dateninhalte. Man muß nun einen Weg finden der diese unterschiedlichen Datenmenge auf eine Zischendatenmenge reduziert die immer gleiche Größe und Struktur besitzt. D.h. aus einem komplexen Fingerabdruck wird mithilfe eines komplexen Verfahrens nur wenige wichtige Vergleichspunkte errechnet die dann für alle Fingerabdrücke immer die gleiche Größe/Anzahl an Punkten und Strukur besitzt. Durch die Quantisierung werden also unterschiedliche Dateien in einen immer gleichgroßen "Fingerabdruck" umgewandelt.
2.) Spektralanalyse. Dabei geht es darum quasi die Art und Weise des Vorkommenes aller 256 möglichen Symbole in der Datei zu ermitteln. Man ermittelt also wie oft und wie periodisch (Amplitude und Frequenz) die einzelnen Symbole auftauchen. Bei Texten wird man feststellen das ganze Symbole fast niemals auftreten, bei EXEs wird man feststellen das 0 sehr oft vorkommt.
3.) 2D Spektralanalyse. Man macht nun sequientiell für zb. von Daten-scheiben a 256b-16Kb an Daten nacheinander eine Spektralanalyse. Das hast du schon öfters in Filmen gesehen, bei Sprachanalysen von Agentenfilmchens. Meistens ist das ein sich von Links nach Rechts bewegendes farbiges Band das von rot nach gelb über grün nach blau geht. Darin kann man zb. die Basstakte einer Musik erkennen.
In unserem Falle ist das von Vorteil da wir davon ausgehen können das eine EXE einen sequientiellen Aufbau haben wird der ja nach Segment unterschiedliche Dateninhalte speichert und somit auch unterschiedliche Spektren erzeugen wird. Eine 2D Spektralanalyse mancht nun auch eine Spektralanalyse über den kompletten Zeitraum.

Was heist das immer "Spektralanalyse" ?
Wichtiger ist das WIE, und das ist ganz einfach machbar über Fourier Transformationen, genauer gesagt die FFTs Fast Fourier Transformationen. Wenn wir uns eine Musik anhöheren dann wird eine FFT diese komplexe Schallwelle der Musik in all ihre Sinusfrequenzen die dieses komplexe Schallmuster ergeben, zerlegen. Je nach Stärke = Amplitude der einzelnen Frequenzen wird die FFT in ihrem Resultat einen stärkeren "Ausschlag" erzeugen. Die FFT liefert uns also ein Bild darüber wie sich eine komplexe Schallwelle aus den verschiedenen Frequenzen zusammensetzt und zeigt auch noch deren Stärke an. Nun, simple Bytes aus einer EXE kann man auch als "Schallwelle" ansehen, man kann sogar mit einer FFT zwei Zahlen multplizieren (sogar höchst effizient wenn diese Zahlen enorm groß sind, aber das ist ein anderes Hobby von mir )
Eine 2D FFT macht nun viele Einzel-FFT sequientiell über die Datenblöcke einer EXE. Wie in einem Musikstück werden wir dann den zeitlichen Verlauf der Schallwellenänderungen analysieren, wir sehen dann den Beat, den Bass, das Einsetzen des Sängers und zusätzlich natürlich immer auch all die Frequenzen der Schallwellen. Wir sehen also wann und mit welchem Bass der Beat komponiert wurde, mit welcher Stimmlage der Sänger singt etc. pp.
All das ist 1 zu 1 übertragbar auf jeden beliebigen Datenstrom ja sogar Chemischer Substanzen und Stoffe.

Nun, aber wie erkennen wir jetzt an Hand dieser Daten eine EXE ?
In meinem Projekt benutzte ich dazu Neuronale Netzwerke. Das sind quasi lernfähige Computer"hirne" (ein sehr naiver Vergleich allerdings). Wichtig ist nur: die NN's können von uns trainiert werden und sie können auf Mustererkennungen trainiert werden (Spracherkennungen, Bilderkennungssysteme, Gesichtserkennungen usw. usw.) Aber am wichtigsten ist es zu wissen das ein NN Muster erlernt indem es autom. und selbständig diese klassifizieren lernt OHNE das wir als Menschen wissen welche markanten Merkmale das NN für diese Klassifizierung real heranzieht. D.h. wir sagem dem NN was es klssifizieren lernen soll und es lernt Merkmale zu finden ohne das wir wissen wollen welche Merkmale es gefunden hat. Wir sind also nur am Ziel interessiert.

Einem NN müssen wir aber erstmal die Datenmengen vorverdauen, zurechtbiegen so das es die Aufgabe überhaupt lösen kann. Und dazu müssen die Daten quantisiert werden, quasi auf einen Einheitsvektor abgebildet werden. Denn ein NN hat nur eine feste und begrenzte Anzahl von Eingabeneuronen (quasi der Input in das Netz).

Wir führen also zb. eine 256 Punkte FFT durch, ermitteln also die Amplitudenwerte von maximal 128 Frequenzen/Symbolen. Diese 128 Punkte der FFT dienen dem NN als Input. Bei der Trainigsphase lassen wir einfach alle Dateien einer großen Festplatte per FFT umrechnen. Wir ordnen dann diese Dateien in eine Datenbank ein, zb. sortiert nach Textdateien,binären Dateien,komprimierten Dateien etc.pp. Nun haben wir eine Trainingsdatenbank und trainieren unser NN. Das NN wird nun autom. aus einem 2D Spektrum einer Datei die Antwort liefern ob sie eher eine Textdatei, binäre Datei etc. pp. ist.

Nungut, exakt damit habe ich rumgespielt und doch sehr gute Erfolge erzielen können. EXE Dateien hat er zuverlässig erkannt und auch ob sie komprimiert und oder verschlüsselt waren. Allerdings konnte mein NN eben nicht zwischen gepackten EXE und verschlüsselten EXEen unterscheiden lernen. Einfach weil es da meistens keinen Unterschied gibt in den Daten. Leider war diese Unterscheidung, bzw. das Erkennen kryptographisch geschützter Daten mein eigentliches Ziel.


Fazit: Ich stimme grundsätzlich Ollis Ansatz über die Entropie zu gehen zu, allerdings im weiterem Sinne gefasst. Ich würde Mustererkennungssysteme benutzen da die einfache Entropie zu wenig aussagekräftig sein wird, ja sogar wenn man die EXE vorher in ihre einzelne Segmente zerlegt und diese separat analysiert. Das liegt einfach daran das Code heut auch viel an Daten enthalten wird.

Als technisch leichter und denoch relativ effizienter Weg wäre noch wie oben angedeutet die Test-Komprimierung der Daten möglich. Zufallsdaten, verschlüsselte Daten und komprimierte Daten lassen sich weit weniger nochmals komprimieren als andere Daten. Aber Vorsicht auch hier gilt das in einer unkomprimierten EXE große Portionen an zb. Bildern wie JPPEGs, PNGs, GIFs sogar Bitmaps enthalten sein können und diese sind meistens alle komprimiert. ALso auch hier keine wirkliche Sicherheit in der Erkennung.

So, mal wieder ein langer Beitrag, sorry

Gruß Hagen
  Mit Zitat antworten Zitat