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