Wiederherstellung gelöschter SQLite Datenbanken Einträge

Transcription

Wiederherstellung gelöschter SQLite Datenbanken Einträge
Diplom-Ingenieur (BA) für Informationstechnik Ronny Bodach
©2011 Eyewitness Forensic Software
SQLITE 3 Datenbanken erkennt man an der Header-Signatur:
SQLITE 3 Datenbanken speichern ihre Einträge ähnlich einem
Dateisystem in Blöcken, sogenannten Pages, mit einer in der
Datenbank eingestellten variablen Größe ab.
Die Page Größe variiert zwischen 512 und 32768 Bytes und befindet
sich an Offset 16 der Datenbankdatei als 2 Byte BE Integer (der Eintrag 1
entspricht einer Größe von 65536 Bytes) .
2 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
In Offset 52 der Datenbankdatei wird festgelegt ob es sich um eine
AutoVacuum Datenbank oder eine mit wachsender Größe handelt.
AutoVacuum Datenbanken reorganisieren sich wenn Daten/Records
gelöscht werden neu. In AutoVacuum Datenbanken lassen sich
gelöschte Records nicht wiederherstellen.
AutoVacuum Datenbanken beinhalten in Offset 52 vier Non-Zero Byte.
Datenbanken in denen gelöschte Records wiederhergestellt werden
können beinhalten in Offset 52 vier Zero Byte.
3 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
SQLITE 3 Datenbanken speichern gelöschte Records in sogenannten
Free Pages.
In Offset 32 der Datenbank ist die erste Sprungadresse der
sogenannten Freelist Page hinterlegt.
Folgende Formel kann benutzt werden um die Sprungadresse zu
ermitteln:
Sprungadresse = (4 Byte BE in Offset 32 – 1) * Pagesize
Sprungadresse hex = ( 0x4A - 1 ) * 0x1000 = 0x49000
Sprungadresse dec = ( 74 - 1 ) * 4096 = 299008
4 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Die Free List Pages speichern die freien Pages, welche für ein
Neubeschreiben verwendet werden und in denen aber auch bereits
gelöschte Daten enthalten sein können.
Die ersten 4 Byte BE verweisen auf eine weitere Free List Page oder
sind andernfalls Zero.
Die darauffolgenden 4 Byte stellen die Anzahl der folgenden
Listeneinträge dar.
5 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Die darauffolgende Liste beinhaltet jeweils die Freepages als 4 Byte
Eintragungen die um 1 subtrahiert mit der Pagesize multipliziert den
Offset der gelöschten freien Page vom Beginn der Datenbank aus
ergeben.
Offset
= (0x50-1)*0x1000
= 0x4F000
Offset
= (0x43-1)*0x1000
= 0x42000
6 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Eine der gelöschten Freepages mit gelöschten Records Einträgen
einer Mozilla Firefox moz_places Tabelle:
Offset= (0x50-1)*0x1000= 0x4F000
7 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Eine der gelöschten Freepages mit gelöschten Records Einträgen
einer weiteren Mozilla Firefox moz_places Tabelle:
Offset= (0x43-1)*0x1000= 0x42000
8 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Eine Page einer SQLite Datenbank ist als B-Baum ausgeführt und besteht aus
einem Header einem Cell Pointer Array und den Cell Einträgen:
In Offset 1 charakterisiert 0x0A eine Indexpage und 0x0D eine Datenpage
In Offset 4+5 ist die Anzahl der folgenden Cellpointer angegeben
Ab Offset 9 stehen 2 Byte Cellpointer die je Cellpointer den Offset der Cell zum
Page Anfang darstellen
9 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Eine Record Cell ist nach folgendem Schema aufgebaut:
Die Berechnungsformel für einen VarInt (Variant) ist dabei wie folgt
anzuwenden: Wert = (Byte Offset 1 -128) x 128 + Byte Offset 2
10 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Ein Payload Header ist nach folgendem Schema aufgebaut:
0x00 NULL (ROWID – Primary Key)
0x47 String Länge 29 Bytes (URL)
0x810B String Länge 63 Bytes (Titel)
0x39 String Länge 22 Bytes (reverse
URL)
0x01 Int16
0x01 Int16
0x01 Int16
0x01 Int16
0x01 Int16
0x06 Int64 (Datum Unix Epoche)
Die Länge der gespeicherten Informationen ist dabei entweder durch den Typ
vorgegeben oder wird durch einen VarInt dargestellt.
11 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Der damit entschlüsselte Dateninhalt einer FFX3 moz_places Zeile:
0x00 NULL (ROWID – Primary Key)
0x47 String Länge 29 Bytes (URL)
0x810B String Länge 63 Bytes (Titel)
0x39 String Länge 22 Bytes (reverse
URL)
0x01 Int16
0x01 Int16
0x01 Int16
0x01 Int16
0x01 Int16
0x06 Int64 (Datum Unix Epoche)
12 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
Derzeit existiert nur eine Forensic Software am Markt, welche in der
Lage ist, gelöschte SQLite Datenbank Records wiederherzustellen.
www.ccl-forensics.com
13 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
In Entwicklung befindet sich noch ein SQLite Recovering Tool von
Eyewitness Forensic Software – SQLite recover deleted records
14 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
An analysis of the record structure within SQLite databases

forensicsfromthesausagefactory.blogspot.com/2011/05/analysis-of-record-structure-within.html
Carving SQLite databases from unallocated clusters

forensicsfromthesausagefactory.blogspot.com/2011/04/carving-sqlite-databases-from.html
SQLite Pointer Maps pages

forensicsfromthesausagefactory.blogspot.com/2011/05/sqlite-pointer-maps-pages.html
SQLite Database File Format

www.sqlite.org/fileformat.html
The SQLite Database File Format

www.sqlite.org/fileformat2.html
Firefox History Report

www.tatortgruppe.de/fx3r.shtml
Firefoxforensics Firefox Research

www.firefoxforensics.com/research/index.shtml
15 | 10. Juni 2011 | Dipl.-Ing. (BA) für Informationstechnik Ronny Bodach
15