Skip to content
This repository has been archived by the owner on Jul 7, 2022. It is now read-only.

Finding the key

hoplik edited this page May 11, 2020 · 4 revisions
  1. В телефоне, в режиме fastboot, запрашиваем разделы памяти $ fastboot getvar all Нас интересует recovery, но так как с ANDROID! начинаются два раздела, то попадётся ещё и boot.

(bootloader) partition-size:recovery: 0x4000000

(bootloader) partition-size:boot: 0x4000000

  1. Берём одинарный bin-файл с прошивкой. Открываем его в хекс-редакторе. Ищем все вхождения "ANDROID!". Их будет, скорее всего, 4. Нас интересую 2-а, у которых после Андройд! "B937"
  • 0x960D67C
  • 0x9629400 (B9 37)
  • 0xA0A9200 (B9 37)
  • D35B847C
  1. Переводим 4 млн. хекс в 10 = 67 мб.т.е. под каждый из разделов (boot & recovery) в системе зарезервировано по 67мб. в области памяти. Реально, в разархивироанном виде, получается от 10 до 20 мб. на каждый из разделов. Проверяем размер куска файла от одного вхождения до другого (сразу пишу в 10). 2-1=1BD84 (114kb) - маловат; 3-2=A7FE00 (11 009 536) - это boot (он у меня уже лежит в распакованном виде). 4-3=C950F27C (3.37gb) - начало recovery. Возьмём первые 20 мб.

  2. Формируем запрос на вырезку побайтного дубликата в формате образа (файловой системы) - img.

dd iflag=count_bytes,skip_bytes skip=168464896 count=20000000 if=~/T61IN.bin of=~/ramdisk_recovery.img

Проверяем в хекс-редакторе, что обрезался ровно по "ANDROID!", и размер должен получиться соответствующий. Дальше можно извлечь образ через gunzip или проще запустить гидру.

  1. Создаём новый проект, открываем img, как файловую систему. Видим две папки - kernel & ramdisk. Нас интересует ramdisk, там папка gzip_decompressed. Заходим туда. Находим папку /sbin/ и в ней update, который занимается обновлением прошивки с карты. Импортируем его в гидру. Разрешаем проанализировать.
  1. Находим все использования строковых переменных. В них применяем фильтр для поиска вхождения parse_bin_head (разбор заголовка прошивки). Адреса из этой функции понадобятся потом, для парсинга.
  1. Находим функцию получения информации из прошивки - get_bin_head_info.
  1. В ней располагается ключ раскодировки (да, да, лежит в прошивке, чтоб не потерялся). Он лежит не в чистом виде, а в качестве ссылки на переменную DAT. Их у нас две. Первая - слишком короткая для ключа. Выбираем вторую (DAT_004fb2e4) - 0123456789ABCDEF.
  1. Обращаем внимание, что под парсинг прошивки выделено 0x100000 байт, т.е. шапка прошивки 0-0х100000, а, начиная с адреса 1 048 456 - располагаются сами файлы прошивки. Так как ключ у нас один (без вектора) и на 8 байт (8*8=64 бита) - применяем алгоритм декодирования DES-ECB с одним 64-битным ключом.

  2. Реальный размер заголовка у нас примерно 20 000 байт. Это можно проверить в хекс-редакторе. В конце заголовка "пустые" байты будут добиваться нулями. Точнее, в нули они превратятся после декодирования прошивки найденным ключом. === Дальше можно разобрать функцию парсинга заголовка прошивки для формирования программы распаковки или воспользоваться тут уже готовой.

Clone this wiki locally