Laden...

Unbekannte Dateiarten auslesen

Erstellt von RaphaelH vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.525 Views
R
RaphaelH Themenstarter:in
65 Beiträge seit 2011
vor 12 Jahren
Unbekannte Dateiarten auslesen

Hey,

Meine Frage ist, wie kann man unbekannten Datentyp auslesen und verwerten?

Z.b. Spiele, diese haben ja meistens irgendwelche Dateien, .dat, .aup, .wasauchimmer

Wenn man diese öffnet z.b. Notepad kommen da ja nur kryptisches Zeug raus 😃

Meine Frage, wie kann man so etwas deserialisieren, ohne zu wissen was es eigentlich ist.. Ich habe schon öfter gesehen, dass manche Leute für gewisse Spiele eine art Daten-Extractor programmiert haben. Jedoch kann ich mir nicht vorstellen wie man da vorgeht?

Gruß,

Raphael

G
538 Beiträge seit 2008
vor 12 Jahren

Du musst wissen, wie es serialisiert wurde - oder erraten.
Wenn du also weißt was du suchst, kannst du enstprechend deserialisieren.

Den stand eines Spiels zum Beispiel kannst du eventuell auch erraten, indem du bestimmte Zustände speicherst und dann vergleichst.
Zum Beispiel hast du 1000 Geld und speicherst, dann speicherst du nochmal mit 1001 Geld und schaust, was sich in der Datei verändert hat. Damit kannst du per Ausschlussverfahren feststellen, wie das alles serialisiert wurde.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

Gelöschter Account
vor 12 Jahren

Datentyp != Dateityp

Das nur so am Rande 😃

Bei unbekannten Dateiformaten macht man diese am besten erstmal mit dem Hexeditor auf und schaut mal.
Wenn das nichts nützt, dann dekomprimiert man sie testweise mit diversen Methoden und schaut nochmals mit Notepad/Hexeditor drauf, ob etwas lesbares dabei herauskommt.

Meistens hat man da dann wenigstens eine Art Header, der einigermaßen lesbar ist... und der Rest hängt dann davon ab, was man eigentlich erreichen möchte.

C
224 Beiträge seit 2009
vor 12 Jahren

Hi Raphael,

Wenn man diese öffnet z.b. Notepad kommen da ja nur kryptisches Zeug raus 😃

Du kannst Dir den Inhalt einer Datei als ein Bytearray vorstellen.
Für Notepad ist jede Datei eine Textdatei. Bytewerte unterhalb 32 werden als Steuerungszeichen interpretiert und werden ggf. gar nicht angezeigt. Bytewert 13 und Bytewert 10 werden z.B. als neue Zeile interpretiert. Mit einem Hexeditor kannst Du Dir den Inhalt jeder Datei genauer anschauen. Ob Du daraus schlau wirst, ist eine andere Sache. Und so kommen wir zur nächsten Frage:

wie kann man unbekannten Datentyp auslesen und verwerten?

Du musst schon den Aufbau der Datei kennen. Erst dann kannst Du die Daten auswerten.

Nachfolgend ein Beispiel. Es wird eine Datei mit einem Integerwert geschrieben.
C# Integer sind 32 Bit = 4 Bytes groß (IMHO auch bei 64 Bit Systemen).
Der Integerwert wird dabei im Little Endian Format gespeichert.
Mit anderen Worten: eine 1 wird als 01 00 00 00 weggeschrieben.


        private void WriteInt(int x)
        {
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Create))
            {
                byte[] data = BitConverter.GetBytes(x);
                fs.Write(data, 0, data.Length);
            }
        }
        private int ReadInt()
        {
            int x;
            using (FileStream fs = new FileStream(@"C:\test.dat", FileMode.Open))
            {
                byte[] data = new byte[(int)fs.Length];
                fs.Read(data, 0, data.Length);
                x = BitConverter.ToInt32(data, 0);
            }
            return x;
        }

        private void Test(int x)
        {
            MessageBox.Show("Write " + x);
            WriteInt(x);
            MessageBox.Show("Read " + ReadInt());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Test(1);
            Test((int)DateTime.Now.Ticks);
        }

Manno, jetzt, wo ich's reinstellen will, habt Ihr schon was geschrieben. 😉
Den Fall, dass die Datei gezippt ist, habe ich noch gar nicht berücksichtigt.

Gruß, CoLo

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo RaphaelH,

Du musst wissen, wie es serialisiert wurde - oder erraten.

die Betonung liegt auf "oder erraten". Denn üblicherweise wählen Spieleentwickler die Dateiformate so, dass es eben nicht so leicht ist, an die eigentlichen Informationen zu kommen. Das ganze geht eben nur mit Trial und Error und am besten einer gehörigen Portion Erfahrung.

Man kann natürlich auch versuchen durch reverse engineering des Codes die für das Speichern zuständigen Methoden zu ermitteln und deren Quellcode wiederherzustellen.

Zum Beispiel hast du 1000 Geld und speicherst, dann speicherst du nochmal mit 1001 Geld und schaust, was sich in der Datei verändert hat.

Zu dem bisher gesagten kommt noch hinzu, dass die Informationen möglicherweise komprimiert, verschlüsselt oder zumindest verschleiert sind. Es ist also keineswegs gesagt, dass wenn man nur einen Wert ändert, sich in der Datei nur eine Stelle ändert. Es kann sein, dass die Änderung eines Werts den kompletten Inhalt der Datei betrifft.

Dann hilft eigentlich wirklich nur noch das reverse engineering. Allerdings kann es sein, dass der Code selber verschleiert oder obfuscated ist.

Es gibt einfach kein Verfahren bzw. keine Vorgehensweise, die generell in jedem Fall zum Erfolg führt. Es ist - wie eingangs gesagt - viel raten, stochern und probieren.

herbivore

309 Beiträge seit 2008
vor 12 Jahren

@CoLo:

Die Klassen BinaryReader und BinaryWriter sind dir bekannt?

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Scavanger,

man sollte noch anmerken, dass man mit den Klassen alleine aber auch nur an die Rohdaten kommt, sprich die in den Dateien gespeicherte Bytefolge, nicht aber inhaltlich an die Daten.

herbivore

C
224 Beiträge seit 2009
vor 12 Jahren

@Scavanger: gesehen, ja; verwendet, ja; wirklich kennen, nein; sonst hätte ich es jetzt verwendet (oder auch nicht xD). Danke für den Hinweis.