-
Notifications
You must be signed in to change notification settings - Fork 1
Finding the key
- В телефоне, в режиме fastboot, запрашиваем разделы памяти
$ fastboot getvar all
Нас интересует recovery, но так как с ANDROID! начинаются два раздела, то попадётся ещё и boot.
(bootloader) partition-size:recovery: 0x4000000
(bootloader) partition-size:boot: 0x4000000
- Берём одинарный bin-файл с прошивкой. Открываем его в хекс-редакторе. Ищем все вхождения "ANDROID!". Их будет, скорее всего, 4. Нас интересую 2-а, у которых после Андройд! "B937"
- 0x960D67C
- 0x9629400 (B9 37)
- 0xA0A9200 (B9 37)
- D35B847C
-
Переводим 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 мб.
-
Формируем запрос на вырезку побайтного дубликата в формате образа (файловой системы) - img.
dd iflag=count_bytes,skip_bytes skip=168464896 count=20000000 if=~/T61IN.bin of=~/ramdisk_recovery.img
Проверяем в хекс-редакторе, что обрезался ровно по "ANDROID!", и размер должен получиться соответствующий. Дальше можно извлечь образ через gunzip или проще запустить гидру.
- Создаём новый проект, открываем img, как файловую систему. Видим две папки - kernel & ramdisk. Нас интересует ramdisk, там папка gzip_decompressed. Заходим туда. Находим папку /sbin/ и в ней update, который занимается обновлением прошивки с карты. Импортируем его в гидру. Разрешаем проанализировать.
- Находим все использования строковых переменных. В них применяем фильтр для поиска вхождения parse_bin_head (разбор заголовка прошивки). Адреса из этой функции понадобятся потом, для парсинга.
- Находим функцию получения информации из прошивки - get_bin_head_info.
- В ней располагается ключ раскодировки (да, да, лежит в прошивке, чтоб не потерялся). Он лежит не в чистом виде, а в качестве ссылки на переменную DAT. Их у нас две. Первая - слишком короткая для ключа. Выбираем вторую (DAT_004fb2e4) - 0123456789ABCDEF.
-
Обращаем внимание, что под парсинг прошивки выделено 0x100000 байт, т.е. шапка прошивки 0-0х100000, а, начиная с адреса 1 048 456 - располагаются сами файлы прошивки. Так как ключ у нас один (без вектора) и на 8 байт (8*8=64 бита) - применяем алгоритм декодирования DES-ECB с одним 64-битным ключом.
-
Реальный размер заголовка у нас примерно 20 000 байт. Это можно проверить в хекс-редакторе. В конце заголовка "пустые" байты будут добиваться нулями. Точнее, в нули они превратятся после декодирования прошивки найденным ключом. === Дальше можно разобрать функцию парсинга заголовка прошивки для формирования программы распаковки или воспользоваться тут уже готовой.