Reverse Engineering im Binärformat am Beispiel von Korg .SNG-Dateien



Wir leben in einer erstaunlichen Zeit. Um uns herum gibt es eine Fülle von Technologien: Telefone, Computer, Smartwatches und andere Geräte. Täglich bringen Hersteller immer mehr Geräte auf den Markt. Die meisten von ihnen sind für ein kurzes und helles (oder nicht so) Leben bestimmt: ein leistungsstarkes Marketingunternehmen zum Zeitpunkt der Veröffentlichung, 1-2 Jahre volle Unterstützung durch den Hersteller und dann langsames Vergessen. Einfache Geräte können noch Jahre nach Ablauf des offiziellen Supportzeitraums funktionieren. Mit intelligenten Geräten wird es schwieriger. Es ist gut, wenn das Gadget nach dem Trennen der Server / Dienste des Herstellers zumindest weiterhin funktioniert. Und es ist ein Glück, wenn das nächste Update des Betriebssystems, der Treiber oder anderer Software die Kompatibilität nicht übertrifft.

Leider entwickeln sich die Ereignisse zunehmend nach einem pessimistischen Szenario. Und 5-10 Jahre nach dem Kauf haben wir technisch einwandfreie Geräte in der Hand, die jedoch aufgrund mangelnder Softwareunterstützung nicht verwendet werden können. Natürlich ist ein kaputtes Gerät unangenehm. Aber viel unangenehmer, wenn Benutzerdaten in einem inkompatiblen Format mit irgendetwas vorhanden sind. Diese Daten können als verloren betrachtet werden, wenn das Gerät nicht mehr funktioniert. In meinem Fall ist das Schlimmste noch nicht passiert, aber die Alarmglocken läuten bereits.

Es gibt also die berüchtigte Firma Korg, die sehr hochwertige Musikausrüstung herstellt. 2010 kaufte ich einen Synthesizer von dieser Firma, um Musik als Hobby zu üben. Die Korg-Mikrostation ist ein ziemlich fortschrittliches Modell. Unter anderem verfügt es über einen Sequenzer zum Aufzeichnen seiner Spuren und kann Daten im proprietären SNG-Format auf eine Speicherkarte schreiben. Es ist möglich, in ein gängiges MIDI-Format zu exportieren, aber fast alle Metadaten gehen verloren: Informationen zu überlagerten Effekten und Filtern, verschiedene Einstellungen virtueller Instrumente usw. Das Hauptproblem für mich persönlich ist die Geschwindigkeit des Übergangs zur Aufnahme musikalischer Ideen. Die Muse ist eine skurrile Kreation, und die meiste Zeit stoße ich auf eine interessante Idee, indem ich einfach etwas unkompliziert improvisiere oder spiele. Je schneller ich die Aufnahmetaste drücke, ohne im Menü herumzuwandern, desto wahrscheinlicher kann ich ein interessantes Fragment wiederholen und aufnehmen, das in Zukunft möglicherweise Teil eines vollwertigen Werks wird. Natürlich ist dieser Ansatz unvollkommen, aber wir sprechen von einem Hobby. Auf die eine oder andere Weise habe ich fast zehn Jahre lang ungefähr tausend musikalische Skizzen und Skizzen im SNG-Format gesammelt.

Die Glocke läutete in Form einer Reihe von Störungen des Synthesizers, die ein Blinken des Geräts erforderten. Und ich dachte darüber nach, alle meine gesammelten Daten in das Midi-Format zu konvertieren, zumal es viel einfacher ist, sie zu speichern, zu organisieren und zu bearbeiten. Die Suche nach dem Konverter in Google ergab nichts. Es gibt viele Anfragen in allen Arten von Foren, die Geschichte geht seit 20 Jahren weiter, wenn nicht mehr. Ich fand nur das alte Windows-Dienstprogramm eines anderen, das natürlich nicht mit meinen Dateien kompatibel war.

Und dann habe ich mich entschlossen zu versuchen, herauszufinden, worum es bei diesem SNG-Format geht? Vielleicht gibt es irgendwo drinnen normale MIDI-Daten, die Sie einfach abrufen und speichern können?

Ein Versuch, das Problem "Stirn" zu lösen


Aus den Anweisungen für den Synthesizer können Sie also ersehen, dass das SNG-Format ein Container ist, in dem die sogenannten "Songs" gespeichert sind. Jeder Song enthält 16 Sequenzer-Tracks mit Musikdaten sowie Einstellungen für Sounds und Effekte. Beim Exportieren in das Midi-Format über das Synthesizer-Menü wird jeder „Song“ in eine separate .MID-Datei exportiert, und alle Einstellungen für Sounds und Effekte gehen verloren. Weil Ich spiele meine Ideen in der einfachsten Form und ohne Auswirkungen. Das Problem ist genau eine große Anzahl von SNG-Dateien und die Unannehmlichkeit des manuellen Konvertierungsprozesses. Mal sehen, ob dieser Prozess beschleunigt oder automatisiert werden kann.

Erinnern wir uns zunächst an die MIDI-Daten. Einfach ausgedrückt ist dies ein Strom von Musikereignissen: Drücken und Loslassen einer Taste, Drücken und Loslassen eines Sustain-Pedals, Ändern des Tempos, des Patches (virtuelles Instrument) und anderer Parameter. Jedes Ereignis enthält ein Zeitdelta ab dem Moment des vorherigen Ereignisses und Daten, z. B. Notenintensität und Tonhöhe. Das MIDI-Dateiformat ist sehr einfach: Neben den Headern und den Daten selbst gibt es dort praktisch nichts.

Pink ist ein Hinweis auf Ereignis. Hellgelb ist ein Delta der Zeit. Blau - Note Off-Ereignis.

Versuchen wir, unsere Midi-Daten in der SNG-Datei zu suchen. Schreiben Sie dazu eine Folge von mehreren Noten auf den Synthesizer und exportieren Sie sie in beide Formate. Weil Da wir nicht genau wissen, wo sich die Musikdaten in den Binärdateien befinden, werden wir versuchen, den Vorgang mit verschiedenen Notenfolgen zu wiederholen.

Im Folgenden verwende ich den Hex-Editor Synalyze It! Seine Fähigkeiten in der Zukunft werden für uns sehr nützlich sein. Verwenden Sie in der Zwischenzeit einfach die binäre Vergleichsfunktion.

Tatsächlich stimmte nur der Name des „Liedes“ überein. Wenn wir zwei SNG-Dateien mit unterschiedlichen Notenfolgen vergleichen, können wir grob erraten, wo genau die Musikdaten gespeichert sind. Dies hilft uns jedoch vorerst nicht weiter - das Datenformat ist unterschiedlich. Die Datei selbst ist zehnmal größer als die Midi-Datei und scheint viele zusätzliche Informationen zu enthalten. Sie können die KORG-Signatur in den ersten vier Bytes und einigen anderen Zeilen sehen, einschließlich des Namens des „Songs“ und der Namen der Patches (Töne), die den Tracks zugewiesen sind.

Analysieren der Struktur von Datenblöcken


Dies könnte abgeschlossen werden, wenn es glücklicherweise keine Tools gäbe, die es relativ einfach machen, die Struktur von Binärdaten zu analysieren und zu verstehen. Das gleiche Programm Synalaze It! Hilft uns dabei, mit dem Sie eine „Grammatik“ für die Analyse von Binärdateien erstellen und anwenden können.

Grammatik ist eine hierarchische beschreibende Struktur, mit der Sie Binärdaten in einer für Menschen lesbaren Form darstellen können. Mit dem Programm können Sie Grammatik für einige Formate herunterladen. Zum Beispiel für das gleiche Midi:

Für das SNG-Format wurde keine vorgefertigte Grammatik erwartet. Nun, mal sehen, was wir selbst aus der Datei extrahieren können.

Beginnen wir mit der Überschrift. In der Regel enthält dieser Teil die Dateisignatur, Versionsinformationen, Größen und Offsets von Datenblöcken. Nach dem Vergleich mehrerer verschiedener SNG-Dateien finden wir die unveränderlichen Teile und achten genauer auf diejenigen, die sich ändern

Erstellen Sie eine Titelstruktur im Grammatikeditor. Die ersten 4 Bytes sind offensichtlich die Signatur der Datei. Angenommen, die folgenden 4 Bytes sind versioniert. Die nächsten zehn Bytes ändern sich nicht und enthalten nichts Interessantes - wir erstellen für sie Binärdaten der entsprechenden Größe. Aber dann beginnt der Spaß. Sie können einige Muster im Verhalten von Bytes bei den Offsets 0x13 und 0x1b feststellen. Der zweite scheint der Anzahl der „Songs“ in unserer Datei zu entsprechen. Und der erste wächst auch mit der Datenmenge im Header - dies scheint die Größe zu sein, nur der Countdown kommt nicht vom Anfang der Datei, sondern vom nächsten Byte 0x14. Zu diesem Zeitpunkt können wir nur die Art der numerischen Daten erraten. Angenommen, die Größe ist vom Typ UInt32, d. H. dauert 4 Bytes. Fügen Sie sie unserer Struktur hinzu. Jetzt können wir die Größe der Header-Struktur festlegen (Größe + 20).

Grammatik mit hinzugefügter Dateikopfstruktur


Mal sehen, was als nächstes kommt. Wenn Sie genau hinschauen, werden Sie feststellen, dass Abkürzungen aus drei Buchstaben in der Datei verteilt sind: SNG1, SDK1, SGS1 usw. Diese Zeichen sind in allen SNG-Dateien enthalten, daher können wir davon ausgehen, dass dies Signaturen bestimmter Blöcke sind. Außerdem endete unser Titel sehr erfolgreich kurz vor einer dieser Unterschriften. Vergleichen Sie das Verhalten der folgenden 4 Bytes in Dateien unterschiedlicher Größe. Es ist ersichtlich, dass die Werte mit zunehmender Datenmenge zunehmen.

Ein paar weitere Experimente, Analysen und Berechnungen und das folgende Bild entstehen:



Alternative Diagrammansicht


Daher besteht unsere Datei aus einer ziemlich einfachen Hierarchie von Blöcken. Es gibt übergeordnete Blöcke, die mehrere untergeordnete Blöcke enthalten können. Es gibt Blattblöcke (in der Terminologie von Binärbäumen), die keine anderen Blöcke enthalten.

Dann beginnt die Magie. Mit nur wenigen Grammatikstrukturen können wir die Blockdateistruktur vollständig analysieren

Erstellen Sie daher eine DataChunk-Vorlagenstruktur mit den folgenden Feldern (die Größe wird in eckigen Klammern angegeben):

id: String [4]
Größe: Int [4]
Hierarchie: Int [4]
Daten: Struktur

Erstellen Sie nun eine parentChunk-Struktur, die DataChunk erbt. Geben Sie in der Hierarchieeigenschaft den festen Wert 0x400 an - dies ist ein Zeichen für den übergeordneten Block. Stellen Sie sicher, dass das Kontrollkästchen Muss übereinstimmen aktiviert sein muss.

Erstellen Sie auf ähnliche Weise childChunk. Die Hierarchie hat in diesem Fall zwei Werte: 0x240100 und 0x100

Fügen Sie der Datenstruktur parentChunk Verweise auf die Strukturen parentChunk und childChunk hinzu - auf diese Weise erstellen wir eine Rekursion.

Fügen Sie abschließend einen Verweis auf die parentChunk-Struktur im Hauptknoten hinzu.

Die Reihenfolge der Elemente in der Datenstruktur von parentChunk muss variabel sein. Außerdem muss die minimale und maximale Anzahl von untergeordneten Elementen dieser Struktur festgelegt werden: 0 bzw. Unbegrenzt.

Wenden wir die Änderungen an und voila - unsere Datei ist gut in die Hauptblöcke zerlegt

Wir wissen immer noch nichts über die Daten selbst, aber jetzt können wir viel einfacher in der Datei navigieren und uns darauf konzentrieren, die benötigten Informationen zu finden.

Analysieren eines Blocks mit einem Inhaltsverzeichnis einer Datei


Versuchen wir zum Training, einen einfachen Block zu analysieren, z. B. SDK1. Anscheinend enthält es so etwas wie ein Inhaltsverzeichnis - eine Liste von Songs und wahrscheinlich einige Offsets / Größen.

Erstellen Sie eine sdk1Chunk-Struktur, die childChunk erbt. Wir werden das ID-Feld bearbeiten und die Signatur unseres Blocks im Feld Feste Werte angeben. Vergessen Sie nicht das Kontrollkästchen Muss übereinstimmen. In den Blockdaten kann man ein ziemlich offensichtliches sich wiederholendes Muster beobachten: den Namen des „Liedes“ und bisher unbekannte Daten. Beachten Sie, dass die Größe der sich wiederholenden Fragmente 64 Byte beträgt. Wenn Sie die Dateiversionen mit einer anderen Anzahl von „Songs“ vergleichen, können Sie außerdem feststellen, dass die Anzahl in den ersten vier Bytes gespeichert ist. Mit einfachen Berechnungen und mehreren Annahmen erhalten wir die folgende Version der Struktur in der Grammatik:

Hier habe ich eine untergeordnete 64-Byte-SongInfo-Struktur erstellt und die Möglichkeit angegeben, numSongs mal zu wiederholen. Hier ist das Ergebnis der Anwendung der Grammatik:

Die weitere Dateianalyse bleibt eine technische Angelegenheit. Ich habe die allgemeinen Einstellungen des „Songs“ und die Parameter der einzelnen Spuren des Synthesizers geändert. Durch den Vergleich von Dateiversionen mit verschiedenen Änderungen können Sie die Grammatik verbessern und verfeinern. Nach einer ausreichend großen Anzahl solcher Iterationen verbleiben fast keine nicht erkannten Datenfragmente in der Datei. Der Prozess hat mich ein wenig mitgerissen und fast alle Abschnitte der Datei aussortiert, obwohl dies für die ursprüngliche Aufgabe nicht erforderlich war.

Ein kleiner Teil der Grammatik einer SNG-Datei nach 8 Stunden Analyse


Ich werde die Details dieses Prozesses vermissen - in Zukunft werden wir uns direkt auf die Analyse der Musikdaten konzentrieren.

Aber mehr dazu im nächsten Teil. Dort werden wir auf eine interessante Aufgabe der Datenkonvertierung stoßen (sie eignet sich gut für Interviews), wir werden versuchen, sie mit einem kleinen Skript zu lösen, und wir werden ein eher ungewöhnliches Testergebnis hören.

Vorläufige Ergebnisse


Das Reverse Engineering von Binärdateien kann unerwartet auftreten. Zum Beispiel, um Geräte-Firmware zu analysieren, aus seltenen Datenformaten zu konvertieren, digitale Bedrohungen zu analysieren oder sogar Spielspeichern trivial zu ändern. Mit modernen Tools können Sie diese Probleme schnell und effizient lösen. Vor ungefähr 10 Jahren habe ich nach Laptop-Firmware gesucht und dieser Vorgang kann mehrere Wochen dauern. Dann mussten Skripte manuell geschrieben werden, um Datenblöcke zu analysieren und Strukturen zu erstellen. Mit einem neuen, teilweise automatisierten Ansatz habe ich in nur wenigen Tagen eine fast vollständige Dateigrammatik erstellt.

Sie können die Analyse der Binärdatei starten, indem Sie nach Zeichenfolgen suchen. Diese können die ersten Hinweise geben und den Analyseprozess beschleunigen. Oft bestehen Binärdateien aus Datenblöcken, die in einer hierarchischen oder linearen Struktur organisiert sind. Wenn Sie sich mit dieser Struktur befassen, ist die weitere Analyse viel einfacher. Der Dateikopf kann Hinweise zu den Offsets / Größen der Datenblöcke geben. In den ersten Schritten ist es sinnvoll, sich auf die Beschreibung offensichtlicher Strukturen und Blöcke zu konzentrieren. Die Analyseaufgabe wird durch die Möglichkeit, neue Versionen von Dateien mit unterschiedlichen Einstellungen, Parametern und Daten zu erstellen, erheblich vereinfacht. Es gibt eine Reihe von Schwierigkeiten, die mit unbekannten Datentypen und Bytereihenfolgen in ihrer binären Darstellung (Endianness) verbunden sind. Wir werden diese Fragen im nächsten Teil ansprechen.

Empfohlene Lektüre


Andreas Pehnack. Vorgehensweise bei der Analyse des binären Dateiformats

Source: https://habr.com/ru/post/de442580/


All Articles