Le mode RECOVERY : exploration en plein coeur du dispositif

Par gabs - Le 3/01/14 - Affichages : 11817

Tous ceux d’entre nous qui “bidouillent” un peu leur téléphone connaissent un peu la structure d’Android, mais on connaît généralement moins comment est fait le mode recovery.
Ma curiosité m’a amené à regarder cela de plus près, et voici donc le résultat de mes recherches.

Image


Quelques rappels

Le mode Recovery est un mode de fonctionnement particulier de nos téléphones Android qui permet d’effectuer un certain nombre de tâches sans même que le firmware ou la ROM ne soit démarré. Il est accessible en maintenant les touches vol haut + home + power lorsque le téléphone est éteint.
Concrètement, c’est un mode qui permet de réaliser certaines opérations de maintenance ou encore de récupérer un système devenu instable.
Samsung fournit sa version standard du mode recovery, mais il en existe d’autres dont le plus célèbre : ClockWorkMod (CWM). Concernant ce dernier, pour plus d'informations, je vous invite à consulter le sujet de titofe : Utilisation du ClockWorkMod


Idée reçue

De nombreuses personnes pensent qu’il y a un lien fort entre la version du mode recovery et celle du firmware du téléphone. Même si chaque firmware embarque une version du mode recovery, il est tout à fait possible de flasher un recovery alternatif (comme CWM), et il n’est pas nécessaire d’avoir une version spéciale de CWM sensée supporter ou correspondre au firmware en question.
Le recovery est un système autonome qui fonctionne “à coté” d’Android. Il n’est donc pas fortement liée à la version d’Android installée. Il doit juste être capable d’accéder et d’exploiter correctement le stockage de la ROM ou du firmware.


Où est stocké le recovery ?

Le recovery ne fait donc pas partie des firmwares ou des ROMs et on ne peut pas voir directement son contenu depuis Android.
Lorsqu’on flashe un recovery alternatif, on voit clairement que celui-ci est constitué d’un fichier “recovery.img”. Cette image est ensuite flashée telle quelle dans une partition spéciale du téléphone. Sur la Galaxy SIII (i9300), il s’agit de la partition /dev/block/mmcblk0p6


Mais qu’y a-t-il dans recovery.img ?

Ceux qui ont lu l’excellent tutoriel de jhowlett468 Extraction des fichiers d’une ROM Stock savent que certains fichiers .img des firmwares sont en fait de simples images du système de fichiers du téléphone. Ils sont aisément convertibles en images ext4 et on peut ensuite facilement en exploiter le contenu.
Seulement voilà, inutile d’essayer, cette méthode n’est pas applicable aux fichiers recovery.img ou kernel.img car ces images ont une structure très différente.

Les fichiers recovery.img et kernel.img sont en fait des images “bootables” et sont constitués ainsi :
- un entête de 2ko : il ne contient à priori pas de code particulier
- un kernel : Il s’agit du code du kernel qui va être chargé en mémoire pendant la phase de boot.
- un ramdisk : Il s’agit ici d’un disque virtuel contenant tous les fichiers nécessaires au fonctionnement du recovery (ou du kernel). Ce disque virtuel est chargé en mémoire afin d’être exploité par le kernel. Dans le fichier recovery.img ce disque virtuel est une archive cpio compressée avec gzip

Image

Dans la structure des images bootables, il pourrait ensuite y avoir un autre “loader”, mais cela n’est en fait pas utilisé et il n’y a donc rien après le ramdisk.

Au final, le fichier recovery.img contient donc un mini système linux complètement autonome.
C’est pour cela, qu’il a un aspect très différent d’un système android complet.


Cas pratique (1/2) : exploration du PhilZ Touch recovery

Nous allons maintenant voir comment extraire le kernel et le ramdisk d’un fichier recovery.img
Dans mon cas, j’ai pris le Philz Touch pour mon Galaxy S3 (philz_touch_6.00.8-i9300)

Il existe des outils qui permettent de faire cela automatiquement :
- unpackbotimg (sous linux)
- split_bootimg.pl (script perl)
Le but étant toutefois de bien comprendre la structure du recovery, j’ai donc réalisé cette opération “à la main”, juste avec un éditeur hexadécimal (HHD Hex Heditor Neo)

Voici donc comment procéder :
- extraire le fichier recovery.img du fichier .tar ou .zip d’installation du recovery (avec 7zip)
- charger le fichier recovery.img dans l’éditeur hexadécimal
- supprimer les 2048 premiers octets du fichier : c’est le header, il ne nous intéresse pas
- rechercher la séquence 00 00 1F 8B : le kernel se termine par une série de 00 et 1F 8B est le magic number de tout fichier gzip
- enregistrer tout ce qui est avant 1F 8B dans un fichier nommé kernel
- enregistrer toute la fin du fichier (commençant par 1F 8B) dans ramdisk.cpio.gz

Image

Enfin, il faut extraire le contenu du ramdisk :

Code: Select All Code
gzip -d ramdisk.cpio.gz
mkdir ramdisk
cd ramdisk
cpio -i < ../ramdisk.cpio

Ces opérations sont réalisable directement sous linux ou avec cygwin sous Windows.
Si vous voulez juste visualiser le contenu, sous Windows, vous pouvez aussi utiliser 7zip pour explorer le ramdisk.

Image

Vous pouvez donc maintenant voir exactement ce qu’il y a dans votre recovery ;-)
Je vous invite à aller regarder dans le répertoire /sbin. Dans le cas du PhilZ, on peut y voir les liens symboliques pour les commandes liées à busybox et les outils utilisé par le recovery, mais aussi des choses intéressantes comme le script install-su.sh

La même procédure est applicable aux fichiers kernels.img, mais il n'y a généralement que peu de choses en dehors du kernel lui-même.


Cas pratique (2/2) : re-création d’une image recovery flashable

Attention !
Cette procédure permet de réaliser une image flashable sur votre téléphone. Elle est fournit en l’état, à titre d’information. Comme tout flash, cela présente un risque, et ni moi ni le forum ne pourront être tenu pour responsable des conséquences sur votre téléphone.

Afin de démontrer la validité de ce qui est décrit dans cet article, j’ai modifié l’image de fond du recovery PhilZ “stitch.png”. J’ai toutefois fait attention à la taille totale du ramdisk afin de ne pas dépasser la taille de partition recovery de mon Galaxy S3, à savoir 8Mo.

Voici donc la procédure à suivre pour recréer une image recovery flashable (réalisé sous linux) :
- se positionner dans le répertoire ou le ramdisk a été extrait, puis récréer le ramdisk avec cpio et gzip :
Code: Select All Code
find . | cpio -o -H newc | gzip > ../ramdisk.cpio.gz

- recréer l’image bootable à partir du fichier kernel et du nouveau ramdisk grâce à l’utilitaire mkbootimg (de l’Android Plateform Tools)
Code: Select All Code
./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel kernel --ramdisk ramdisk.cpio.gz -o recovery.img

- on peut ensuite intégrer cette image dans un update.zip ou en faire un fichier tar flashable par odin :
Code: Select All Code
tar -H ustar -c recovery.img > philz_touch_6.00.8-i9300_mod.tar
md5sum -t philz_touch_6.00.8-i9300_mod.tar >> philz_touch_6.00.8-i9300_mod.tar
mv philz_touch_6.00.8-i9300_mod.tar philz_touch_6.00.8-i9300_mod.tar.md5

Pour la version .zip, il suffit de prendre le zip d’origine et de remplacer le fichier recovery.img par la nouvelle version.
Enfin, il ne reste plus qu'à essayer le recovery sur notre téléphone. Pour mon cas, le résultat est visible sur la première image de ce post. ;)


Annexes :

Flash d’un recovery :
Les recovery sont flashable via Odin ou via le menu recovery.
Le flash par odin fonctionne normalement toujours. L’inconvénient est que cela nécessite Odin ou mobile Odin, mais surtout cela augmente le compteur du nombre de flash.
Le flash via un fichier .zip depuis le menu recovery nécessite d’avoir un fichier .zip avec une signature valide ou d’avoir déjà un recovery modifié qui ne vérifiera pas la signature. Par contre cela n’augmente pas le compteur du nombre de flashs.

Références :
xda-developpers.com - HOWTO: Unpack, Edit, and Repack Boot Images

Les fichiers de cet article :
Outils linux pour manipuler les images bootables : outils_recovery_img.zip
Le recovery modifié de cet article (pour SGS3 i9300) : version zip version odin


Edit : Ce topic a participé au concours 2013-2014, il fut l'un des gagnants


19 réponse(s) -