пятница, 4 сентября 2015 г.

Как получить образ Recovery из boot.img? Учимся работать с applypatch.

В этом посте я вкратце расскажу вам о том как получить образ recovery.img из boot.img, при условии что у нас на руках имеется только update.zip от прошивки телефона. Собственно на написание этого гайда меня сподвиг один из читателей моего блога, который умудрился зашить в Билайн Смарт Dual recovery от абсолютно другого аппарата и попросил о помощи. Прошивок под SP Flash Tool для данного аппарата мне найти не удалось (в этом случае все было бы намного проще, так как там образ стокового recovery уже лежит отдельно), но зато был найден update.zip от данного аппарата.

Вообщем все не просто, а очень просто. Единственное для работы нам понадобится любой телефон на Android с root-доступом и adb. Первое что мы делаем это извлекаем из архива с прошивкой update.zip следующие файлы:

  • boot.img - образ раздела boot
  • recovery-resource.dat (можно взять в system\etc) - набор ресурсов для добавления в образ recovery, так называемый bonus-file.
  • recovery-from-boot.p (в update\recovery) - файл патча (diff), который собственно и поможен нам преобразовать boot.img в recovery.img
  • install-recovery.sh (update\recovery\etc) - скрипт который используется ОС Android в штатном режиме, для восстановления раздела recovery из boot.
Далее все очень просто, смотрим в install-recovery.sh, оттуда нам понадобятся значения SHA1-хешей boot.img, recovery.img и самого патча. В моем случае это строка:

applypatch -b /system/etc/recovery-resource.dat EMMC:boot:4257792:294140ba217ceba662050400bb9488f494b6362b EMMC:recovery 3e9baf0e1ef24480a92d92c5566244a240480fcc 4634624 294140ba217ceba662050400bb9488f494b6362b:/system/recovery-from-boot.p

Теперь заливаем все перечисленные в списке файлы в любое устройство на Android через ADB. Я залил их в папку /data/local/tmp/recovery. Далее изучаем синтаксис утилиты applypatch (кстати ее исходники и собранный бинарник под Linux, если вы, например, хотите собрать ее самостоятельно или использовать ПК с Linux вместо телефона на Android, можно взять здесь):

usage: applypatch [-b <bonus-file>] <src-file> <tgt-file> <tgt-sha1> <tgt-size>
[<src-sha1>:<patch> ...]
   or  applypatch -c <file> [<sha1> ...]
   or  applypatch -s <bytes>
   or  applypatch -l

Filenames may be of the form
  MTD:<partition>:<len_1>:<sha1_1>:<len_2>:<sha1_2>:...
to specify reading from or writing to an MTD partition.

После чего копируем boot.img в recovery.img, например так - cp /data/local/tmp/boot.img /data/local/tmp/recovery.img ... и выполняем следующую команду, уже через ADB на Android устройстве:

applypatch -b /data/local/tmp/recovery/recovery-resource.dat /data/local/tmp/recovery/boot.img /data/local/tmp/recovery/recovery.img 3e9baf0e1ef24480a92d92c5566244a240480fcc 4634624 294140ba217ceba662050400bb9488f494b6362b:/data/local/tmp/recovery/recovery-from-boot.p

Здесь:

  • bonus-file: -b /data/local/tmp/recovery/recovery-resource.dat 
  • src-file: /data/local/tmp/recovery/boot.img 
  • tgt-file: /data/local/tmp/recovery/recovery.img 
  • tgt-sha1: 3e9baf0e1ef24480a92d92c5566244a240480fcc 
  • tgt-size: 4634624 
  • <src-sha1>:<patch>: 294140ba217ceba662050400bb9488f494b6362b:/data/local/tmp/recovery/recovery-from-boot.p

Где src-sha1 - это SHA1 хеш исходного файла, tgt-sha1 - это SHA1 хеш результирующего файла, который должен получиться в результате применения патча.

В результате в файле recovery.img, в который изначально мы скопировали boot.img, получится образ recovery.img, полученный применением патча recovery-from-boot.p. Как вы уже поняли, чтобы воспользоваться applypatch нам необходимо знать размер и SHA1 recovery, который должен получиться в итоге (tgt-sha1 и tgt-size), именно эти значения мы и взяли из install-recovery.sh.

Т.е. в процессе работы applypatch к boot.img применяется патч recovery-from-boot.p, после чего размер и sha1-хеш полученного файла сравниваются с указанными нами в аргументах командной строки. Если все совпадает - патч считается примененным корректно (т.е. это гарантирует что на выходе у нас верный образ recovery). По-хорошему, можно попробовать собрать applypatch и под Win32, а также сделать ее использование более простым, например, отключив проверку sha1 и размера результата, чтобы для патча было достаточно только исходного файла и соответствующего .p патча. Но особенной практической необходимости в этом я не вижу ...

p.s. Для тех кто хочет сам создавать файлы патчей в этом архиве imgdiff_bsdiff_tools.7z вы можете найти Win32 порты утилит bsdiff и imgdiff. Также присутствует калькулятор хешей (HashCalc) и исходники applypatch, на случай, если кто-то захочет попробовать собрать его под Win32. imgdiff.exe и imgdiff2.exe - это разные сборки одной и той же утилиты полученные из разных источников.

12 комментариев :

  1. Интересны мысли по поводу восстановления убитого reckvery meizu mx4, имею булуп, подключился по uart выдает что не соответствует hash файла, mtk flash tool аппарат видит, но аппарат по блоком и необходим файл аутентификации. через uart пока в консоль ядра попасть не могу, там он выдает команду которая в fastboot заводит, можно ли через тестпоинты как то залить раздеk??

    ОтветитьУдалить
    Ответы
    1. Meizu MX4 на каком чипе? Mediatek или Qualcomm? Если Qualcomm и у вас есть доступ к fastboot - то залить туда recovery через fastboot можно без каких либо проблем. Например так - fastboot flash recovery recovery.img, где recovery.img - образ оригинального recovery.

      Удалить
    2. чип MediaTek 6595, еще и для китайского рынка. попытка выполнить любую команду fastboot выдает ошибку безопасности... поетому обычное программное воздействие без файлика безопасности без вариантов, подступы все закрыты... остается только хардкор, в виде подключения к чипу, а вот тут куда копать... опыта мало..

      Удалить
    3. Про какой смартфон (MT6595) идет речь? Если вы о Билайн Смарт Dual, который продается в Армении, Кыргызстане и др. странах, то он, насколько я помню на MT6572. И fastboot там абсолютно не такой, как в аппаратах на SoC от Qualcomm. По большому счету его использование и не нужно ... методика работы с MTK немного другая.

      Удалить
  2. Телефон meizu mx4 на чипе MT6595, о нем сказано еще в начале, и вы тоже упоминали про него...

    ОтветитьУдалить
    Ответы
    1. Попробуйте найти прошивку для SP Flash Tool под него.

      Удалить
    2. Так можна ли восстановить Убитый Загрузчик на meizu mx4

      Удалить
  3. Автор молодец! Описанный метод незаменим для восстановления стокового recovery.У меня как у пользователя с малым опытом возникли трудности после того ,как скопированы необходимые файлы в папку /data/local/tmp/recovery.Не понятен дальнейший способ применения утилиты applypatch и копирования boot.img в recovery.img. Единственная надежда восстановить recovery с помощью этого способа.

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Очень полезная статья!
    Прошу подсказать - имеется meizu m2 note на mtk6753. Телефон загружается в систему нормально, но не заходит в рекавери (единственный режим для прошивки аппарата). Имеется так-же файл recovery.img, можно ли его прошить через fastboot? Телефон в режим fastboot заходит, на запрос fastboot devices откликается.

    ОтветитьУдалить
    Ответы
    1. fastboot flash recovery c:\recovery.img
      не забыть разблокировать бутлоадер

      Удалить
  6. разобрался, но...после ввода команды, пишет can't patse "тра-та-та/recovery.img" as byte count...

    ОтветитьУдалить