Dekodierung von Varints: Eine kritische Fähigkeit in der SQLite-Forensik

Einführung

Meine erste Begegnung mit varints hatte ich vor vielen Jahren bei einer digitalen forensischen Untersuchung eines iPhone 3GS im Rahmen einer Mord- und Brandstiftungsuntersuchung. Bis dahin hatte ich mich bei meiner forensischen Arbeit hauptsächlich mit Mobiltelefonen beschäftigt, insbesondere mit CDMA-Geräten, auf denen BREW läuft. Jede Textnachricht wurde in einer eigenen Datei gespeichert, mit einem einheitlichen Offset und einem einfachen Hex-Wert, der die Länge der Nachricht angibt. Es war ein vorhersehbarer und vertrauter Prozess.

Das iPhone stellte mich jedoch vor eine völlig neue Herausforderung. Die Nachrichten wurden nicht mehr als einzelne Dateien gespeichert, sondern als Datensätze in einer Datenbank. Im Gegensatz zur Einfachheit von Mobiltelefonen war die Länge eines Nachrichtenstrings nicht durch einen eindeutigen Hex-Wert definiert. Stattdessen musste ich mich in SQLite-Datenbanken zurechtfinden und lernen, die Nutzdaten von Datensätzen zu analysieren. Hier stieß ich auf varints - Ganzzahlen mit variabler Länge-eine kompakte und effiziente Methode zur Kodierung von Daten. Das Verständnis von Varints war von entscheidender Bedeutung, als ich die Datenbankstruktur enträtselte und die wichtigsten Beweise extrahierte. In diesem Fall führte die Beherrschung von Varints zu belastenden Erkenntnissen, die letztlich dazu beitrugen, den Angeklagten wegen Brandstiftung und Mord zu verurteilen.

Varints sind eine grundlegende Komponente von SQLite-Datenbanken, die eine effiziente Kodierung von Ganzzahlen ermöglicht, die die Länge von Zellen, Datensätzen und bestimmten Feldern definieren. Für digitale Forensiker ist die Dekodierung von Varints unerlässlich, um kritische Informationen in Datenbankdateien aufzudecken. Diese kompakten Ganzzahlen spielen eine wichtige Rolle bei der Zuordnung von Tabellenstrukturen, der Identifizierung von Datensatznutzlasten und der Wiederherstellung gelöschter oder versteckter Daten.

Dieser Blog-Beitrag befasst sich mit der wichtigen Rolle, die Varints in der SQLite-Forensik spielen. Ich stelle meine VarInt-Rechnerein Tool, das ich entwickelt habe, um den Dekodierungsprozess zu vereinfachen, und das Sie durch ein Lernprogramm führt, das Ihnen hilft, dieses Wissen bei Ihren Untersuchungen anzuwenden. Vom Parsen von SQLite-Datenbankeinträgen bis zur Rekonstruktion gelöschter Datensätze ist das Verständnis von Varints eine Fähigkeit, die jeder forensische Prüfer in seinem Werkzeugkasten haben sollte.

Varints verstehen: Erkennen und Entschlüsseln von Varints

Um tiefer in SQLite und digitale Forensik eintauchen zu können, müssen Sie vor allem Folgendes verstehen ganze Zahlen mit variabler Länge (varints). Diese kompakten Zahlen sind in SQLite-Datenbanken allgegenwärtig und helfen dem System, Platz zu sparen, indem sie so wenig Bytes wie möglich zum Speichern von Werten verwenden. Aber sie können auch schwierig zu erkennen und zu entschlüsseln sein, wenn man nicht weiß, worauf man achten muss. Lassen Sie uns Schritt für Schritt vorgehen.

Was ist ein Varint?

Ein varint ist eine besondere Art, Zahlen zu speichern, wobei die Größe der Zahl bestimmt, wie viele Bytes verwendet werden. Im Gegensatz zu Ganzzahlen mit fester Länge (z.B. 4 Byte oder 8 Byte) kann ein varint so klein wie 1 Byte oder so groß wie 9 Byte sein. Diese Flexibilität macht varints platzsparend, aber auch schwieriger zu interpretieren.

Wo finden Sie Varinten?

In SQLite-Datenbanken werden Varints zur Kodierung verwendet:

  • Die Länge der Zellen oder Datensätze in einer Datenbankseite.
  • Zeilen-IDs zur eindeutigen Identifizierung von Datensätzen.
  • Die Länge der Daten in der Nutzlast eines Datensatzes.
  • Verschiedene andere Werte im Zusammenhang mit der Datenbankstruktur.

Der Schlüssel zum Lesen von Varints: Das Markierungsbit

Das erste, was Sie wissen müssen, wenn Sie einen varint lesen, ist, wie Sie seine Länge herausfinden können. Jedes Byte in einer varint hat eine Markierungsbit (das höchstwertige Bit oder MSB), das Ihnen mitteilt, ob es rechts ein weiteres Byte gibt, das zur selben Varint gehört:

  • Wenn das Markierungsbit 1 istist das nächste Byte ebenfalls Teil des varint.
  • Wenn das Markierungsbit 0 isthaben Sie das Ende der Varint erreicht.

Zwei Möglichkeiten, die Länge von Varints zu entschlüsseln

Es gibt zwei Methoden, um herauszufinden, wie lang ein varint ist: der lange Weg (mit Binärzeichen) und der einfache Weg (mit Hex-Nibble). Lassen Sie uns beide durchgehen.

Der lange Weg: Binär verwenden

    1. Beginnen Sie mit dem ersten Byte der varint.
    2. Konvertieren Sie das Byte ins Binärformat. Betrachten Sie das höchstwertige Bit (das Bit ganz links).
      • Wenn das Bit 1 ist, ist das Byte rechts davon Teil der varint.
      • Wenn das Bit 0 ist, haben Sie das Ende erreicht.
    3. Wiederholen Sie diesen Vorgang für jedes Byte, bis Sie ein Byte mit einem MSB von 0 finden.

Beispiel:

  • Byte: 0xC2 → Binär: 11000010 → MSB: 1 → Weiter.
  • Byte: 0x7F → Binär: 01111111 → MSB: 0 → Hier anhalten.

Der einfache Weg: Verwendung des linken Nibble

  1. Sehen Sie sich das linke Nibble (die erste Hex-Ziffer des Bytes) an.
  2. Wenn das linke Nibble 8 oder höher ist (8, 9, A, B, C, D, E oder F), ist das nächste Byte Teil des varint.
  3. Wenn das linke Nibble 7 oder niedriger ist (0 bis 7), haben Sie das Ende des varint erreicht.

Warum das funktioniert: Ein linkes Nibble von 8 oder mehr bedeutet, dass das MSB 1 ist, während ein linkes Nibble von 7 oder weniger bedeutet, dass das MSB 0 ist.

Beispiel:

  • Byte: 0xC2 → Linkes Nibble: C (größer als 8) → Weitermachen.
  • Byte: 0x7F → Linkes Nibble: 7 (weniger als 8) → Hier anhalten.
Der varint (rot umrandet) gibt die Länge der Nachrichtentabelle an

Unterschiede in den Zelllängen verstehen: Ein praktisches Beispiel

Varints werden in SQLite verwendet, um die Größe von Zellen auf Datenbankseiten. Diese Zellen können alles Mögliche enthalten, von Tabellen bis hin zu Tabellendatensätzen, und die ersten Bytes einer Zelle sagen uns, wie groß die Zelle ist. Dieser Längenindikator ist selbst ein varint, der zwischen 1 und 9 Byte lang sein kann.

Real-World Beispiel: WAL-Datei

In diesem Beispiel enthält die Zelle die Nachrichtentabelle. Das erste Byte der Zelle lautet 0x81, was eine Zwei-Byte-Varint anzeigt.

  • Aufschlüsselung:
    • Byte 1: 0x81 → Binär: 10000001 → Markierungsbit: 1 → Weiter.
    • Byte 2: 0x07 → Binär: 00000111 → Markierungsbit: 0 → Stop.

Dekodierenin der Varint

Nun müssen wir den varint dekodieren. Wenn wir den Wert einfach umwandeln 0x8107 in eine ganze Zahl umzuwandeln, würden wir fälschlicherweise die gewaltige Zahl 33.031 berechnen, die eindeutig nicht mit der tatsächlichen Größe der Zelle übereinstimmt.

Warum?
Die Markierungsbits tragen nicht zum eigentlichen Wert des varint bei. Um den varint richtig zu dekodieren, müssen wir die Markierungspunkte entfernen und interpretieren nur die sinnvollen Teile der binären Darstellung. So wird es gemacht:

  • Entschlüsseln:
    • Entfernen Sie die Markierungsbits: 0000001 und 0000111.
    • Kombinieren Sie die beiden Septette: 00000000 10000111 → Dezimal: 135.
  • Die Länge der Zelle beträgt 135 Bytes (ohne varint und ROWID).

Verwendung des Varint-Rechners für Effizienz

Die Varint-Rechner vereinfacht diesen Vorgang. Geben Sie den Hexadezimalwert ein (z. B. 8107), um den Varint schnell zu dekodieren. Für das obige Beispiel gibt der Rechner 135 zurück und bestätigt damit die Länge.

Umwandlung von varint 0x8107 in dezimal 135

Dekodierung von Varints in Datensatz-Kopfzeilen

In SQLite werden Datensatzköpfe mit varints definiert:

  1. Länge: Wie viele Daten zu lesen sind.
  2. Art: Wie die Daten zu interpretieren sind (Integer, String, BLOB, etc.).
Varint 0x25 in diesem Datensatzkopf gibt die Länge der Zeichenkette in der Nutzlast an

Beispiel: Länge der Zeichenkette

Dekodieren wir einen varint in einem Datensatzkopf:
  • Varint: 0x25
    • Linkes Nibble: 2 (weniger als 8) → Einzelbyte varint.
    • Dezimal: 37.
  • Nutzlast: Länge der Zeichenfolge = 12 Bytes (+97444455667).
Varint-Rechner konvertiert Varints in Strings und BLOB-Längen

Abschließende Überlegungen

Das Verstehen und Dekodieren von Varints ist eine Grundvoraussetzung für jeden digitalen Forensiker, der mit SQLite-Datenbanken arbeitet. Diese kompakten Ganzzahlen sind der Schlüssel zur Interpretation von Datenbankstrukturen, zur Bestimmung von Zellgrößen und zur effizienten Wiederherstellung von Daten.

Mit Tools wie dem Varint Calculator wird der Prozess leichter zugänglich, so dass sich Forensiker auf die Aufdeckung der in digitalen Beweisen verborgenen Wahrheit konzentrieren können. Die Beherrschung von Varints ist mehr als nur eine technische Fähigkeit - es ist eine lebenswichtige Fähigkeit, die sich direkt auf den Ausgang von Ermittlungen auswirken kann.

Sie können mehr darüber lesen und den Varint-Rechner hier herunterladen:

Facebook
Twitter
E-Mail
Drucken

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert