Décodage des variantes : Une compétence essentielle dans l'analyse criminelle de SQLite

Introduction

Ma première rencontre avec les varints a eu lieu il y a de nombreuses années lors d'un examen médico-légal numérique d'un iPhone 3GS dans le cadre d'une enquête sur un meurtre et un incendie criminel. Jusqu'alors, mon travail de police scientifique concernait principalement des téléphones fonctionnels, en particulier des appareils CDMA fonctionnant sous BREW. Chaque message texte était stocké dans son propre fichier, avec un décalage cohérent et une valeur hexadécimale directe indiquant la longueur du message. Il s'agissait d'un processus prévisible et familier.

Cependant, l'iPhone m'a confronté à un tout nouveau défi. Les messages n'étaient plus stockés sous forme de fichiers individuels, mais sous forme d'enregistrements dans une base de données. Contrairement à la simplicité des téléphones fonctionnels, la longueur d'une chaîne de messages n'était pas définie par une valeur hexadécimale claire. Au lieu de cela, je me suis retrouvé à naviguer dans des bases de données SQLite et à apprendre à analyser les données utiles des enregistrements. C'est là que j'ai rencontré varints - entiers de longueur variable-une manière compacte et efficace d'encoder des données. La compréhension des varints s'est avérée cruciale lorsque j'ai démêlé la structure de la base de données et extrait des preuves essentielles. Dans ce cas, la maîtrise des varints a permis de faire des découvertes incriminantes qui ont finalement contribué à la condamnation de l'accusé pour incendie criminel et meurtre.

Les varints sont un composant fondamental des bases de données SQLite, permettant un encodage efficace des nombres entiers qui définissent la longueur des cellules, des enregistrements et des champs spécifiques. Pour les praticiens de la criminalistique numérique, le décodage des varints est essentiel pour découvrir des informations critiques dans les fichiers de base de données. Ces entiers compacts jouent un rôle important dans le mappage des structures des tables, l'identification des enregistrements et la récupération des données supprimées ou cachées.

Cet article de blog explore le rôle vital que jouent les empreintes dans l'analyse forensique de SQLite. Je présenterai mes Calculatrice VarIntJe vous propose donc de découvrir la varine, un outil que j'ai conçu pour simplifier le processus de décodage, et de vous guider à travers un tutoriel pour vous aider à appliquer ces connaissances dans vos enquêtes. De l'analyse des entrées de base de données SQLite à la reconstruction des enregistrements supprimés, la compréhension des variantes est une compétence que tout examinateur judiciaire devrait avoir dans sa boîte à outils.

Comprendre les variantes : Les repérer et les décoder

Pour approfondir la connaissance de SQLite et de la criminalistique numérique, il est indispensable de comprendre les éléments suivants les entiers de longueur variable (varints). Ces nombres compacts sont omniprésents dans les bases de données SQLite, car ils permettent au système d'économiser de l'espace en utilisant le moins d'octets possible pour stocker des valeurs. Mais ils peuvent aussi être difficiles à repérer et à décoder si vous ne savez pas ce qu'il faut faire. Voyons cela étape par étape.

Qu'est-ce qu'un Varint ?

Un varint est un moyen spécial de stocker des nombres où la taille du nombre détermine le nombre d'octets utilisés. Contrairement aux entiers de longueur fixe (par exemple, 4 octets ou 8 octets), un varint peut être aussi petit qu'un octet ou aussi grand que 9 octets. Cette flexibilité rend les varints peu encombrants, mais aussi plus difficiles à interpréter.

Où trouver les Varints ?

Dans les bases de données SQLite, les varints sont utilisés pour encoder :

  • Longueur des cellules ou des enregistrements dans une page de base de données.
  • Les ID de ligne qui identifient les enregistrements de manière unique.
  • Longueur des données contenues dans la charge utile d'un enregistrement.
  • Diverses autres valeurs liées à la structure de la base de données.

La clé de la lecture des variantes : Le bit de marquage

La première chose que vous devez savoir lorsque vous lisez un varint est comment déterminer sa longueur. Chaque octet d'une variable a une valeur bit de marquage (le bit le plus significatif, ou MSB) qui vous indique s'il y a un autre octet à droite qui fait partie de la même varint :

  • Si le bit de marquage est à 1l'octet suivant fait également partie de la variable.
  • Si le bit de marquage est à 0vous avez atteint la fin de la varint.

Deux façons de décoder la longueur d'une ligne de démarcation

Il existe deux méthodes pour déterminer la longueur d'une variable : la méthode longue (en binaire) et la méthode facile (en hexadécimale). Passons en revue les deux.

Le long chemin : L'utilisation de la méthode binaire

    1. Commencez par le premier octet de la variable.
    2. Convertissez l'octet en binaire. Regardez le bit le plus significatif (le bit le plus à gauche).
      • Si le bit est à 1, l'octet de droite fait partie de la variable.
      • Si le bit est à 0, vous avez atteint la fin.
    3. Répétez ce processus pour chaque octet jusqu'à ce que vous trouviez un octet avec un MSB de 0.

Exemple :

  • Octet : 0xC2 → Binaire : 11000010 → MSB : 1 → Continuer.
  • Octet : 0x7F → Binaire : 01111111 → MSB : 0 → Stop here.

La méthode facile : Utiliser le Nibble gauche

  1. Regardez le nibble de gauche (le premier chiffre hexadécimal de l'octet).
  2. Si l'octet de gauche est égal ou supérieur à 8 (8, 9, A, B, C, D, E ou F), l'octet suivant fait partie de la variable.
  3. Si le chiffre de gauche est égal ou inférieur à 7 (0 à 7), vous avez atteint la fin de la variable.

Pourquoi cela fonctionne-t-il ? Un nibble gauche de 8 ou plus signifie que le MSB est 1, tandis qu'un nibble gauche de 7 ou moins signifie que le MSB est 0.

Exemple :

  • Octet : 0xC2 → Grignotage à gauche : C (supérieur à 8) → Continuer.
  • Octet : 0x7F → Grignotage à gauche : 7 (moins de 8) → Arrêt ici.
La valeur varint (soulignée en rouge) identifie la longueur de la table des messages.

Comprendre les variations de longueur des cellules : un exemple pratique

Les varints sont utilisés dans SQLite pour identifier la taille des fichiers cellules sur les pages de la base de données. Ces cellules peuvent contenir n'importe quoi, des tableaux aux enregistrements de tableaux, et le(s) premier(s) octet(s) d'une cellule nous indique(nt) la taille de la cellule. Cet indicateur de longueur est lui-même un varint, dont la longueur peut varier de 1 à 9 octets.

Exemple concret : Fichier WAL

Dans cet exemple, la cellule contient le tableau des messages. Le premier octet de la cellule est 0x81indiquant un varint de deux octets.

  • Répartition :
    • Octet 1 : 0x81 → Binaire : 10000001 → Bit de marquage : 1 → Continuer.
    • Octet 2 : 0x07 → Binaire : 00000111 → Bit de marquage : 0 → Stop.

Décoderl'utilisation du Varint

Nous devons maintenant décoder la valeur varint. Si nous convertissons simplement la valeur 0x8107 à un nombre entier, nous calculerions par erreur un nombre massif, 33 031, qui ne correspond manifestement pas à la taille réelle de la cellule.

Pourquoi ?
Les bits de marquage ne contribuent pas à la valeur réelle de la variable. Pour décoder correctement le varint, nous devons dépouiller les éléments de marquage et n'interpréter que les parties significatives de la représentation binaire. Voici comment procéder :

  • Décoder :
    • Retirer les bits de marquage : 0000001 et 0000111.
    • Combinez les deux septuors : 00000000 10000111 → Décimale : 135.
  • La longueur de la cellule est de 135 octets (sans compter le varint et le ROWID).

Utilisation du calculateur Varint pour l'efficacité

Le Calculateur Varint simplifie ce processus. Entrez la valeur hexadécimale (par exemple, 8107) pour décoder rapidement la varint. Dans l'exemple ci-dessus, la calculatrice renvoie 135, ce qui confirme la longueur.

Conversion de la valeur varint 0x8107 en valeur décimale 135

Décodage des variantes dans les en-têtes d'enregistrement

Dans SQLite, les en-têtes d'enregistrement utilisent des varints pour définir :

  1. Longueur : Quantité de données à lire.
  2. Type : Comment interpréter les données (entier, chaîne, BLOB, etc.).
La valeur 0x25 dans l'en-tête de cet enregistrement indique la longueur de la chaîne dans la charge utile.

Exemple : Longueur de la chaîne

Décodons un varint dans un en-tête d'enregistrement :
  • Varint : 0x25
    • Nibble gauche : 2 (moins de 8) → Varint à un octet.
    • Décimale : 37.
  • Charge utile : Longueur de la chaîne = 12 octets (+97444455667).
La calculatrice Varint convertit les varints en chaînes de caractères et en BLOB

Réflexions finales

Comprendre et décoder les varints est une compétence essentielle pour tout enquêteur en criminalistique numérique travaillant avec des bases de données SQLite. Ces entiers compacts sont essentiels pour interpréter les structures des bases de données, déterminer la taille des cellules et récupérer efficacement les données.

Avec des outils tels que le calculateur de varints, le processus devient plus accessible, permettant aux praticiens de la police scientifique de se concentrer sur la découverte de la vérité cachée dans les preuves numériques. La maîtrise des varints est plus qu'une compétence technique, c'est une capacité vitale qui peut avoir un impact direct sur le résultat des enquêtes.

Pour en savoir plus et télécharger le calculateur Varint, cliquez ici :

Facebook
Twitter
Courriel
Imprimer

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *