Восстановление удаленных данных в таблице Sqlite на примере адресной книги Iphone

24 Дек
2011

Преамбула


Началось все с того, что я (как позже выяснилось, как и многие) некорректно провел синхронизацию Iphone 3GS с Google Контактами. Результатом этого стали несколько адресов электронной почты в телефоне и гугловских контактах, и потеря 949 контактов. Ситуация осложнялась тем, что телефон был не мой, а директорский, и в случае неудачи восстановления мне вполне логично не светило ничего хорошего.


Теория


Как нам практически сразу рассказывает Гугл, адресная книга в резервной копии Iphone хранится в файле 31bb7ba8914766d4ba40d6dfb6113c8b614be442.mddata, расположенном в папке %APPDATA%\Apple Computer\MobileSync\Backup\UID устройства, состоящий из 40 символов\. Этот файл является ничем иным, как базой Sqlite, которорую мы можем открыть любым подходящим вьювером (например, SQLite Database Browser).

Препарирование БД и особенности мировоззрения Sqlite


В данной базе данных нас интересует две таблицы:
  • ABPerson , которая содержит имена контактов;
  • ABMultivalue, в которой хранятся номера телефонов.




Ничего веселого, на первый взгляд, мы не видим — все те же несколько е-мейлов.
Связи между таблицами, по-видимости, осуществляются благодаря столбцу record id и ROWID . Но следущее погружение в гугл дает нам надежду: ради быстродействия Sqlite не затирает удаленные данные, а просто помечает занимаемые ими строки как пустые и свободные для записи. Доказательством этого стало открытие БД в двоичном представлении:

Задача обрела конкретику: восстановить имена контактов, телефоны и связывающие их айдишники.


Казалось, проблема близка к решению, но следующее известие повергло меня в шок: Sqlite не имеет штатных средств для восстановления удаленных записей. Форумы предлагали написать свой скрипт, который мог повыдергивать номера и фамилии из текстового представления файла, одна добрая душа даже поделилась со мной своей версией, но этот способ совершенно не решал проблему восстановления связей между двумя таблицами. Перспектива оказаться владельцем тысячи имен и тысячи номеров, не связанных друг с другом, меня совершенно не прельщала, и я продолжил поиски сторонних решений.


Неподходящие решения


Первым делом я наткнулся на человека, явно решившего эту проблему и предлагающего свои услуги за некоторое вознаграждение. Позже выяснилось, что это вознаграждение составляет 20 рублей за контакт, что в моем случае даже со значительной скидкой составляло совершенно нехилую сумму. Толкаемый далее своей жабой, я двинулся на поиски более подходящего способа.
Следующим вариантом обнаружился Oxygen Forensic SQLite Viewer. Триал-версия этого пакета действительно смогла восстановить требуемые таблицы до предапокалиптического состяния, включая заветный столбец ROWID , но от стыдливой надписи TRIAL, закрывающей большую часть каждой ячейки была согласна избавиться только за 199 долларов. Сумма, конечно, уменьшилась, но, оставив этот вариант как последнйи шанс, я решил попытать удачу еще раз.

Эпилог, ставший кульминацией


И наконец, в третьем часу ночи моему взору предстала программа epilog (SQLite forensic tool). К счастью, она тоже адаптирована для восстановления данных мобильных платформ, и к тому же ничего не скрывала даже в триал-версии. Но не обошлось без подводных камней.

Например, я так и не смог заставить программу считать содержимое таблицы ABPerson. Единственным вариантом, в котором я получал все данные, был режим Do Freepage Analysis. Но, как логично следует из названия режима, все данные были в одной таблице, и обнаружить, какое из значений является именно ROWID, было не так то просто.
После некоторого анализа экспортированной в XML и импортированной в Excel восстановленной БД по извесным мне парам «контакт-номер телефона» обнаружилось следующее: строки, содержащие значения от 1 до 9999 в столбце 111, в столбце 222 имеют номер телефона, а строки, содержащие такое же число в столбце 333, в столбце 444 и 555 имеют имя контакта. Далее я получил два экселевских листа, на одном из которых были айдишники и контакты, на втором — айдишники и номера. Простая логическая формула на поиск соответствия, экспорт CSV файла из контактов Google в качестве образца, заполнение CSV файла восстановленными данными — и моя жизнь спасена).

Настоящий эпилог


Данный способ применим так же во многих других бытовых случаях — восстановление SMS, заметок на iOS и Андроиде, истории посещений в Firefox… Обычно данные можно вытащить вручную из базы, при условии хранении всей информации в одной таблице. Можно было бы, конечно, просто дать ссылку на Epilog, но я думаю, наличие на Блоге полного описания процесса сохранит много времени и нервов моим соратникам по несчастью).
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх