Sunday, 28. May 2006Generische Erkennung von gepackten/verschlüsselten Dateien
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): 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. Friday, 19. May 200680Bit IEEE float in 64Bit double in MS VC++ umwandeln
Verwendete man beispielsweise unter Borland Turbo C 3 in DOS einen
float oder double Wert, so wurde der als IEEE 80Bit float dargestellt, was logisch erscheint, da die FPU der Intel x86 CPU ebenfalls intern mit dieser Auflösung arbeitet. Ein long double wird beim gcc C-Compiler ebenfalls in diesr Form repräsentiert. Es ist daher auch üblich, in binären Dateiformaten solche Werte vorzufinden.Möchte man nun solche Werte im MS VC++ auslesen, steht man vor einem Problem: Wie der MSDN-Dokumentation zu entnehmen ist, wird dieser Datentyp nicht unterstützt:
Jetzt stellt sich daher die Frage, wie solche Werte ausgelesen und dann auf einen 64Bit breiten double (real*8) konvertiert werden können. Wie ja bereits in der MSDN steht, gibt es auf Assemblerebene Unterstützung für 80Bit breite float Zahlen.Es reichen daher auf der x86 CPU 2 kleine FPU-Assemblerkommandos zur Konvertierung. Man kann sich daher folgende kleine Funktion erstellen, welche eine Konvertierung vornimmt:
Monday, 15. May 2006Dynamische arrays in C
Von C++ her kennt man ja die praktischen Klassen zur dynamischen Datenverwaltung wie
set , map , vector , etc.In C sind vor Allem mehrdimensionale Arrays mit variabler Größe aber durchaus eine Herausforderung. Standardmäßig kann man mehrdimensionale arrays nur fix definieren, z.B.:
Dies ist für den C-Compiler einfach, da er hier nur entsprechend Speicher im DAtensegment reservieren muss, den man dann nach und nach füllen kann. Die dynamische Verwaltung einer solchen Strutkur am Heap ist der Runtime jedoch nicht zumutbar. Grund genug, ein paar kleine eigene Funktionn zu schreiben, um dynamische Arraybäume zu erstellen und verwalten. Die Dokumentation der kleinen Funktionen befindet sich in der Header-Datei, die hier gezeigt wird: Herunterzuladen gibt es die kleine Funktionssammlung hier
(Seite 1 von 1, insgesamt 4 Einträge)
|
SucheBlog abonnierenTop ReferrerVerwaltung des Blog |