# Windows Minidump parsen



## inv_zim (13. Dez 2012)

Hi,

da ich wohl auf der Arbeit noch nicht genug programmiere :noe: suche ich mir gerade ein Projekt für den Urlaub. 

Ich programmiere hauptsächlich Unternehmensanwendungen, und habe von den "Basics" nicht sonderlich viel Ahnung. Über Datentypen weiß ich in etwa soviel, wie mir in der Berufsschule beigebracht wurde, und da möchte ich jetzt ein wenig dran arbeiten.

Als Ziel habe ich mir gesetzt, einen Windows Minidump (Speicherabbild, das z.B. beim Bluescreen erstellt wird) zu parsen. Ich habe die Definition des Dateiformats gefunden, und würde fürs erste gerne versuchen, die Version des Dumps aus dem Header herauszulesen:

MINIDUMP_HEADER structure (Windows)

Der Datentyp ulong32 bezeichnet, soweit ich das verstanden habe, einen unsigned long von 32 bit Länge.
Das heißt, dass ich den Header so zu verstehen habe, dass die ersten 32 bit die Signatur darstellen, die zweiten 32 bit die Version, usw... oder? 

Ich lese zunächst die Datei mit einem FileInputStream in ein byte[] ein. Da es in Java keine unsigned Datentypen gibt, muss ich den Wert umwandeln. Das kann ich scheinbar mit einem BigInteger anstellen, bei dem ich das Signum auf positiv setze. Zusätzlich übergebe ich die Stellen 4 bis exklusiv 8 vom byte[], da ich zum Überprüfen die Version haben möchte (die ersten 4 byte / 32 bit sollten ja die Signatur sein).


```
public static void main(String[] args) {
        File file = new File("121312-13197-01.dmp");
        try (FileInputStream in = new FileInputStream(file)) {
            byte[] fileData = new byte[(int) file.length()];
            in.read(fileData);
            System.out.println(new BigInteger(1, Arrays.copyOfRange(fileData, 4, 8)));
        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
```

Als Ergebnis wird mir hier 1146435124 ausgegeben. Nach einem Bluescreen-Dump Tool sollte die Version aber 15 sein. Deutlicher Unterschied. Ich will auch nicht groß im Dunkeln rumstochern, ich glaube, mein Ansatz ist *sehr* naiv. 

Wie würdet ihr vorgehen? Und vor allem: Welche Literatur könnt ihr mir zu diesem Thema empfehlen?  Ich habe einige Beispiele gefunden, bei welchen wild die Bits durch die Gegend geshiftet werden, aber da verstehe ich nicht einmal Ansatzweise, was da passiert. Klar, könnte ich so lange copy&paste aus Foren versuchen, bis evtl. sogar das richtige da steht, aber was bringt mir das, wenn ich dann doch nichts verstanden habe. 

Hinter diesem Link habe ich die Dump Datei zusätzlich hinterlegt: https://dl.dropbox.com/u/10022024/121312-13197-01.dmp

Gruß,

Tim


----------



## Gast2 (14. Dez 2012)

inv_zim hat gesagt.:


> Als Ergebnis wird mir hier 1146435124 ausgegeben. Nach einem Bluescreen-Dump Tool sollte die Version aber 15 sein. Deutlicher Unterschied. Ich will auch nicht groß im Dunkeln rumstochern, ich glaube, mein Ansatz ist *sehr* naiv.




Sehr naiv trifft es schon ganz gut. Du hast nicht die Definition des Dateiformats gefunden sondern die der C++ Klassen. Wie Objekte dieser Klassen in eine Datei serialisiert oder gespeichert werden ist da nicht dokumentiert.

Findest du den Minidump so spannend? Ich würde mir eher eine besser dokumentiertes Projekt für den Start suchen


----------



## inv_zim (16. Dez 2012)

fassy hat gesagt.:


> Sehr naiv trifft es schon ganz gut. Du hast nicht die Definition des Dateiformats gefunden sondern die der C++ Klassen.



Autsch. Das war ja noch viel naiver als ich dachte :autsch:

Ja, irgendwie finde ich das Format aber spannend. Ich hatte die Idee, für unsere Admins einen kleinen Webdienst zu schreiben, Minidump hochladen, Output auf der Website. Habe jetzt eine Python-Bibliothek gefunden die einen Minidump parsen kann, ich denke ich versuche erst mal zu verstehen, wie die arbeitet.


----------

