.SAV-Datenstruktur bei Valve Source Engine (~2006): Vorgehensweise?

Mat

Well-Known Member
c-b Experte
#1
Moin, das Thema passt am ehesten hier rein, denke ich mal.

Hatte gestern ein bisschen "Dark Messiah of Might and Magic" gespielt und bin dabei auf einen Bug mit einem gescripteten Event gestoßen (ein Spinnenboss spawnt nicht). Reproduzierbarer Grund: Ich habe einen Gegenstand ein Loch hinunter geworfen, und dieser hat ein Event erneut getriggert, das eigentlich nur einmalig getriggert werden durfte (hat vermutlich eine Flag oder einen Counter zerstört). Die neueste Speicherung vor Auslösung des Bugs liegt da etwa 3+ Stunden zurück.

Ein normaler Mensch würde jetzt vermutlich den Boss überspringen, die 3 Stunden alte Speicherung laden, oder per restart den Abschnitt zurücksetzen (und die dadurch gelöschten Gegenstände + Fähigkeiten über die Konsole einzeln wiederherstellen). Das würde sicher auch schneller gehen. Aber das ist doch langweilig.

Lösungsansatz
Ich habe den Bug reproduziert und 2 minimale .SAV-Dateien für den Vergleich erzeugt. Bei Datei Nr 1 wurde der Bug nicht reproduziert, bei Datei Nr 2 wurde er bewusst ausgelöst (Bossspawn und Nicht-Spawn in beiden Speicherständen bestätigt). Siehe Anhang (ok.zip = ok, bug.zip = nicht ok). Da möchte ich jetzt den signifikanten Unterschied finden, der den Fehler ausgelöst hat, um den über die Konsole oder über eine Bearbeitung meiner originalen .SAV-Datei zu beheben. Fehler identifizieren wird vermutlich ganz gut klappen und wenn sich die Flag per Konsole ändern lässt, ist die Sache auch schon gegessen. Wenn nicht, dann muss ich die SAV-Datei bearbeiten und ggf. in der korrekten bit-Breite wieder speichern.

Da ich sowas noch nicht gemacht habe und mich die Vorgehensweise beim Zerlegen solcher Dateien sowieso interessiert, frage ich hier einfach mal nach (unabhängig vom Problem).

Bisherige Erkenntnisse
Source Engine Save-Dateien beginnen mit 4A 53 41 56 (JSAV), sind weder verschlüsselt noch komprimiert und sind in Sektionen eingeteilt. Die Sektionen haben jeweils einen eigenen Header. Diese basieren vermutlich auf irgendwelchen c-Structs und werden mit Variablen gefüllt, deren Größe und Art mir noch nicht bekannt ist. Allerdings haben viele Variablen eine ungarische Notation, was bei der Ermittlung hilft. Lädt man einen Spielstand, werden 3 Abschnitte temporär in .HL*-Dateien entpackt, von denen nur 2 Werte enthalten (mit im Anhang). Diese Abschnitte beginnen mit 56 41 4C 56 (VALV) und enthalten viele Variablen.

Was möchte ich wissen?
  1. Kennt jemand einen Hex-Editor mit intelligentem Inhaltsvergleich? Ich benutze derzeit HxD, und das kann nur byteweise, deswegen wird ab der ersten Abweichung ALLES NACHFOLGENDE als Unterschied erkannt.
  2. Gibts einen .SAV-Editor, mit dem ich mir das alles sparen könnte?
    1. Wenn ja, würde ich da auch gerne Quellcode sehen, damit ich daraus lernen kann
  3. Strukturen in einer Datei ermitteln: Wie gehe ich da vor?
    1. Header und Sektionen und ihre Größen ermitteln (fest, variabel?)
    2. Aufgaben von Sektionen beschreiben (also was da so drin ist)
    3. Variablentypen und -größe ermitteln
    4. Hab letztens was von Ghidra gelesen (OpenSource Disassembler der NSA) und wollte den mal mit den Dateien testen. Es sind zwar keine Anweisungen in .SAV-Dateien enthalten, aber Variablentypen und -größen könnte man darin analysieren glaube ich, und auch Abschnitte kommentieren. Oder ist das das falsche Werkzeug?
  4. Gibt es eine API-Doku für das .SAV-Format von Source Engine? Eigentlich muss man ja kein "Reverse Engineering" betreiben, weil es ein offenes Format ist, Source ist kein gutes Suchwort, deswegen finde ich zu viele Ergebnisse auch mit entfernen von Suchbegriffen.

PS: Ich bin ab morgen erstmal ein paar Tage weg und habe heute keine Zeit mehr, aber vielleicht finde ich hier bei meiner Rückkehr ja ein paar Anhaltspunkte und Tipps, damit ich das dann in kürzerer Zeit lösen kann.
 

Anhänge

Oben