Экспорт истории сообщений из Skype

Прочитав новость об уязвимости в Skype, позволяющей угнать любой аккаунт, в процессе чтения комментариев и постов по теме наткнулся на новую для себя информацию: оказывается, начиная с версии 4.* Skype хранит информацию о пользователе в базе sqlite. Это и навело меня на мысль о том, что информацию из базы можно легко и непринужденно получить.

Сама база была обнаружена — как и следовало ожидать, в папке c:\Users\\Application Data\Skype\\, и судя по размеру имеющихся там файлов, носила имя main.db

Вторым шагом стал поиск удобного инструмента для работы с базами sqlite, ибо ранее не приходилось работать с ними. Первый же найденный инструмент: SQLite Database Browser, без проблем открыл и показал содержимое базы данных.

Однако у данного инструмента обнаружились и свои недостатки — неумение работать с полями типа BLOB и невозможность выгружать результаты вручную написанного запроса во внешние источники. Поэтому, предприняв вторую попытку поиска, я нашел Add-on для Firefox под именем SQLite Manager, и в дальнейшем пользовался уже им.

База содержит не слишком большое количество таблиц, и их названия интуитивно понятны, так что обнаружить нужную информацию не составит труда, поэтому приведу лишь наиболее очевидные и полезные запросы к базе. Выполнить их можно с вкладки «Execute SQL» в SQLite Database Browser'e, или с вкладки «Выполнить запрос» в SQLite Manager'e.

В таблице Contacts находятся все контакты, причем даже те, что были удалены, и уже не показываются в клиенте.

    select skypename, 
    fullname, 
    given_displayname, 
    birthday, 
    case gender when 1 then 'Мужской' when 2 then 'Женский' else 'Не указан' end as "Пол", 
    case availability when 0 then 'Удален' when 8 then 'Не предоставил данные' else '' end as "Доступность",
    strftime('%d.%m.%Y %H:%M:%S',lastonline_timestamp, 'unixepoch', 'localtime') as "Последний раз был в сети" 
    from contacts

В таблицах Calls и CallMembers содержатся, соответственно, история звонков и их участников.

    **select** calls.id **as** "ID разговора",
   coalesce(contacts.displayname, accounts.fullname) **as** "Инициатор",
   strftime('%d.%m.%Y %H:%M:%S',calls.begin_timestamp, 'unixepoch', 'localtime') **as** "Дата начала",
   **time**(calls.duration, 'unixepoch') **as** "Длительность",
   callmembers.dispname **as** "Подключенный участник",
   strftime('%d.%m.%Y %H:%M:%S',callmembers.start_timestamp, 'unixepoch', 'localtime') **as** "Дата подключения",
   **time**(callmembers.call_duration, 'unixepoch') **as** "Длительность подключения" 
    **from** calls
   **inner** **join** callmembers **on** calls.id = callmembers.call_db_id
   **left**  **join** contacts **on** calls.host_identity = contacts.skypename
   **left**  **join** accounts **on** calls.host_identity = accounts.skypename

И, наконец, в таблицах Conversations и Messages содержатся данные переписки и сами сообщения.

    **select** conversations.id **as** "ID переписки", 
   conversations.displayname **as** "Участники переписки", 
   messages.from_dispname **as** "Автор сообщения",  
   strftime('%d.%m.%Y %H:%M:%S',messages.timestamp, 'unixepoch', 'localtime') **as** "Время сообщения", 
   messages.body_xml **as** "Текст сообщения" 
     **from** conversations
   **inner** **join** messages **on** conversations.id = messages.convo_id
    **order** **by** messages.timestamp

В завершение статьи не могу не заметить, что для доступа ко всему содержимому базы достаточно иметь доступ к самому файлу — содержимое базы никак не шифруется и не защищается, так что любой человек, который сможет получить доступ к вашему профилю Windows, сможет найти список контактов, просмотреть историю звонков и прочитать всю переписку.