Johdanto
Ensimmäisen kerran kohtasin varintsin monta vuotta sitten, kun tein iPhone 3GS:n digitaalisen rikosteknisen tutkimuksen murha- ja tuhopolttotutkimuksen yhteydessä. Siihen asti rikostekninen työni oli koskenut pääasiassa puhelimia, erityisesti CDMA-laitteita, joissa oli BREW-käyttöjärjestelmä. Kukin tekstiviesti oli tallennettu omaan tiedostoonsa, jossa oli johdonmukainen offset ja viestin pituuden osoittava heksadesimaaliluku. Prosessi oli ennustettava ja tuttu.
iPhone toi minulle kuitenkin aivan uuden haasteen. Viestejä ei enää tallennettu yksittäisinä tiedostoina vaan tietokannan tietueina. Toisin kuin ominaispuhelimissa, viestijonon pituutta ei määritetty selkeällä heksan arvolla. Sen sijaan jouduin selaamaan SQLite-tietokantoja ja opettelemaan tietueiden hyötykuormien jäsentämistä. Täällä kohtasin varints-muuttujapituiset kokonaisluvut-tiivis ja tehokas tapa koodata tietoja. Varinttien ymmärtäminen oli ratkaisevan tärkeää, kun selvitin tietokannan rakennetta ja poimin keskeisiä todisteita. Tässä tapauksessa varinttien hallitseminen johti raskauttaviin löydöksiin, jotka lopulta auttoivat varmistamaan syytetyn tuomitsemisen tuhopoltosta ja murhasta.
Varintit ovat SQLite-tietokantojen peruskomponentti, joka mahdollistaa solujen, tietueiden ja tiettyjen kenttien pituuden määrittelevien kokonaislukujen tehokkaan koodauksen. Digitaalisen rikostutkinnan harjoittajille varintien purkaminen on tärkeää, jotta tietokantatiedostoista voidaan löytää kriittistä tietoa. Näillä pienillä kokonaisluvuilla on merkittävä rooli taulukkorakenteiden kartoittamisessa, tietueiden hyötykuormien tunnistamisessa ja poistettujen tai piilotettujen tietojen palauttamisessa.
Tässä blogikirjoituksessa tarkastellaan varinttien tärkeää roolia SQLite-rikostutkinnassa. Esittelen VarInt Laskin, työkalun, jonka suunnittelin yksinkertaistamaan dekoodausprosessia, ja opastamaan sinua tutoriaalin avulla, joka auttaa sinua soveltamaan tätä tietoa tutkimuksissasi. SQLite-tietokantamerkintöjen jäsentämisestä poistettujen tietueiden rekonstruointiin, varintsien ymmärtäminen on taito, joka jokaisella rikostutkijalla pitäisi olla työkalupakissaan.
Varintsin ymmärtäminen: Varintsit: Niiden havaitseminen ja purkaminen
Jos haluat syventyä SQLiteen ja digitaaliseen rikostutkintaan, yksi keskeinen taito, jota tarvitset, on seuraavien asioiden ymmärtäminen muuttuvapituiset kokonaisluvut (varints). Nämä kompaktit numerot ovat kaikkialla SQLite-tietokannoissa, ja ne auttavat järjestelmää säästämään tilaa käyttämällä mahdollisimman vähän tavuja arvojen tallentamiseen. Ne voivat kuitenkin olla myös hankalia havaita ja purkaa, jos et tiedä, mitä etsiä. Selvitetään asia vaihe vaiheelta.
Mikä on Varint?
Varint on erityinen tapa tallentaa numeroita, jossa numeron koko määrittää, kuinka monta tavua käytetään. Toisin kuin kiinteäpituiset kokonaisluvut (esim. 4 tavua tai 8 tavua), varint voi olla niinkin pieni kuin 1 tavu tai niinkin suuri kuin 9 tavua. Tämä joustavuus tekee varintteista tilatehokkaita mutta myös haastavampia tulkita.
Mistä löydät Varintsin?
SQLite-tietokannoissa varintteja käytetään koodaamiseen:
- Tietokantasivun solujen tai tietueiden pituus.
- Rivin tunnukset, jotka yksilöivät tietueet yksiselitteisesti.
- Tietueen hyötykuorman sisältämien tietojen pituus.
- Useita muita tietokannan rakenteeseen liittyviä arvoja.
Avain Varintsin lukemiseen: Marker Bit
Ensimmäinen asia, joka sinun on tiedettävä varintin lukemisen yhteydessä, on sen pituuden selvittäminen. Varintin jokaisella tavulla on merkkibitti (eniten merkitsevä bitti eli MSB), joka kertoo, onko oikealla puolella toinen tavu, joka kuuluu samaan varinttiin:
- Jos merkkibitti on 1, myös seuraava tavu on osa varintia.
- Jos merkkibitti on 0, olet saapunut varintin loppuun.
Kaksi tapaa purkaa Varintsin pituus
Varintin pituuden voi määrittää kahdella tavalla: pitkällä tavalla (binäärin avulla) ja helpolla tavalla (käyttämällä heksanibbleä). Käydään läpi molemmat.
Pitkä tie: Binary
- Aloita varintin ensimmäisestä tavusta.
- Muunna tavu binääriseksi. Katso merkitsevintä bittiä (vasemmanpuoleisin bitti).
- Jos bitti on 1, oikeanpuoleinen tavu on osa varintia.
- Jos bitti on 0, olet tullut loppuun.
- Toista tämä prosessi jokaiselle tavulle, kunnes löydät tavun, jonka MSB on 0.
Esimerkki:
- Tavu:
0xC2
→ Binary: 11000010 → MSB: 1 → Jatka. - Tavu:
0x7F
→ Binary: 01111111 → MSB: 0 → Lopeta tähän.
Helppo tapa: Vasemman nibbelin käyttäminen
- Katso vasenta nibbleä (tavun ensimmäinen heksanumero).
- Jos vasen nibble on 8 tai suurempi (8, 9, A, B, C, D, E tai F), seuraava tavu on osa varintia.
- Jos vasen nibble on 7 tai pienempi (0-7), olet saavuttanut varintin lopun.
Miksi tämä toimii: Jos vasen nibble on 8 tai enemmän, MSB on 1, kun taas jos vasen nibble on 7 tai vähemmän, MSB on 0.
Esimerkki:
- Tavu:
0xC2
→ Vasen nibble: C (suurempi kuin 8) → Jatka eteenpäin. - Tavu:
0x7F
→ Vasen nibble: 7 (alle 8) → Pysähdy tähän.

Solujen pituuksien vaihteluiden ymmärtäminen: käytännön esimerkki
Varintteja käytetään SQLite:ssä tunnistamaan koko solut tietokantasivuilla. Nämä solut voivat sisältää mitä tahansa taulukoista taulukkotietueisiin, ja solun ensimmäinen tavu(t) kertoo, kuinka suuri solu on. Tämä pituusindikaattori on itse varint, jonka pituus voi olla 1-9 tavua.
Todellisen maailman esimerkki: WAL-tiedosto
Tässä esimerkissä solu sisältää viestitaulukko. Solun ensimmäinen tavu on 0x81
, joka osoittaa kahden tavun varint.
- Hajoaminen:
- Tavu 1:
0x81
→ Binääri: 10000001 → Merkkibitti: 1 → Jatka. - Tavu 2:
0x07
→ Binääri: 00000111 → Merkkibitti: Pysäytys: 0 → Stop.
- Tavu 1:
DecodVarint
Nyt meidän on purettava varint. Jos yksinkertaisesti muunnamme arvon 0x8107
kokonaisluvuksi, laskisimme virheellisesti massiivisen, 33,031, joka ei selvästikään vastaa solun todellista kokoa.
Miksi?
Merkkibitit eivät vaikuta varintin todelliseen arvoon. Jotta voimme purkaa varintin kunnolla, meidän on poistaa merkkipalat ja tulkita vain binäärisen esityksen merkitykselliset osat. Näin se tehdään:
- Purkakaa:
- Poista merkkipalat: 0000001 ja 0000111.
- Yhdistä nämä kaksi septettiä: 00000000 10000111 → Desimaaliluku: 135.
- Solun pituus on 135 tavua (varint ja ROWID pois lukien).
Varint-laskurin käyttäminen tehokkuuden arvioimiseksi
The Varint-laskin yksinkertaistaa tätä prosessia. Kirjoita heksanarvo (esim. 8107), jotta voit nopeasti purkaa varintin. Yllä olevassa esimerkissä laskin palauttaa arvon 135, mikä vahvistaa pituuden.

Tietueiden otsikoissa olevien varinttien purkaminen
SQLitessä tietueiden otsikoissa käytetään varintteja määrittelemään:
- Pituus: Kuinka paljon tietoja luetaan.
- Tyyppi: Miten tietoja tulkitaan (kokonaisluku, merkkijono, BLOB jne.).

Esimerkki: String Length
Puretaan tietueen otsikossa oleva varint:- Varint:
0x25
- Vasen nibble: 2 (alle 8) → Yhden tavun varint.
- Desimaaliluku: 37.
- Hyötykuorma: Merkkijonon pituus = 12 tavua (+97444455667).

Loppuajatuksia
Varinttien ymmärtäminen ja purkaminen on SQLite-tietokantojen parissa työskentelevien digitaalisten rikostutkijoiden kulmakivitaito. Nämä kompaktit kokonaisluvut ovat avainasemassa tietokantarakenteiden tulkinnassa, solujen koon määrittämisessä ja tietojen tehokkaassa palauttamisessa.
Varint Calculatorin kaltaisten työkalujen avulla prosessista tulee helpommin lähestyttävä, jolloin rikostutkijat voivat keskittyä digitaalisiin todisteisiin kätketyn totuuden paljastamiseen. Varinttien hallitseminen on muutakin kuin tekninen taito - se on elintärkeä kyky, joka voi vaikuttaa suoraan tutkinnan lopputulokseen.
Voit lukea lisää ja ladata Varint-laskurin täältä: