Это скорее развлекательная история для тех, кто так же, как и я, не является специалистом в телефонах и восстановлении данных.
Однажды сотрудник принёс телефон Fly Ezzy Trendy 3.
(по его версии телефон начал первый, но сотрудник оказался сильнее)
Осознание того, что телефонная книга осталась у побеждённого наступило не сразу. И через некоторое время сотрудник обратился в ближайший сервис с просьбой извлечь телефонную книгу.
На этом история могла бы и закончиться, но по какой-то причине в сервисе ему отказали под предлогом того, что у них нет специализированной программы для этого телефона.
Проверили, вроде включается. Во всяком случае, загорается подсветка клавиатуры.
Лезем в гугл и узнаём, что телефон работает на процессоре MediaTek MT6261D. Смотрим какие сервисные программы используются для работы с устройствами на базе таких процессоров. Выбираем MAUI META и заодно качаем пакет драйверов для устройств на базе процессоров MTK.
Нагуглил вот такие варианты:
- Most Advanced User Interface
- Multimodal Affective User Interface
- Multimedia Application User Interface
Но это всё лирика.
Ставим драйвера, запускаем MauiMETA, выбираем FAT Editor, подключаем телефон и видим файловую систему телефона.
Копируем на компьютер содержимое NVRAMNVD_DATA и начинаем усиленно его изучать. Оказалось, что нам нужны всего два файла MP0C_003 (здесь хранятся имена) и MP0H_006 (здесь хранятся номера телефонов). Так же, там был файл с смсками MPA3_001, но они нам были не нужны.
Будем использовать Frhed. Определяем размеры записей в этих файлах.
(вот здесь хорошо видно, где заканчиваются данные и идут пустые записи)
Формат записи в файле с именами:
- 44 байта на одну запись
- 2 последних байта под контрольную сумму
- сами записи в UTF-16LE
Формат записи в файле с телефонами:
- 38 байт на одну запись
- каждая запись начинается с 0x00 0x00 0x01 0x00
- 2 последних байта под контрольную сумму
- сами записи в ASCII
Теперь было бы неплохо как-то автоматизировать процесс извлечения из файлов номеров телефонов и имён. Поскольку под рукой был вёб-сервер и я немного могу в php, набросал скрипт, закинул файлы на сервер. В результате получился файл с записями такого вида: имя контакта, номер телефона. Дальше импортировали в таблицу.
Довольный владелец телефона ушёл со списком своих контактов в закат.
P.S. Из спортивного интереса решил проверить действительно ли последние два байта каждой записи являются какой-то контрольной суммой и если да, то каков её алгоритм.
Читал про 16-битные контрольные суммы типа CRC16 и безуспешно подбирал ту, которая подошла бы мне. Запарился и решил использовать «помощь зала» «звонок другу», который предположил, что всё намного проще и там может использоваться простая сумма всех байт записи.
Оказалось немного сложнее: нечётные байты суммируются отдельно и результат сравнивается с первым байтом контрольной суммы, чётные отдельно — со вторым. Суммирование происходит без учёта переполнения.
<?php
$fd1 = fopen("MP0C_003", "rb") or die();
$fd2 = fopen("MP0H_006", "rb") or die();
while(!feof($fd1))
{
// Name file
$str = fread($fd1, 44);
$data = substr($str, 0, -2);
echo iconv("utf-16le", "utf-8", $data).",";
// Number file
$str = fread($fd2, 38);
$data = substr($str, 0, -2);
echo $data."n";
}
?>
<?php
$fd1 = fopen("MP0C_003", "rb") or die();
while(!feof($fd1))
{
$str = fread($fd1, 44);
$cs1 = 0;
$cs2 = 0;
for($i = 0; $i < 42; $i++)
{
if($i%2)
$cs1 = ($cs1 + ord($str[$i]))%256;
else
$cs2 = ($cs2 + ord($str[$i]))%256;
}
if($cs1 == ord($str[43]) && $cs2 == ord($str[42]))
echo "Checksum is OKn";
else
echo "Checksum mismatchn";
}
?>
Надеюсь, что кому-то эта заметка поможет, а кого-то просто позабавит.
Автор: yaanyk