Autor |
Beitrag |
Nano-Ware
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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 Christian S.: Topic aus Off Topic verschoben am Sa 19.03.2011 um 17:39
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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:
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:
| 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;
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
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: 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  weil halt binär.
Nachteil, wenn man es ebend will
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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: Sa 19.03.11 18:30
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
      
Beiträge: 632
Erhaltene Danke: 121
Win 7 32-bit
Delphi 2006/XE
|
Verfasst: 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
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: So 20.03.11 11:47
Nano-Ware hat folgendes geschrieben : | 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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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:
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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: 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 
      
Beiträge: 394
Erhaltene Danke: 7
|
Verfasst: Di 22.03.11 19:55
weil es dekomprimiert so aussieht :
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
      
Beiträge: 235
D7
|
Verfasst: 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.
|
|