Menú principal

miércoles, 7 de mayo de 2014

Almacenamiento de mensajes SMS e iMessage en iOS

En el post de hoy vamos a ver en profundidad cómo funciona, en términos de almacenamiento, el sistema de mensajería de Apple. Todas las versiones de iOS hacen uso de SQLite, un sistema de gestión de bases de datos que implementa la práctica totalidad del estándar SQL, para almacenar los mensajes SMS y los chats de iMessage. Podemos encontrar la base de datos en la ruta /var/mobile/Library/SMS/sms.db, pero para poder acceder a ella es necesario haber hecho jailbreak al terminal. Una vez accedemos, vemos que está estructurada en nueve tablas.

Figura 1: Estructura de la base de datos.

A continuación se explica la funcionalidad de cada tabla.
  • _SqliteDatabaseProperties: almacena información relativa a la base de datos.
  • attachment: almacena los archivos adjuntos de los mensajes.
  • chat: almacena las diferentes conversaciones de iMessage y SMS.
  • handle: almacena datos de los usuarios, como id, país y servicio que utilizan (iMessage o SMS)
  • message: almacena los mensajes de las conversaciones.
  • chat_handle_join: relaciona las tablas chat y handle.
  • chat_message_join: relaciona las tablas chat y message.
  • message_attachment_join: relaciona un mensaje y sus adjuntos.
  • sqlite_sequence: contiene una entrada por cada tabla con clave primaria autoincrementable.
Como podemos ver, las tablas "join" establecen relaciones (vía identificadores) entre las tablas que contienen los datos.

Figura 2: Texto de los mensajes en la tabla Message

En la figura superior vemos el contenido de la tabla 'message', donde se almacenan los datos de cada mensaje (contenido, usuario emisor y receptor, fecha, etc...). Abajo podemos ver un ejemplo de lo que contiene la tabla chat. La tabla contiene una entrada por cada conversación mantenida por el usuario, indicando usuarios involucrados, servicio, etc.

Figura 3: Descripción de la tabla chat.

Hay algo que es importante comentar respecto a cómo almacena los mensajes Apple. La fecha de los campos date y date_read de la tabla message no parece, a priori, legible. Esto se debe al formato que utiliza Apple para almacenar fechas. Apple utiliza su propia versión modificada de Unix Epoch, el formato de fecha que utilizan los sistemas Unix y muchos lenguajes de programación. Este formato toma como fecha de referencia el 1 de Enero de 1970 a las 00.00, contando el número de segundos transcurridos desde ese instante.

Apple, por su parte, considera como momento cero el 1 de enero de 2001, ya que en 2001 fue el año de lanzamiento del Mac OS X 10.0. Debido a esto, para manejar fechas en SQLite debemos tener en cuenta cierto offset, concretamente la diferencia entre el punto de referencia de Apple y el de Unix Epoch. Este valor se puede calcular con la siguiente consulta:
SELECT strftime('%s', '2001-01-01 00:00:00');
Que básicamente devuelve los segundos transcurridos entre la medianoche del 1 de enero de 1970 y el 1 de Enero de 2001, es decir, 978307200. Así pues, para obtener una fecha en formato Unix Epoch a partir de la fecha de Apple, basta con sumar el offset al realizar la consulta. Siendo date la fecha que queremos convertir.
SELECT datetime(date+ 978307200,'unixepoch','localtime') FROM message
Las características estructurales de la base de datos SQLite, especialmente en lo que a relación entre tablas se refiere, así como la particular manera en la que Apple almacena las fechas hacen que sea necesario familiarizarse con ella si se quiere abordar desde un punto de vista de seguridad. Además, a nivel de usuario, nunca está de más conocer cómo funciona internamente una aplicación que maneja datos tan sensibles como los nuestros mensajes personales.

No hay comentarios:

Publicar un comentario

Entrada destacada

Proteger tu cuenta de Google y de Gmail con Latch Cloud TOTP #Latch #Gmail #Google

La semana pasada se liberó la nueva versión de Latch y nuestro compañero Chema Alonso hizo un repaso de todo ello en su artículo Latch...

Otras historias relacionadas

Entradas populares