Introduzione
Il mio primo incontro con varints risale a molti anni fa, durante l'esame forense digitale di un iPhone 3GS nell'ambito di un'indagine per omicidio e incendio doloso. Fino ad allora, il mio lavoro forense aveva riguardato principalmente i telefoni cellulari, in particolare i dispositivi CDMA con sistema BREW. Ogni messaggio di testo veniva memorizzato in un proprio file, con un offset coerente e un semplice valore esadecimale che indicava la lunghezza del messaggio. Era un processo prevedibile e familiare.
Tuttavia, l'iPhone mi ha posto di fronte a una sfida completamente nuova. I messaggi non erano più memorizzati come singoli file, ma come record all'interno di un database. A differenza della semplicità dei telefoni cellulari, la lunghezza di una stringa di messaggio non era definita da un chiaro valore esadecimale. Al contrario, mi sono trovato a navigare nei database SQLite e a imparare ad analizzare i payload dei record. È stato qui che ho incontrato varints-lunghezza variabile degli interi-un modo compatto ed efficiente di codificare i dati. La comprensione dei varanti si è rivelata cruciale nel dipanare la struttura del database e nell'estrarre le prove chiave. In questo caso, la padronanza dei varint ha portato a scoperte incriminanti che hanno contribuito alla condanna dell'imputato per incendio doloso e omicidio.
I varanti sono un componente fondamentale dei database SQLite e consentono una codifica efficiente dei numeri interi che definiscono la lunghezza di celle, record e campi specifici. Per chi si occupa di digital forensics, la decodifica dei varint è essenziale per scoprire informazioni critiche all'interno dei file di database. Questi numeri interi compatti svolgono un ruolo importante nella mappatura delle strutture delle tabelle, nell'identificazione dei payload dei record e nel recupero di dati cancellati o nascosti.
Questo post esplora il ruolo fondamentale dei varanti nella forensics di SQLite. Presenterò il mio Calcolatrice VarInt, uno strumento che ho progettato per semplificare il processo di decodifica, e vi guiderà attraverso un tutorial per aiutarvi ad applicare queste conoscenze nelle vostre indagini. Dall'analisi delle voci di database SQLite alla ricostruzione dei record cancellati, la comprensione dei varanti è un'abilità che ogni esaminatore forense dovrebbe avere nel proprio kit di strumenti.
Capire le varanti: Individuarli e decodificarli
Per approfondire la conoscenza di SQLite e della digital forensics, una competenza chiave è la comprensione di interi di lunghezza variabile (varint). Questi numeri compatti sono presenti ovunque nei database SQLite e aiutano il sistema a risparmiare spazio utilizzando il minor numero possibile di byte per memorizzare i valori. Ma possono anche essere difficili da individuare e decodificare se non si sa cosa cercare. Vediamo come procedere passo dopo passo.
Che cos'è un Varint?
Un varint è un modo speciale di memorizzare i numeri in cui la dimensione del numero determina il numero di byte utilizzati. A differenza degli interi a lunghezza fissa (ad esempio, 4 o 8 byte), un varint può essere piccolo come 1 byte o grande come 9 byte. Questa flessibilità rende i varint efficienti dal punto di vista dello spazio, ma anche più difficili da interpretare.
Dove si trovano i Varint?
Nei database SQLite, i varanti vengono utilizzati per codificare:
- La lunghezza delle celle o dei record di una pagina del database.
- ID di riga che identificano in modo univoco i record.
- La lunghezza dei dati all'interno del payload di un record.
- Vari altri valori relativi alla struttura del database.
La chiave di lettura dei varanti: Il bit del marcatore
La prima cosa da sapere quando si legge una varint è come capire la sua lunghezza. Ogni byte di una varint ha un valore bit di marcatura (il bit più significativo, o MSB) che indica se c'è un altro byte a destra che fa parte della stessa varint:
- Se il bit del marcatore è 1, anche il byte successivo fa parte della varint.
- Se il bit del marcatore è 0, si è arrivati alla fine della varint.
Due modi per decodificare la lunghezza dei varanti
Esistono due metodi per capire quanto è lunga una varint: il metodo lungo (usando il binario) e il metodo semplice (usando il nibble esadecimale). Analizziamo entrambi.
La strada lunga: Usare il sistema binario
- Inizia con il primo byte della varint.
- Convertire il byte in binario. Osservate il bit più significativo (quello più a sinistra).
- Se il bit è 1, il byte a destra fa parte della varint.
- Se il bit è 0, si è arrivati alla fine.
- Ripetete questo procedimento per ogni byte fino a trovare un byte con un MSB pari a 0.
Esempio:
- Byte:
0xC2
→ Binario: 11000010 → MSB: 1 → Continua. - Byte:
0x7F
→ Binario: 01111111 → MSB: 0 → Fermarsi qui.
Il modo più semplice: Usare il nibble sinistro
- Guardate il nibble di sinistra (la prima cifra esadecimale del byte).
- Se il nibble sinistro è 8 o superiore (8, 9, A, B, C, D, E o F), il byte successivo fa parte della varint.
- Se il nibble sinistro è 7 o inferiore (da 0 a 7), si è raggiunta la fine della varint.
Perché funziona: Un nibble di sinistra pari o superiore a 8 significa che l'MSB è 1, mentre un nibble di sinistra pari o inferiore a 7 significa che l'MSB è 0.
Esempio:
- Byte:
0xC2
→ Nibble sinistro: C (maggiore di 8) → Continua. - Byte:
0x7F
→ Nibble sinistro: 7 (meno di 8) → Fermarsi qui.

Comprendere le variazioni di lunghezza delle cellule: un esempio pratico
I varanti sono utilizzati in SQLite per identificare la dimensione di un oggetto. celle nelle pagine del database. Queste celle possono contenere qualsiasi cosa, da tabelle a record di tabelle, e il primo byte di una cella ci dice quanto è grande la cella. Questo indicatore di lunghezza è a sua volta una varint, la cui lunghezza può variare da 1 a 9 byte.
Esempio del mondo reale: File WAL
In questo esempio, la cella contiene l'elemento tabella dei messaggi. Il primo byte della cella è 0x81
, che indica una varint a due byte.
- Ripartizione:
- Byte 1:
0x81
→ Binario: 10000001 → Bit di marcatura: 1 → Continua. - Byte 2:
0x07
→ Binario: 00000111 → Bit di marcatura: 0 → Stop.
- Byte 1:
Decodificareil Varint
Ora dobbiamo decodificare la varint. Se convertiamo semplicemente il valore 0x8107
a un numero intero, calcoleremmo erroneamente un numero enorme, 33.031, che chiaramente non corrisponde alla dimensione reale della cella.
Perché?
I bit di marcatura non contribuiscono al valore effettivo della varint. Per decodificare correttamente il varint, occorre spogliare i bit di marcatura e interpretare solo le porzioni significative della rappresentazione binaria. Ecco come si fa:
- Decodificare:
- Rimuovere i bit di marcatura: 0000001 e 0000111.
- Unire i due settenari: 00000000 10000111 → Decimale: 135.
- La lunghezza della cella è di 135 byte (esclusi varint e ROWID).
Utilizzo del calcolatore Varint per l'efficienza
Il Calcolatrice Varint semplifica questo processo. Inserire il valore esadecimale (ad esempio, 8107) per decodificare rapidamente la varint. Nell'esempio precedente, la calcolatrice restituisce 135, confermando la lunghezza.

Decodifica dei varanti nelle intestazioni dei dischi
In SQLite, le intestazioni dei record utilizzano i varanti per definire:
- Lunghezza: Quanti dati leggere.
- Tipo: Come interpretare i dati (interi, stringhe, BLOB, ecc.).

Esempio: Lunghezza della stringa
Decodifichiamo una varint nell'intestazione di un record:- Varint:
0x25
- Nibble sinistro: 2 (meno di 8) → Varint a singolo byte.
- Decimale: 37.
- Carico utile: Lunghezza della stringa = 12 byte (+97444455667).

Pensieri conclusivi
La comprensione e la decodifica dei varanti è un'abilità fondamentale per qualsiasi investigatore forense digitale che lavori con i database SQLite. Questi numeri interi compatti sono fondamentali per interpretare le strutture dei database, determinare le dimensioni delle celle e recuperare i dati in modo efficiente.
Con strumenti come il Varint Calculator, il processo diventa più accessibile, consentendo agli operatori forensi di concentrarsi sulla scoperta della verità nascosta nelle prove digitali. La padronanza dei varanti è più di un'abilità tecnica: è una capacità vitale che può avere un impatto diretto sull'esito delle indagini.
Per saperne di più e scaricare il calcolatore Varint, cliccate qui: