Avkodning av Varints: En kritisk färdighet inom SQLite-forensik

Inledning

Mitt första möte med varints var för många år sedan under en digital kriminalteknisk undersökning av en iPhone 3GS i en mord- och mordbrandsutredning. Fram till dess hade mitt kriminaltekniska arbete främst handlat om telefoner, särskilt CDMA-enheter som körde BREW. Varje textmeddelande lagrades i en egen fil, med en konsekvent offset och ett enkelt hexvärde som angav längden på meddelandet. Det var en förutsägbar och välbekant process.

Men med iPhone fick jag en helt ny utmaning. Meddelanden lagrades inte längre som enskilda filer utan istället som poster i en databas. Till skillnad från hur enkelt det var med feature phones definierades inte längden på en meddelandesträng av ett tydligt hex-värde. Istället fick jag navigera i SQLite-databaser och lära mig att analysera nyttolaster. Det var här som jag stötte på varints-heltal med variabel längd-ett kompakt och effektivt sätt att koda data. Att förstå varints blev avgörande när jag skulle nysta upp databasstrukturen och extrahera viktiga bevis. I det här fallet ledde kunskapen om varints till komprometterande fynd som i slutändan bidrog till att den tilltalade dömdes för mordbrand och mord.

Varints är en grundläggande komponent i SQLite-databaser och möjliggör effektiv kodning av heltal som definierar längden på celler, poster och specifika fält. För digitala kriminaltekniker är avkodning av varints avgörande för att avslöja kritisk information i databasfiler. Dessa kompakta heltal spelar en viktig roll vid kartläggning av tabellstrukturer, identifiering av nyttolaster för poster och återställning av raderade eller dolda data.

Det här blogginlägget handlar om den viktiga roll som varints spelar i SQLite-forensik. Jag kommer att presentera min VarInt Kalkylator, ett verktyg som jag har utformat för att förenkla avkodningsprocessen, och vägleda dig genom en handledning som hjälper dig att tillämpa denna kunskap i dina undersökningar. Från att analysera SQLite-databasposter till att rekonstruera raderade poster är förståelse av varints en färdighet som varje kriminalteknisk undersökare bör ha i sin verktygslåda.

Förståelse av Varints: Att upptäcka och avkoda dem

Om du vill fördjupa dig i SQLite och digital kriminalteknik behöver du ha en nyckelkompetens i form av förståelse heltal med variabel längd (varints). Dessa kompakta siffror finns överallt i SQLite-databaser och hjälper systemet att spara utrymme genom att använda så få byte som möjligt för att lagra värden. Men de kan också vara knepiga att upptäcka och avkoda om du inte vet vad du ska leta efter. Låt oss bryta ner det steg för steg.

Vad är en Varint?

En varint är ett speciellt sätt att lagra tal där talets storlek avgör hur många byte som används. Till skillnad från heltal med fast längd (t.ex. 4 byte eller 8 byte) kan en varint vara så liten som 1 byte eller så stor som 9 byte. Denna flexibilitet gör varinter utrymmeseffektiva men också mer utmanande att tolka.

Var hittar Fou Varints?

I SQLite-databaser används varints för att koda:

  • Längden på celler eller poster i en databassida.
  • Rad-ID:n som identifierar poster på ett unikt sätt.
  • Längden på data inom en posts nyttolast.
  • Diverse andra värden relaterade till databasstrukturen.

Nyckeln till att läsa Varints: Markeringsbiten

Det första du behöver veta när du läser en varint är hur du räknar ut dess längd. Varje byte i en varint har en markeringsbit (den mest signifikanta biten, eller MSB) som berättar om det finns en annan byte till höger som ingår i samma varint:

  • Om markeringsbiten är 1är nästa byte också en del av varint.
  • Om markeringsbiten är 0har du kommit till slutet av varint.

Två sätt att avkoda längden på Varints

Det finns två metoder för att räkna ut hur lång en varint är: det långa sättet (med binär) och det enkla sättet (med hex-nibble). Låt oss gå igenom båda.

Den långa vägen: Att använda binära

    1. Börja med den första byten i varint.
    2. Konvertera byten till binär kod. Titta på den mest signifikanta biten (biten längst till vänster).
      • Om biten är 1 är byten till höger en del av varint.
      • Om biten är 0 har du kommit till slutet.
    3. Upprepa denna process för varje byte tills du hittar en byte med MSB 0.

Exempel:

  • Byte: 0xC2 → Binär: 11000010 → MSB: 1 → Fortsätt.
  • Byte: 0x7F → Binär: 01111111 → MSB: 0 → Stoppa här.

Det enkla sättet: Använda vänster nibble

  1. Titta på den vänstra nibblen (den första hexadecimalen i byten).
  2. Om vänster nibble är 8 eller högre (8, 9, A, B, C, D, E eller F) är nästa byte en del av varint.
  3. Om den vänstra nibblan är 7 eller lägre (0 till 7) har du nått slutet av varint.

Varför detta fungerar: En vänster nibble på 8 eller mer betyder att MSB är 1, medan en vänster nibble på 7 eller mindre betyder att MSB är 0.

Exempel:

  • Byte: 0xC2 → Vänster nibble: C (större än 8) → Fortsätt.
  • Byte: 0x7F → Vänster nibble: 7 (mindre än 8) → Stoppa här.
Varint (markerat med rött) anger längden på meddelandetabellen

Förstå variationer i cellängder: Ett praktiskt exempel

Varints används i SQLite för att identifiera storleken på celler på databassidor. Dessa celler kan innehålla allt från tabeller till tabellposter, och en cells första byte(n) talar om för oss hur stor cellen är. Denna längdindikator är i sig själv en varint, som kan variera från 1 till 9 byte i längd.

Exempel från den verkliga världen: WAL-fil

I det här exemplet innehåller cellen tabell över meddelanden. Den första byten i cellen är 0x81, vilket indikerar en varint på två byte.

  • Uppdelning:
    • Byte 1: 0x81 → Binär: 10000001 → Markeringsbit: 1 → Fortsätt.
    • Byte 2: 0x07 → Binär: 00000111 → Markeringsbit: 0 → Stopp.

Avkodningmed Varint

Nu måste vi avkoda varint. Om vi helt enkelt konverterar värdet 0x8107 till ett heltal, skulle vi felaktigt beräkna ett stort tal, 33 031, som uppenbarligen inte stämmer överens med cellens faktiska storlek.

Varför då?
Markörbitarna bidrar inte till det faktiska värdet av varint. För att avkoda varint på rätt sätt måste vi ta bort markörbitarna och tolkar endast de meningsfulla delarna av den binära representationen. Så här går det till:

  • Avkoda:
    • Ta bort markeringsbitar: 0000001 och 0000111.
    • Kombinera de två septetterna: 00000000 10000111 → Decimal: 135.
  • Cellens längd är 135 byte (exklusive varint och ROWID).

Använda Varint-kalkylatorn för effektivitet

Den Varint kalkylator förenklar denna process. Ange hex-värdet (t.ex. 8107) för att snabbt avkoda varint. För ovanstående exempel returnerar räknaren 135, vilket bekräftar längden.

Konvertering av varint 0x8107 till decimal 135

Avkodning av Varints i skivhuvuden

I SQLite används varints för att definiera posthuvuden:

  1. Längd: Hur mycket data som ska läsas.
  2. Typ: Hur man tolkar data (heltal, sträng, BLOB, etc.).
Varint 0x25 i detta posthuvud anger längden på strängen i nyttolasten

Exempel: Strängens längd

Låt oss avkoda en varint i ett posthuvud:
  • Varint: 0x25
    • Vänster nibble: 2 (mindre än 8) → Varint med en byte.
    • Decimal: 37.
  • Nyttolast: Strängens längd = 12 byte (+97444455667).
Varint calculator omvandlar varint till strängar och BLOB-längder

Avslutande tankar

Att förstå och avkoda varint är en hörnsten för alla digitala kriminaltekniker som arbetar med SQLite-databaser. Dessa kompakta heltal är nyckeln till att tolka databasstrukturer, bestämma cellstorlekar och återställa data på ett effektivt sätt.

Med verktyg som Varint Calculator blir processen mer tillgänglig, vilket gör att kriminaltekniker kan fokusera på att avslöja sanningen som döljs i digitala bevis. Att behärska varints är mer än en teknisk färdighet - det är en viktig förmåga som direkt kan påverka resultatet av utredningar.

Du kan läsa mer och ladda ner Varint Calculator här:

Facebook
Twitter
E-post
Skriv ut

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *