Wprowadzenie
Moje pierwsze spotkanie z varints miało miejsce wiele lat temu podczas cyfrowego badania kryminalistycznego iPhone'a 3GS w śledztwie dotyczącym morderstwa i podpalenia. Do tego czasu moja praca kryminalistyczna dotyczyła głównie telefonów z funkcjami, w szczególności urządzeń CDMA z systemem BREW. Każda wiadomość tekstowa była przechowywana we własnym pliku, ze spójnym przesunięciem i prostą wartością szesnastkową wskazującą długość wiadomości. Był to przewidywalny i znajomy proces.
Jednak iPhone postawił mnie przed zupełnie nowym wyzwaniem. Wiadomości nie były już przechowywane jako pojedyncze pliki, ale jako rekordy w bazie danych. W przeciwieństwie do prostoty telefonów z funkcjami, długość ciągu wiadomości nie była definiowana przez wyraźną wartość szesnastkową. Zamiast tego musiałem poruszać się po bazach danych SQLite i nauczyć się analizować ładunki rekordów. To właśnie tutaj natknąłem się na varints - liczby całkowite o zmiennej długości-kompaktowy i wydajny sposób kodowania danych. Zrozumienie varintów stało się kluczowe, gdy rozwikłałem strukturę bazy danych i wydobyłem kluczowe dowody. W tym przypadku opanowanie varintów doprowadziło do obciążających ustaleń, które ostatecznie pomogły w skazaniu oskarżonego za podpalenie i morderstwo.
Varinty są podstawowym składnikiem baz danych SQLite, umożliwiającym wydajne kodowanie liczb całkowitych, które definiują długość komórek, rekordów i określonych pól. Dla praktyków kryminalistyki cyfrowej dekodowanie varintów jest niezbędne do odkrywania krytycznych informacji w plikach baz danych. Te kompaktowe liczby całkowite odgrywają znaczącą rolę w mapowaniu struktur tabel, identyfikowaniu ładunków rekordów i odzyskiwaniu usuniętych lub ukrytych danych.
Ten wpis na blogu omawia istotną rolę, jaką odgrywają varinty w kryminalistyce SQLite. Przedstawię moje Kalkulator VarIntNarzędzie, które zaprojektowałem, aby uprościć proces dekodowania i poprowadzić cię przez samouczek, który pomoże ci zastosować tę wiedzę w twoich dochodzeniach. Od analizowania wpisów bazy danych SQLite po rekonstrukcję usuniętych rekordów, zrozumienie varintów jest umiejętnością, którą każdy śledczy powinien mieć w swoim zestawie narzędzi.
Zrozumienie warintów: Ich wykrywanie i dekodowanie
Aby zagłębić się w SQLite i kryminalistykę cyfrową, jedną z kluczowych umiejętności, których będziesz potrzebować, jest zrozumienie liczby całkowite o zmiennej długości (varints). Te kompaktowe liczby są wszędzie w bazach danych SQLite, pomagając systemowi zaoszczędzić miejsce, wykorzystując jak najmniej bajtów do przechowywania wartości. Ale mogą być również trudne do wykrycia i zdekodowania, jeśli nie wiesz, czego szukać. Przeanalizujmy to krok po kroku.
Co to jest Varint?
Liczba varint to specjalny sposób przechowywania liczb, w którym rozmiar liczby określa liczbę używanych bajtów. W przeciwieństwie do liczb całkowitych o stałej długości (np. 4 bajty lub 8 bajtów), varint może być tak mały jak 1 bajt lub tak duży jak 9 bajtów. Ta elastyczność sprawia, że varinty zajmują mniej miejsca, ale są też trudniejsze w interpretacji.
Gdzie można znaleźć Varints?
W bazach danych SQLite do kodowania używane są varinty:
- Długość komórek lub rekordów na stronie bazy danych.
- Identyfikatory wierszy, które jednoznacznie identyfikują rekordy.
- Długość danych w ładunku rekordu.
- Różne inne wartości związane ze strukturą bazy danych.
Klucz do czytania warintów: Marker Bit
Pierwszą rzeczą, którą należy wiedzieć podczas odczytu zmiennej varint, jest określenie jej długości. Każdy bajt w varincie ma wartość bit znacznika (najbardziej znaczący bit lub MSB), który informuje, czy istnieje inny bajt po prawej stronie, który jest częścią tej samej zmiennej:
- Jeśli bit znacznika ma wartość 1następny bajt jest również częścią varint.
- Jeśli bit znacznika ma wartość 0, dotarłeś do końca varint.
Dwa sposoby dekodowania długości warintów
Istnieją dwie metody ustalania długości zmiennej varint: długi sposób (przy użyciu binarnego) i łatwy sposób (przy użyciu nibble hex). Omówmy obie metody.
Długa droga: Korzystanie z Binary
- Rozpocznij od pierwszego bajtu zmiennej varint.
- Przekształć bajt na liczbę binarną. Spójrz na najbardziej znaczący bit (najbardziej wysunięty na lewo).
- Jeśli bit ma wartość 1, bajt po prawej stronie jest częścią zmiennej varint.
- Jeśli bit ma wartość 0, oznacza to, że osiągnięto koniec.
- Powtarzaj ten proces dla każdego bajtu, aż znajdziesz bajt z MSB równym 0.
Przykład:
- Bajt:
0xC2
→ Binarny: 11000010 → MSB: 1 → Kontynuuj. - Bajt:
0x7F
→ Binarne: 01111111 → MSB: 0 → Zatrzymaj tutaj.
Prosty sposób: Korzystanie z Left Nibble
- Spójrz na lewy nibble (pierwsza cyfra szesnastkowa bajtu).
- Jeśli lewy nibble ma wartość 8 lub wyższą (8, 9, A, B, C, D, E lub F), następny bajt jest częścią varint.
- Jeśli lewy nibble ma wartość 7 lub niższą (od 0 do 7), oznacza to, że osiągnięto koniec zmiennej varint.
Dlaczego to działa: Lewy nibble równy 8 lub więcej oznacza, że MSB wynosi 1, podczas gdy lewy nibble równy 7 lub mniej oznacza, że MSB wynosi 0.
Przykład:
- Bajt:
0xC2
→ Lewy nibble: C (więcej niż 8) → Kontynuuj. - Bajt:
0x7F
→ Lewy nibble: 7 (mniej niż 8) → Zatrzymaj się tutaj.

Zrozumienie zmienności długości komórek: praktyczny przykład
Zmienne są używane w SQLite do identyfikowania rozmiaru komórki na stronach bazy danych. Komórki te mogą zawierać wszystko, od tabel po rekordy tabel, a pierwszy bajt (bajty) komórki mówi nam, jak duża jest komórka. Ten wskaźnik długości jest sam w sobie zmienną, która może mieć długość od 1 do 9 bajtów.
Przykład ze świata rzeczywistego: Plik WAL
W tym przykładzie komórka zawiera tabela komunikatów. Pierwszy bajt komórki to 0x81
wskazując dwubajtowy varint.
- Podział:
- Bajt 1:
0x81
→ Binarnie: 10000001 → Bit znacznika: 1 → Kontynuuj. - Bajt 2:
0x07
→ Binarny: 00000111 → Bit znacznika: 0 → Stop.
- Bajt 1:
Dekodw Varint
Teraz musimy zdekodować varint. Jeśli po prostu przekonwertujemy wartość 0x8107
na liczbę całkowitą, omyłkowo obliczylibyśmy ogromną liczbę 33,031, która wyraźnie nie odpowiada rzeczywistemu rozmiarowi komórki.
Dlaczego?
Bity znacznika nie mają wpływu na rzeczywistą wartość varint. Aby poprawnie zdekodować varint, musimy usuwanie znaczników i interpretować tylko znaczące części reprezentacji binarnej. Oto jak to się robi:
- Decode:
- Usuń bity znaczników: 0000001 i 0000111.
- Połącz dwa septety: 00000000 10000111 → dziesiętny: 135.
- Długość komórki wynosi 135 bajtów (z wyłączeniem varint i ROWID).
Korzystanie z kalkulatora Varint dla wydajności
The Kalkulator Varint upraszcza ten proces. Wprowadź wartość szesnastkową (np. 8107), aby szybko zdekodować varint. W powyższym przykładzie kalkulator zwróci 135, potwierdzając długość.

Dekodowanie zmiennych w nagłówkach rekordów
W SQLite nagłówki rekordów używają zmiennych do definiowania:
- Długość: Ile danych należy odczytać.
- Typ: Sposób interpretacji danych (liczba całkowita, ciąg znaków, BLOB itp.).

Przykład: Długość łańcucha
Rozszyfrujmy varint w nagłówku rekordu:- Varint:
0x25
- Lewy nibble: 2 (mniej niż 8) → Jednobajtowy varint.
- Po przecinku: 37.
- Ładunek: Długość ciągu = 12 bajtów (+97444455667).

Przemyślenia końcowe
Zrozumienie i dekodowanie zmiennych jest podstawową umiejętnością dla każdego cyfrowego śledczego pracującego z bazami danych SQLite. Te kompaktowe liczby całkowite są kluczem do interpretowania struktur baz danych, określania rozmiarów komórek i skutecznego odzyskiwania danych.
Dzięki narzędziom takim jak Varint Calculator, proces ten staje się bardziej dostępny, pozwalając specjalistom medycyny sądowej skupić się na odkrywaniu prawdy ukrytej w dowodach cyfrowych. Opanowanie warintów to coś więcej niż umiejętność techniczna - to istotna zdolność, która może bezpośrednio wpłynąć na wynik dochodzenia.
Więcej informacji i kalkulator Varint można pobrać tutaj: