Innledning
Mitt første møte med varints var for mange år siden, da jeg foretok en digital kriminalteknisk undersøkelse av en iPhone 3GS i forbindelse med etterforskningen av et mord og en mordbrann. Frem til da hadde jeg først og fremst jobbet med kriminalteknikk på telefoner, særlig CDMA-enheter med BREW. Hver tekstmelding ble lagret i sin egen fil, med en konsekvent offset og en enkel hex-verdi som angav lengden på meldingen. Det var en forutsigbar og velkjent prosess.
Men med iPhone fikk jeg en helt ny utfordring. Meldinger ble ikke lenger lagret som individuelle filer, men i stedet som poster i en database. I motsetning til på enkle telefoner var ikke lengden på en meldingsstreng definert av en tydelig hex-verdi. I stedet måtte jeg navigere i SQLite-databaser og lære meg å analysere nyttelastene. Det var her jeg oppdaget varints-variabel-lengde heltall-En kompakt og effektiv måte å kode data på. Forståelsen av varints ble avgjørende da jeg skulle nøste opp databasestrukturen og hente ut nøkkelbevis. I dette tilfellet førte beherskelsen av varints til belastende funn som til slutt bidro til at den tiltalte ble dømt for mordbrann og drap.
Varints er en grunnleggende komponent i SQLite-databaser, som muliggjør effektiv koding av heltall som definerer lengden på celler, poster og spesifikke felt. For digital kriminalteknikk er dekoding av varints avgjørende for å avdekke kritisk informasjon i databasefiler. Disse kompakte heltallene spiller en viktig rolle når det gjelder å kartlegge tabellstrukturer, identifisere nyttelast på poster og gjenopprette slettede eller skjulte data.
Dette blogginnlegget tar for seg den viktige rollen varints spiller i SQLite-etterforskning. Jeg vil introdusere min VarInt KalkulatorJeg har utviklet et verktøy som forenkler avkodingsprosessen, og gir deg en veiledning som hjelper deg med å bruke denne kunnskapen i etterforskningen din. Fra å analysere SQLite-databaseoppføringer til å rekonstruere slettede poster - å forstå varints er en ferdighet alle kriminalteknikere bør ha i verktøykassen sin.
Forstå varinter: Å oppdage og avkode dem
For å dykke dypere ned i SQLite og digital etterforskning er det viktig at du forstår heltall med variabel lengde (varints). Disse kompakte tallene finnes overalt i SQLite-databaser, og hjelper systemet med å spare plass ved å bruke så få byte som mulig til å lagre verdier. Men de kan også være vanskelige å oppdage og dekode hvis du ikke vet hva du skal se etter. La oss gå gjennom det steg for steg.
Hva er en Varint?
En varint er en spesiell måte å lagre tall på, der tallets størrelse avgjør hvor mange byte som brukes. I motsetning til heltall med fast lengde (f.eks. 4 byte eller 8 byte), kan en varint være så liten som 1 byte eller så stor som 9 byte. Denne fleksibiliteten gjør varinter plasseffektive, men også mer utfordrende å tolke.
Hvor vil Fou finne Varints?
I SQLite-databaser brukes varints til å kode:
- Lengden på celler eller poster på en databaseside.
- Rad-ID-er som identifiserer poster på en unik måte.
- Lengden på dataene i en posts nyttelast.
- Diverse andre verdier knyttet til databasestrukturen.
Nøkkelen til å lese Varints: Markørbiten
Det første du trenger å vite når du leser en varint, er hvordan du finner ut lengden. Hver byte i en varint har en markørbit (den mest signifikante biten, eller MSB) som forteller deg om det finnes en annen byte til høyre som er en del av den samme varinten:
- Hvis markørbiten er 1er neste byte også en del av varint.
- Hvis markørbiten er 0har du kommet til slutten av varint.
To måter å dekode lengden på varinter
Det finnes to metoder for å finne ut hvor lang en varint er: den lange måten (ved hjelp av binær) og den enkle måten (ved hjelp av hex-nibble). La oss gå gjennom begge.
Den lange veien: Bruk av binære
- Start med den første byten i varint.
- Konverter byten til binær. Se på den mest signifikante biten (biten lengst til venstre).
- Hvis biten er 1, er byten til høyre en del av varint.
- Hvis biten er 0, er du kommet til slutten.
- Gjenta denne prosessen for hver byte til du finner en byte med MSB 0.
Eksempel:
- Byte:
0xC2
→ Binær: 11000010 → MSB: 1 → Fortsett. - Byte:
0x7F
→ Binær: 01111111 → MSB: 0 → Stopp her.
Den enkle måten: Bruk av venstre nibble
- Se på venstre nibble (det første hex-sifret i byten).
- Hvis venstre nibble er 8 eller høyere (8, 9, A, B, C, D, E eller F), er den neste byten en del av varint.
- Hvis venstre nibble er 7 eller lavere (0 til 7), har du nådd slutten av varinten.
Hvorfor dette fungerer: En venstre nibble på 8 eller mer betyr at MSB er 1, mens en venstre nibble på 7 eller mindre betyr at MSB er 0.
Eksempel:
- Byte:
0xC2
→ Venstre nibble: C (større enn 8) → Fortsett. - Byte:
0x7F
→ Venstre nibble: 7 (mindre enn 8) → Stopp her.

Forstå variasjoner i cellelengder: Et praktisk eksempel
Varints brukes i SQLite til å identifisere størrelsen på celler på databasesider. Disse cellene kan inneholde alt fra tabeller til tabellposter, og cellens første byte(r) forteller oss hvor stor cellen er. Denne lengdeindikatoren er i seg selv en varint, som kan variere fra 1 til 9 byte i lengde.
Eksempel fra den virkelige verden: WAL-fil
I dette eksempelet inneholder cellen meldingstabell. Den første byten i cellen er 0x81
, som indikerer en to-byte varint.
- Sammenbrudd:
- Byte 1:
0x81
→ Binær: 10000001 → Markeringsbit: 1 → Fortsett. - Byte 2:
0x07
→ Binær: 00000111 → Markeringsbit: 0 → Stopp.
- Byte 1:
Dekodmed Varint
Nå må vi dekode varint. Hvis vi bare konverterer verdien 0x8107
til et heltall, ville vi feilaktig beregnet et enormt tall, 33 031, som åpenbart ikke stemmer overens med cellens faktiske størrelse.
Hvorfor det?
Markørbitene bidrar ikke til den faktiske verdien av varint. For å dekode varint på riktig måte må vi fjerne markørbitene og tolker bare de meningsfulle delene av den binære representasjonen. Slik gjør du det:
- Avkod:
- Fjern markørbiter: 0000001 og 0000111.
- Slå sammen de to septettene: 00000000 10000111 → Desimal: 135.
- Cellens lengde er 135 byte (unntatt varint og ROWID).
Bruk Varint-kalkulatoren for effektivitet
Den Varint Kalkulator forenkler denne prosessen. Skriv inn hex-verdien (f.eks. 8107) for å raskt dekode varint. I eksempelet ovenfor returnerer kalkulatoren 135, noe som bekrefter lengden.

Avkoding av Varints i Record Headers
I SQLite brukes varints til å definere record-header:
- Lengde: Hvor mye data som skal leses.
- Type: Hvordan dataene skal tolkes (heltall, streng, BLOB osv.).

Eksempel: Lengde på streng
La oss dekode en varint i en record header:- Varint:
0x25
- Venstre nibble: 2 (mindre enn 8) → Single-byte varint.
- Desimal: 37.
- Nyttelast: Strengens lengde = 12 byte (+97444455667).

Avsluttende tanker
Å forstå og dekode varinter er en hjørnesteinsferdighet for enhver digital kriminaltekniker som jobber med SQLite-databaser. Disse kompakte heltallene er nøkkelen til å tolke databasestrukturer, bestemme cellestørrelser og gjenopprette data på en effektiv måte.
Med verktøy som Varint Calculator blir prosessen mer tilgjengelig, slik at kriminalteknikere kan fokusere på å avdekke sannheten som skjuler seg i digitale bevis. Å beherske varints er mer enn en teknisk ferdighet - det er en viktig evne som kan ha direkte innvirkning på utfallet av etterforskningen.
Du kan lese mer og laste ned Varint Calculator her: