Autor Beitrag
Nano-Ware
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.03.11 17:23 
Hey,

mir ist jetzt schon öfters aufgefallen, dass wenn ich ein gespeichertes Spiel oder die ein oder andere Programmdatei im Editor öffne, dass ich dort nur auf total sinnlose zeichen stoße statt auf gehoffte Ini oder Xml Struktur. Was ich mich jetzt frage ist, wie solche Dateien generiert werden und ob ich die Möglichkeit habe herauszufinden wie ich an die Dateien komme:

Z.B. bei dem Spiel Minecraft: Es wird in einem Ordner das Spiel in der Datei level.dat gespeichert. In der Datei befinden sich "nur" die Koordinaten aller Objekte und die Objekte + Anzahl die ich im Inventar habe. Trotzdem ist diese Datei sehr komisch.
Wie kann ich sowas auslesen. Geht mal wirklich davon aus, dass ich echt garkeine Ahnung hab, was binäres schreiben von Dateien betrifft auch total zutrifft.


Danke

Achja meistens bringen mir Erklärungen die direkt darauf bezogen sind, mehr als irgendwelche Links!


Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am Sa 19.03.2011 um 17:39
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 19.03.11 17:49 
Naja, im grunde sind ja alle Dateien "binäre Dateien". Es gibt halt nur einige, da sehen die Nullen und Einsen wie Buchstaben aus. ;-)

Ob man nun einen String wie "x = 23" reinschreibt, oder direkt die 23 so, wie sie auch im Speicher steht, ist dem Computer ja egal.

Sowas regelt man am einfachsten mit FileStreams. Wenn man z.B. zwischen durch auch mal Strings reinschreiben will, sollte man vorher die Länge in den Stream schreiben. Kleines Beispiel:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
// Speichern
procedure TForm1.Button1Click(Sender: TObject);
var fs: TFileStream;
    aString: AnsiString;
    aInteger: Integer;
begin
    fs := TFileStream.Create('test.tst', fmCreate or fmOpenReadWrite);
    try
        aString := 'Hallo Welt';
        aInteger := length(aString);
        fs.Write(aInteger, SizeOf(aInteger));
        fs.Write(aString[1], aInteger);
    finally
        fs.Free;
    end;
end;

// wieder laden
procedure TForm1.Button2Click(Sender: TObject);
var fs: TFileStream;
    aString: AnsiString;
    aInteger: Integer;
begin
    fs := TFileStream.Create('test.tst', fmOpenRead);
    try
        fs.Read(aInteger, SizeOf(aInteger));
        Setlength(aString, aInteger);
        fs.Read(aString[1], aInteger);
        showmessage(aString);
    finally
        fs.Free;
    end;
end;

_________________
We are, we were and will not be.
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Sa 19.03.11 17:49 
Meist werden solche saves als Record gespeichert. Da gabs hier mal nen paar Threads dazu.
Vorteil, man kann nicht so schnell manipulieren :wink: weil halt binär.
Nachteil, wenn man es ebend will :dance2:
Meist macht man sich die Mühe mit einen HexEditor. Vergleicht Sav1 mit sav2, um zu sehen wo sich was ändert! zb Rucksack. Habe 1 element drin. Save, sichere Datei. Finde diese Element nochmal und nehem es auf. Save. Nun vergleiche beide Saves mit einen Exeditor.
So kenn ich es noch aus uralten Zeiten.

ALf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.03.11 18:03 
Ich hab das mim Hex Editor versucht. Wenn ich nur von einem Item im Inventar die Anzahl um 1 runterschraube ändert sich so ziemlich die GANZE Datei... Ich bin am verzweifeln -.-
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 19.03.11 18:08 
Dann sind die Daten da evtl. verschlüsselt gespeichert, damit pöhse Cheater da nicht so einfach drin rumhäcken können. ;-)

_________________
We are, we were and will not be.
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.03.11 18:11 
Es gibt aber schon 1. ein Programm, dass das Inventar füllen kann und 2. ist das Programm in Java geschrieben...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 18:12 
Dann schau dir doch davon einfach den Quelltext an. Wenn du Glück hast, ist der nicht obfuscated. ;-)
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.03.11 18:18 
Ich hab im Internet gefunden, dass die Datei GZipped ist? Wie kann man die denn in Delphi GUnzippen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 18:28 
Ich denke einmal am einfachsten mit den Indy-Komponenten, die sind ja eh mit Delphi gleich installiert.
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Sa 19.03.11 18:30 
Und mit welcher und wie?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 19.03.11 18:45 
So viele Möglichkeiten gibts da ja nicht, hab kurz geschaut, wie wäre es mit TIdCompressorZLib.DecompressGZipStream?
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Sa 19.03.11 18:51 
Wenn du nur bei dem spiel jetzt nachschauen willst wie das gespeichert ist, kannst du auch unter linux die datei entpacken, oder mit 7zip. Können soweit ich weiß beide die GZip-Kompression.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 19.03.11 18:51 
Beim Lesen / Schreiben von binären Dateien kann es aber noch einige Fallstricke geben. Zum Beispiel Big oder Little Endian, Verwendung von MJD (modifiziertes Julianisches Datum) usw.
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: So 20.03.11 11:47 
user profile iconNano-Ware hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab das mim Hex Editor versucht. Wenn ich nur von einem Item im Inventar die Anzahl um 1 runterschraube ändert sich so ziemlich die GANZE Datei... Ich bin am verzweifeln -.-


Naja und ich möchte behaupten das es dir in Minecraft nicht gelingt zwei identische speicherstände anzulegen, die sich nur in der Anzahl eines Items unterscheiden. Es wird ja noch viel mehr gespeichert als nur die Itemzahl, nämlich Uhrzeit, position Blickrichtung usw...

Es ist allerdings möglich die Anzahl der Items per Cheatengine zu verändern. D.h. das müsste dann simultan ja auch mit Delphi machar sein. LG JungerIslaender
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: So 20.03.11 11:50 
Ich wüsste nicht wie das per Cheatengine gehen sollte habs ja schon versucht. Nur mir gehts ja auch nicht darum.. das könnte ich ja ich will ja lernen was es mit den Dateien auf sich hat!
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 21.03.11 17:40 
Wie wäre es dann mit Dokumentation lesen? NBT ist ein sehr gut dokumentiertes Format...

www.minecraft.net/docs/NBT.txt
www.minecraftwiki.ne...mat#level.dat_Format

Allerdings ist das nicht so ganz einfach eine funktionierene ZLib dafür zu finden. Ich benutze dafür eine "ZLibEx" von "base2 technologies" und einen eigenen Stream, weil GZip keinen Dateinamen verwendet, aber der ZDecompressionStream eigentlich einen sehen will; deswegen über-seek-e ich den einfach:

ausblenden Lizenz: WTFPL
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
unit GZip;

interface

uses Classes, ZLibEx;

type
  TGZDecompressionStream = class(TZDecompressionStream)
  public
    constructor Create(source: TStream);
  end;

implementation

constructor TGZDecompressionStream.Create(source: TStream);
begin
  Source.Position:= 10;
  inherited Create(Source, -15);
end;

end.


EDIT: Was natürlich quatsch ist hier: nur die Maps sind komprimiert, und in 1.3 ja dann auch anders als dieser Code lesen würde. Für die level.dat brauchst du nichts zum dekomprimieren.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Mo 21.03.11 23:40 
Ehm ich hab das Spiel ja auf dem PC ich hkönnte bei bedarf eine level.dat hochladen.. Naja also wenn ich die Datei einfach mal frech mit WinRAR entpacke ist der Text bis auf 5-6 Buchstaben lesbar...
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Mo 21.03.11 23:46 
Könnte ich auch *g*

War da grade auf dem falschen Dampfer. Natürlich ist eine .dat immer komprimiert. Da drin ist dann das NBT, für das man den Auslese-Code mit etwas aufwand direkt runterschreiben kann - die Doku ist halt direkt für Entwickler geschrieben ;)

Aber stimmt, Winrar erkennt das verwendete GZip z.B. direkt. Nur halt keiner der üblichen DecompressionStream-Klassen, daher der Aufwand.

Woran scheiterts denn?

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Nano-Ware Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 7



BeitragVerfasst: Di 22.03.11 19:55 
weil es dekomprimiert so aussieht :

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  
 Data Time     ’ 
LastPlayed  .Þ3¼_
 Player 
SleepTimer     Motion   ? [€#äÞà¿´Â\)¿ô +7Ö OnGround HurtTime   Health    Dimension     Air,     Inventory
   
 id B Damage   Count Slot   id ¸ Damage   Count Slot  id Y Damage   Count, Slot  id\ Damage   Count Slot  id 5 Damage   Count; Slot  id | Damage   Count? Slot  id9 Damage   Count Slotd  id8 Damage   Count Slote  id7 Damage   Count Slotf  id6 Damage   Count Slotg    Pos   @Uà"~˜Ú@Z'®€  @BBæÄ‹p 
AttackTime   Sleeping  Fireÿì  FallDistance       Rotation   Å¿…A½™… Score       DeathTime    SpawnX     SpawnY   @   LevelName Marka SpawnZ     
SizeOnDisk     >0  
RandomSeed    i«Q version  J¼
FrEaKY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: So 27.03.11 19:07 
Und wo ist das Problem? Du hast doch nicht erwartet, dass es wie ein Word-Dokument aussieht?
Anscheinend werden die Werte als Record gespeichert... dann solltest du sie mit einem Record auch wieder lesen können, sofern du das Format richtig rausliest.