[Из песочницы] Получение записей телефонной книги с мобильного телефона без дисплея

Habrahabr 2

Это скорее развлекательная история для тех, кто так же, как и я, не является специалистом в телефонах и восстановлении данных.

Однажды сотрудник принёс телефон Fly Ezzy Trendy 3.

image (по его версии телефон начал первый, но сотрудник оказался сильнее)

Осознание того, что телефонная книга осталась у побеждённого наступило не сразу. И через некоторое время сотрудник обратился в ближайший сервис с просьбой извлечь телефонную книгу.

На этом история могла бы и закончиться, но по какой-то причине в сервисе ему отказали под предлогом того, что у них нет специализированной программы для этого телефона. Проверили, вроде включается. Во всяком случае, загорается подсветка клавиатуры.

Лезем в гугл и узнаём, что телефон работает на процессоре MediaTek MT6261D. Смотрим какие сервисные программы используются для работы с устройствами на базе таких процессоров. Выбираем MAUI META и заодно качаем пакет драйверов для устройств на базе процессоров MTK.

Тут я заинтересовался названием программы
И если META это Mobile Engineering Testing Architecture, как следует из найденой документации, то с MAUI не совсем понятно.

Нагуглил вот такие варианты:

  • Most Advanced User Interface
  • Multimodal Affective User Interface
  • Multimedia Application User Interface

Но это всё лирика.
Ставим драйвера, запускаем MauiMETA, выбираем FAT Editor, подключаем телефон и видим файловую систему телефона.

image

Копируем на компьютер содержимое NVRAM\NVD_DATA и начинаем усиленно его изучать. Оказалось, что нам нужны всего два файла MP0C_003 (здесь хранятся имена) и MP0H_006 (здесь хранятся номера телефонов). Так же, там был файл с смсками MPA3_001, но они нам были не нужны.

Будем использовать Frhed. Определяем размеры записей в этих файлах.

image (вот здесь хорошо видно, где заканчиваются данные и идут пустые записи)

Формат записи в файле с именами:

  • 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 OK\n";
  else
    echo "Checksum mismatch\n";
}

?>

Надеюсь, что кому-то эта заметка поможет, а кого-то просто позабавит.