Случайно наткнулся на статью “How to Access and Read the iPhone SMS Text Message Backup Files“, рассказывающую, как прочитать архив SMS с iPhone из резервной копии, которую делает iTunes.

Сразу же замечу, что если вы параноидальны и не хотите, чтобы ваши SMS прочитали, то криптуйте свои бекапы (панель опций на закладке Summary вашего iPhone):

Бекапы iOS-устройств находятся в каталоге ~/Library/Application Support/MobileSync/Backup. Меня интересует список, отсортированный в порядке проведения бекапов, для этого использую “ls -lt”:

$ cd "~/Library/Application Support/MobileSync/Backup"
$ ls -lt
drwxr-xr-x  6026 ctrld  staff  204884 Nov 12 16:34 09213b6660a22d13977258d480ced2a880ff8390
drwxr-xr-x  5633 ctrld  staff  191522 Oct 19 23:07 09213b6660a22d13977258d480ced2a880ff8390-20101019-230647

Имя состоит из UDID устройства и времени формирования предыдущих копий.

Метод, приведённый в указанной выше статье не работает – файлы с расширением .mddata и .mdbackup в моём бекапе отсутствуют. Поэтому ищу почти наугад.

Первый способ – поиск по известному фрагменту текста

Я знаю, что мне приходил SMS из банка о снятии денег за программу из iTunes в пользу “ITUNES-USD”. Нахожу grep’ом файл, убеждаюсь, что это SQLite:

$ cd "~/Library/Application Support/MobileSync/Backup/"
$ cd 09213b6660a22d13977258d480ced2a880ff8390
$ grep ITUNES-USD *
Binary file 3d0d7e5fb2ce288813306e4d4636395e047a3d28 matches
$ file 3d0d7e5fb2ce288813306e4d4636395e047a3d28
3d0d7e5fb2ce288813306e4d4636395e047a3d28: SQLite 3.x database

Второй способ – поиск по структуре базы

Сделал скрипт 1.sh, который снимает схемы всех баз SQLite (в него нужно вставить ваши данные):

#!/bin/bash
UDID=09213b6660a22d13977258d480ced2a880ff8390

dir=~/Library/Application\ Support/MobileSync/Backup/$UDID
if [ -e "$dir" ]; then
	echo "Time: $(date)"
else
	echo "Directory $dir does not exists"
	exit
fi

cd "${dir}"
lst=$(file * | grep SQLite | awk -F : '{print $1}')

for l in ${lst}; do
	echo ${l}
	echo ".schema" | sqlite3 ${l}
done
echo "Time: $(date)"

Запускаю скрипт, записываю вывод в файл:

$ ./1.sh > 1.out

Ищу в результатах строку “CREATE TABLE message” – именно так определяется таблица с SMS. Нахожу нужный файл, у меня это 3d0d7e5fb2ce288813306e4d4636395e047a3d28.

Вывод данных

Копирую найденный файл в рабочий каталог

$ cp "~/Library/Application Support/MobileSync/Backup/09213b6660a22d13977258d480ced2a880ff8390/3d0d7e5fb2ce288813306e4d4636395e047a3d28" ~/sms.sqlite

Открываю, смотрю схему (несколько приёмов работы с SQLite я приводил в статье по Mail.app):

$ sqlite3 sms.sqlite
sqlite> .schema
CREATE TABLE _SqliteDatabaseProperties (key TEXT, value TEXT, UNIQUE(key));
CREATE TABLE group_member (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, group_id INTEGER, address TEXT, country TEXT);
CREATE TABLE message (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT, date INTEGER, text TEXT, flags INTEGER, replace INTEGER, svc_center TEXT, group_id INTEGER, association_id INTEGER, height INTEGER, UIFlags INTEGER, version INTEGER, subject TEXT, country TEXT, headers BLOB, recipients BLOB, read INTEGER);
CREATE TABLE msg_group (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER, newest_message INTEGER, unread_count INTEGER, hash INTEGER);
CREATE TABLE msg_pieces (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, message_id INTEGER, data BLOB, part_id INTEGER, preview_part INTEGER, content_type TEXT, height INTEGER, version INTEGER, flags INTEGER, content_id TEXT, content_loc TEXT, headers BLOB);
...

Делаю выборку из messages:

sqlite> select * from message;
...
2925|10060|1289398514|Parol: 11111111 www.privat24.ua -- Modem naprokat za 0 grn. v mesyats. Zakagi na privat24.ua i plati za Internet 60 ili 80 grn.|2|0||481|0|0|0|0||ua|||0
...

Данные видны, а уже с ними можно работать.

Если вы ищете клиент под Mac OS X, то не смотрите на RazorSQL – такого кроссплатформенного уродца (да ещё и небесплатного) я давненько не встречал. Посмотрите обсуждение на StackOverflow и сравнительную таблицу клиентов. Посоветовать ничего не могу, я их не смотрел, мне достаточно консоли.