Serie de artículos escritos por @nicky69es sobre la recuperación de datos en SQLite. El primero será una introducción al respecto e irá entrando en materia en los sucesivos posts.
Es fácil entender la forma en la que se obtienen los datos, disponibles y borrados, de una base de datos SQLite si previamente entiendes cómo funciona el sistema de archivos FAT, es bastante similar.
La forma más rápida de obtener los datos de estas bases de datos es el uso del comando “strings” de linux, ya que normalmente no se encuentran cifradas. Salvo la base de datos de whatsapp en los sistemas android, siendo esta esta es descifrable y tendríamos el mismo escenario. El problema es que se obtendrá todo el texto, con sentido, pero sin saber de dónde viene ni por qué. Utilizar programas automáticos de extracción de datos está bien, pero suelen estar limitados a los datos marcados como disponibles que no han sido sobre-escritos, quedándonos con un mínimo de datos que se puedan obtener.
Como todo, el esfuerzo en obtener los datos es directamente proporcional a la importancia de obtenerlos. Al menos que este manual sirva para entender de dónde vienen, y para tener la posibilidad de realizar carving¹ sobre estas bases de datos tan extendidas en las apps de smartphones y tablets.
Los archivos SQLite, constan de una cabecera con su firma (como casi todos los archivos) y a continuación una serie de “páginas” donde se guarda la información (similares a los cluster), contiene una serie de páginas llamadas “freelist” que son páginas libres para escribir datos y que guardan la información de las siguientes páginas libres en cadena unas a otras. Habiendo unas páginas tronco que contienen las direcciones de otras páginas tronco y otras páginas llamadas “hojas”.
Hay que tener en cuenta que al igual que el sistema FAT, las zonas que se marcan como disponibles se rellenan con datos según se reciban. Es por ello que los datos que recuperemos no serán muy lejanos en el tiempo y que en algunas ocasiones solamente recuperemos partes de los datos.
Y como los más modernos sistemas de ficheros, contamos (si se encuentra activada la opción) con una copia de la base de datos para restauración en caso de necesidad. Este archivo tiene como nombre el mismo que el original, añadiendo al final el indicador “-wal”. En el se presume exista una copia anterior a la que está en uso. Esta copia no está activada en whatsapp.
Cada tabla en la bbdd es representada por un “table b-tree page” y cada índice en la tabla es representada por un “index b-tree page”. Index b-tree page x02 y interior table b-tree page x05 no son relevantes para el carving.
x0A index leaf b-tree page
x02 index b-tree page, payload es la key
x05 interior table b-tree page, payload no es payload, claves y punteros, (root)
x0D leaf table b-tree page, payload es el contenido, punteros y contenido
Autor: @Nicky69es
Fuentes: sqlite.org
Recuperación de Datos en SQLite (ii) -
[…] la entrada anterior, @nicky69es realizó una introducción a la recuperación de datos en SQLite. En esta entrada, hablará de como encontrar datos borrados y sobre los formatos de la […]