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

label
label
В этом посте я вкратце расскажу вам о том как получить образ 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 - это разные сборки одной и той же утилиты полученные из разных источников.
Share This :



sentiment_satisfied Emoticon