Multi-Amorçage iOS

Avertissement: Certaines étapes présentées dans ce tutoriel interviennent sur des composantes de bas-niveau qui contiennent parfois de l'information critique permettant le bon fonctionnement de l'appareil. Une simple erreur peut «bricker» définitivement l'appareil, donc le rendre totalement inutilisable.
Aussi, attendre le prochain «Jailbreak» avant d'essayer sur les appareils pouvant accueillir la dernière mise à jour d'iOS.
Suivre ce tutoriel à vos propres risques.

Partie «Userland» (B)

Cette partie décrit les étapes à exécuter au niveau du système de fichiers (après le démarrage du kernel) pour implémenter le multi-amorçage iOS.

1) Procéder au jailbreak de la version d'iOS installée sur l'appareil en s'assurant que l'outil utilisé appliquera le patch Task_for_pid() au niveau du kernel.

2) Une fois le procédé de jailbreak terminé, l'application Cydia devrait être présente sur l'écran d'accueil. L'ouvrir, puis ajouter le «repository» (source) http://pmbonneau.com/cydia.

3) Rechercher, puis installer les paquets suivants:
a) «OpenSSH» («Repository» Cydia de Saurik). Celui-ci sera nécessaire pour les opérations en ligne de commande sur l'appareil à partir d'une connexion externe ou en «localhost» par l'usage du protocol SSH.
b) «HFS Resize» («Repository» Cydia de Pierre-Marc Bonneau). Cet outil sera utilisé pour le redimensionnement de la partition de données (DATA) du système iOS principal.
c) «GPTfdisk» («Repository» Cydia de Pierre-Marc Bonneau). Cet outil sera utilisé pour la création des partitions additionnelles qui accueilleront les autres systèmes iOS.
d) «iFile» («Repository» Cydia de BigBoss) OU «attach» («Repository» Cydia de Pierre-Marc Bonneau) ET «detach» («Repository» Cydia de Pierre-Marc Bonneau). On cherche une méthode qui nous permettera de monter une image .dmg en tant que volume logique. L'application «iFile» permet de monter de façon très simple les images .dmg non-compressées dans un dossier du système de fichiers de l'instance d'iOS en cours d'exécution. Les outils «attach» et «detach» font le même travail, mais d'une façon plus complexe.
e) «MKsysbag» («Repository» Cydia de Pierre-Marc Bonneau) : Cet outil permet de générer un «keybag» système (/var/keybags/systembag.kb) et son keybag correspondant dans l'«effaceable storage».

4) Se connecter en SSH sur l'appareil par une connexion Wi-Fi (addresse IP) ou bien par le port USB en utilisant iTunnel (Winodows) ou iProxy (Linux).

5) Si nous utilisons par exemple un appareil d'une capacité de 16 Go, environ 13,5 Go seront alloués pour la partition de données (DATA) comme on peut le voir sur la capture d'écran suivante:
Erreur d'affichage de la photo
Notre objectif est de réduire ce volume pour permettre la créations de partitions supplémentaires par l'utilisation d'un outil approprié.
L'outil HFS Resize prend deux paramètres:
a) [point de montage du système de fichiers], le dossier dans le système de fichiers auquel la partition à redimensionner est montée. Pour un appareil iOS, ce sera /private/var/ si l'on désire redimensionner la partition de données (DATA). b) [taille en octets], la nouvelle taille que l'on désire pour la partition DATA. Il faut calculer celle-ci judicieusement. Par exemple, si je veux redimensionner celle-ci pour qu'elle soit d'une capacité totale de 2 Go, il faut faire 1024 * 1024 * 1024 * (2 Giga-octets). Ceci donne 2147483648 octets. Exécuter HFS Resize à partir du terminal SSH: root#hfs_resize [point de montage du système de fichiers] [taille en octets]
Lorsque l'opération est terminée, il faut obtenir ceci.
Erreur d'affichage de la photo
Si l'on regarde dans les réglages de l'appareil, la taille de la partition DATA devrait être celle spécifiée dans les étapes précédentes.
Erreur d'affichage de la photo







6) Utilisons maintenant GPTfdisk pour créer de nouvelles partitions.
a) Exécuter GPTfdisk à partir du terminal SSH: root#gptfdisk
b) Il faut alors spécifier le chemin du fichier qui correspond au «device» que l'on souhaite utiliser avec gptfdisk, puis appuyer sur la touche «entrée».
Erreur d'affichage de la photo
Dans la plupart des cas, le «device» qu'il faudra utiliser avec GPTfdisk sera /dev/rdisk0s1.
Si tout se déroule bien, gptfdisk devrait voir une «Protective MBR» avec une GPT dans la table des partitions comme dans la capture ci-dessus.
Ensuite, saisir «i», puis «2» pour obtenir les informations concernant la partition DATA.
Erreur d'affichage de la photo
On peut alors voir que le «partition-size» de la partition DATA est toujours à 13,5 Go et non à 2 Go tel que ajusté avec HFS Resize. Il faut alors redimensionner celle-ci avec gptfdisk.
c) Pour ce faire, il faut prendre en note le «Partition unique GUID». Dans mon cas, ce GUID unique est DB4F21A0-F6B9-4B4C-B73F-1E1AA8401F2E tel que dans la photo ci-haut.
d) Ensuite, il faut supprimer la partition DATA en saisissant «d» et touche «entrée» pour validée. Puis, «2» et touche «entrée» pour valider.
Saisir «print» pour voir si la suppression s'est bien déroulée. Il devrait y rester que la partition System.
Erreur d'affichage de la photo
e) Il faut ensuite recréer la partition DATA. Saisir «n», puis touche «entrée» pour valider. L'outil gptfdisk choisira automatiquement 2 comme numéro de nouvelle partition.
Gardons le premier secteur («first sector») de cette partition par défaut en appuyant simplement sur la touche «entrée».
On ajuste ensuite le dernier secteur («last sector») de cette partition selon la taille que l'on désire lui attribuer. Il y a un petit calcul mathématique à effectuer pour bien faire la tâche.
Prenons la taille en octet que nous avons passé en paramètre à l'outil HFS Resize, puis divisons celle-ci par le block-size du système de fichiers (8192 octets dans la plupart des cas) pour obtenir le nombre de secteurs.
Dans le cas de mon appareil, l'opération sera 2147483648 octets / 8192 octets de bloc-size = 262144 secteurs.
Additionner ce nombre de secteurs au nombre qui définit la position du premier secteur de la partition (secteur par défaut).
Dans le cas de mon appareil, le secteur de départ de la partition DATA sera 176339. On additionne alors 176339 + 262144, ce qui donne 438483.
Saisir la valeur obtenue pour le «last-sector» de la partition, puis appuyer sur la touche «entrée».
Appuyer à nouveau sur la touche «entrée» pour conserver le type «Apple HFS/HFS+».
Erreur d'affichage de la photo






f) Attribuons un nom pour cette partition. Pour ce faire, «c» ensuite la touche «entrée» puis choisir «2» pour le numéro de la partition et appuyer sur «entrée».
Définir le nouveau nom pour la partition, puis confirmer celui-ci en appuyant sur «entrée».
Erreur d'affichage de la photo
g) Entrer dans le mode expert en appuyant sur «x» ensuite «a» pour configurer les attributs d'une partition, puis choisir la partition numéro «2».
Erreur d'affichage de la photo
On définit ensuite des attributs spécifiques pour cette partition. Saisir «48» ensuite confirmer en appuyant sur «entrée», puis «49» ensuite confirmer en appuyant sur «entrée».
Appuyer une second fois sur «entrée» pour sortir.
Erreur d'affichage de la photo
Ces deux attributs doivent être définis pour les partitions de données seulement, pas pour celles dont un système d'exploitation iOS sera installé.
Il faut ensuite restaurer le «Partition unique GUID» que nous avons pris en note précédemment sur cette nouvelle partition. En résumé, nous avons conservé le «Partition unique GUID» de la partition de données originale (celle qui utilise tout le reste de l'espace libre sur le disque). Ensuite, nous avons supprimé celle-ci pour la créer de nouveau, mais d'une taille plus petite. Le «Partition unique GUID» de la partition de données originale doit alors être restauré sur la nouvelle partition afin que les paramètres d'origine soient conservés. h) Toujours en mode expert, appuyer sur la touche «c» puis sur «entrée». Ensuite, sélectionner la partition numéro 2 en appuyant sur «2» et confirmer en appuyant sur «entrée».
Saisir (Copier/Coller) le GUID pris en note précédemment, puis confirmer en appuyant sur «entrée».
Erreur d'affichage de la photo
Sortir du mode expert en appuyant sur «m».
Saisir «print», puis s'assurer que la partition numéro 2 est bien de la taille désirée.
Erreur d'affichage de la photo
i) Afin de créer des partitions aditionnelles, un redimensionnement de la table des partitons est nécessaire pour que celle-ci puisse accueillir plus de deux partitions.
Pour ce faire, il faut revenir en mode expert en appuyant sur «x» puis sur la touche «entrée».
Ensuite, il faut appuyer sur «s» puis sur la touche «entrée».
On doit alors spécifier la nouvelle taille de la table des partitions. Saisir la valeur «4» permettra à la table de partition de contenir 4 partitions (deux additionnelles). Ensuite, appuyer sur «entrée» pour confirmer.
Erreur d'affichage de la photo
Sortir du mode expert en appuyant sur «m».
j) Nous pouvons alors procéder à l'ajout de partitions additionnelles.






k) Création d'une partition système qui contiendra les fichiers d'un second système iOS.
Saisir «n», puis touche «entrée» pour valider. L'outil gptfdisk choisira automatiquement 3 comme numéro de nouvelle partition.
Gardons le premier secteur («first sector») de cette partition par défaut en appuyant simplement sur la touche «entrée».
On ajuste ensuite le dernier secteur («last sector») de cette partition selon la taille que l'on désire lui attribuer. Il y a un petit calcul mathématique à effectuer pour bien faire la tâche.
Choisissons une taille de partition qui permettera de stocker complètement ce second système iOS. Prenons par exemple 2 Go (1024 * 1024 * 1024 * 2) = 2147483648. Divisons celle-ci par le block-size du système de fichiers (8192 octets dans la plupart des cas) pour obtenir le nombre de secteurs.
Dans le cas de mon appareil, l'opération sera 2147483648 octets / 8192 octets de bloc-size = 262144 secteurs.
Additionner ce nombre de secteurs au nombre qui définit la position du premier secteur de la partition (secteur par défaut).
Dans le cas de mon appareil, le secteur de départ de la nouvelle partition sera 438483 (obtenu à l'étape e). On additionne alors 438483 + 262144, ce qui donne 700627.
Saisir la valeur obtenue pour le «last-sector» de la partition, puis appuyer sur la touche «entrée».
Appuyer à nouveau sur la touche «entrée» pour conserver le type «Apple HFS/HFS+».
l) Attribuons un nom pour cette partition. Pour ce faire, «c» ensuite la touche «entrée» puis choisir «3» pour le numéro de la partition et appuyer sur «entrée».
Définir le nouveau nom pour la partition, puis confirmer celui-ci en appuyant sur «entrée».
Saisir «print», puis s'assurer que la nouvelle partition a bien été créee.
Erreur d'affichage de la photo
m) Création d'une partition de données qui contiendra les fichiers de l'utilisateur.
Saisir «n», puis touche «entrée» pour valider. L'outil gptfdisk choisira automatiquement 4 comme numéro de nouvelle partition.
Gardons le premier secteur («first sector») de cette partition par défaut en appuyant simplement sur la touche «entrée».
On ajuste ensuite le dernier secteur («last sector») de cette partition selon la taille que l'on désire lui attribuer. Il y a un petit calcul mathématique à effectuer pour bien faire la tâche.
Choisissons une taille de partition quelconque. Prenons par exemple 2 Go (1024 * 1024 * 1024 * 2) = 2147483648. Divisons celle-ci par le block-size du système de fichiers (8192 octets dans la plupart des cas) pour obtenir le nombre de secteurs.
Dans le cas de mon appareil, l'opération sera 2147483648 octets / 8192 octets de bloc-size = 262144 secteurs.
Additionner ce nombre de secteurs au nombre qui définit la position du premier secteur de la partition (secteur par défaut).
Dans le cas de mon appareil, le secteur de départ de la nouvelle partition sera 700627 (obtenu à l'étape k). On additionne alors 700627 + 262144, ce qui donne 962771.
Saisir la valeur obtenue pour le «last-sector» de la partition, puis appuyer sur la touche «entrée».
Appuyer à nouveau sur la touche «entrée» pour conserver le type «Apple HFS/HFS+».
n) Attribuons un nom pour cette partition. Pour ce faire, «c» ensuite la touche «entrée» puis choisir «4» pour le numéro de la partition et appuyer sur «entrée».
Définir le nouveau nom pour la partition, puis confirmer celui-ci en appuyant sur «entrée».
Saisir «print», puis s'assurer que la nouvelle partition a bien été créee.
o) Entrer dans le mode expert en appuyant sur «x» ensuite «a» pour configurer les attributs d'une partition, puis choisir la partition numéro «2».
On définit ensuite des attributs spécifiques pour cette partition. Saisir «48» ensuite confirmer en appuyant sur «entrée», puis «49» ensuite confirmer en appuyant sur «entrée».
Appuyer une second fois sur «entrée» pour sortir.
Sortir du mode expert en appuyant sur «m».
Saisir «print», puis s'assurer que la nouvelle partition a bien été créee.
Erreur d'affichage de la photo
Pour la création d'une partition système (contiendra les fichiers du système iOS), refaire l'étape k) puis l).
Pour la création d'une partition de données (contiendra les données de l'utilisateur), refaire les étapes m) à o).
Saisir «print», puis s'assurer que les nouvelles partitions ont bien été créees.
p) Si tout est tel que désiré, appuyer sur «w» pour écrire les changements sur le disque puis confirmer avec «y». Attention, il peut y avoir corruption du système si l'écriture des changements échoue.
q) Redémarrer l'appareil pour s'assurer que le système n'est pas corrompu. Si celui-ci démarre en mode recovery, l'écriture des changements apportés au partition a probablement échouée et il faudra restaurer iOS puis recommancer depuis le début.
r) Exécuter de nouveau GPTfdisk à partir du terminal SSH: root#gptfdisk
s) Il faut alors spécifier le chemin du fichier qui correspond au «device» que l'on souhaite utiliser avec gptfdisk, puis appuyer sur la touche «entrée».
t) Saisir «print», puis s'assurer que les partitions crées sont toujours présente.
L'appareil est alors correctement partitionné.
On peut aussi vérifier si les «devices» qui correspondent aux nouvelles partitions sont bien présents dans /dev/. Pour ce faire, root#ls /dev/. Il devrait y avoir un "disk0s1s3", un "disk0s1s4" et ainsi de suite selon le nombre de nouvelles partitions.
Erreur d'affichage de la photo





6) Poursuivons avec le formatage des nouvelles partitions, basé sur le procédé de restauration d'un appareil iOS.
Lorsque l'on réinstalle complètement iOS sur l'appareil, le «daemon» de restauration (restored_external) utilise l'outil newfs_hfs pour formater les deux partitions.
On peut voir la sortie (output) de restored_external dans le log de restauration généré par iTunes.
Erreur d'affichage de la photo
Encadré en rouge sont les commandes exécutées par restored_external pour formater la partition système ainsi que celle des données.
Reproduisons cela dans un terminal en SSH en adaptant la commande aux nouvelles partitions:
Pour une partition système: root#newfs_hfs -s -v SystemX -b 8192 -n a=8192,c=8192,e=8192 /dev/disk0s1sY
Remplacer X par une lettre représentant le numéro du système installé, exemple B pour «Système B».
Remplacer Y par le numéro de la partition qui accueillera le système. Dans mon cas, ce sera /dev/disk0s1s3. La partition de données: root#newfs_hfs -s -v DataX -J -P -b 8192 -n a=8192,c=8192,e=8192 /dev/disk0s1sY
Remplacer X par une lettre représentant le numéro du système installé qui est associée à cette partition de données, exemple B pour «Data B».
Remplacer Y par le numéro de la partition qui accueillera cette partition de données. Dans mon cas, ce sera /dev/disk0s1s4.
Erreur d'affichage de la photo







7) Il faut maintenant monter ces nouveaux volumes sur le système de fichiers hôte avec mount_hfs.
Aller à la racine du système avec root#cd /, puis créer un répertoire vide pour chaque partitions additionnelles créees précédemment.
root#mkdir [Nom du répertoire]
Nommer ces répertoires comme suit:
SystemX, dont X est une lettre représentant le numéro du système installé, exemple B pour «Système B».
DataX, dont X est une lettre représentant le numéro du système installé qui est associée à cette partition de données, exemple B pour «Data B».
Monter les partitions dans leur répertoire correspondant avec la commande root#mount_hfs /dev/disk0s1sX /[System,Data]X
Si le système principale de l'appareil est iOS 7 et plus récent, il se peut que mount_hfs retourne le message suivant:
mount_hfs: Could not create property for re-key environment check: No such file or directory
Cela ne semble pas avoir d'influence sur la mise en place du multi-amorçage.
Erreur d'affichage de la photo

8) Télécharger le fichier de mise à jour de l'appareil (.ipsw) qui correspond à la version d'iOS désirée comme système d'exploitation secondaire.
On retrouve tous les versions d'iOS disponibles pour chacun des appareils sur TheiPhoneWiki, à l'adresse suivante:
Téléchargement des firmwares iOS

Il faut s'assurer que les clés de decryption pour ce firmware soient disponibles, sinon le multi-amorçage sera très limité (tethered et seulement pour les appareils vulnérables à un exploit de bas-niveau).
En cliquant sur le numéro de révision (build number) d'une version d'iOS sur TheiPhoneWiki, on arrive sur la page qui contient les clés de decryption si celles-ci sont disponibles.
Dans mon cas, celles pour iOS 6.1.3 (10B329) pour l'iPhone 4 (iPhone 3,1 - N90AP) sont disponibles.
Cette version d'iOS peut alors être utilisé dans le but de faire un dual-boot iOS 7.1.2 (primaire) avec iOS 6.1.3 (secondaire).

9)Une fois le fichier de mise à jour de l'appareil (.ipsw) téléchargé, il faut décrypter l'image du système de fichiers (.dmg).
L'image du système de fichiers (RootFS DMG) est toujours le fichier ayant la plus grande taille à la racine du fichier .ipsw téléchargé précédemment.
Les fichiers de mise à jour des appareils iOS (.ipsw) sont des archives .zip que l'on peut facilement extraire. On peut alors renommer le .ipsw en .zip, puis en extraire le fichier .dmg du système de fichiers iOS.
Il y a plusieurs méthodes pour parvenir à décrypter cette image. En voici quelques unes :
a) Utilisation de l'outil iDecrypt (Mac seulement), permet de décrypter les images systèmes d'iOS 5.x et plus ancien.
L'utilisation est simple, sélectionner le .dmg encrypté du système de fichiers et le dossier de sortie de l'image décryptée, puis saisir la clé de décryption à l'endroit prévu à cet effet.
Erreur d'affichage de la photo
b) Utilisation de l'outil de jailbreak RedSn0w pour créer un «Custom Firmware» dont l'image du système sera automatiquement décryptée. Cette méthode permet la décryption des images systèmes d'iOS 6.x et plus ancien et est limité aux appareils supportés par RedSn0w.
Pour procéder à la création du «Custom Firmware» il faut executer RedSn0w, puis sélectionner «Extras» et ensuite «Custom IPSW».
Extraire l'image .dmg décryptée qui se trouve dans le fichier .ipsw crée.
c) Utilisation de l'outil «dmg» d'XpwnTools. Celui-ci fonctionne avec la plupart des versions d'iOS, incluant iOS 9.x qui est la dernière version majeure à ce jour.
L'outil «dmg» fonctionne comme ceci: pmbonneau#dmg extract [Image système source] [Image système destination] -k [Clé de décryption] Par exemple, pour décrypter le .dmg du système de fichiers d'iOS 6.1.3 (10B329) pour l'iPhone 4 (iPhone 3,1 - N90AP), la commande est celle-ci:
pmbonneau#dmg extract 048-2748-005.dmg 048-2748-005_dec.dmg -k c676166434b79cbde341e094000dfc47b3161034371b25a9054880a757d73aead553a317
Pour vérifier que l'image est bien décryptée, voici deux options simples:
a) Sur un système Mac, monter l'image .dmg en double-cliquant sur le fichier. Un nouveau volume sera monté et on devrait pouvoir accéder au contenu.
b) Sur un système Windows, un logiciel nommé TransMac permet de voir le contenu de ces images.







10) Les images .dmg utilisés pour les appareils iOS sont compressées au format UDZO pour accélérer le processus de restauration. En effet, il est plus rapide d'envoyer à l'appareil une image de 1 Go compressée qu'une de 1.5 Go décompressée.
La décompression de l'image se fait au fur et à mesure par ASR (Apple System Restore) lors du processus de restauration.
Puisque nous devons copier manuellement le contenu de l'image .dmg vers une partition au lieu de faire appel à ASR (quelques soucis avec LwVM), il est préférable que l'image soit dans un format décompressé.
Pour ce faire, un ordinateur sous Mac OS X sera nécessaire. Utilisons l'outil en ligne de commande «hdiutil» intégré à OS X pour procédé à la décompression de l'image.
pmbonneau-mac#hdiutil convert -format UDTO 048-2748-005_dec.dmg -o 048-2748-005_dec_UDTO.dmg
Le format UDTO est un format d'image .dmg non-compressé et en lecture seule. L'extension du fichier aura probablement changé pour .cdr, retirer celle-ci pour conserver uniquement .dmg.

11) À partir d'une connexion SSH, téléverser l'image au format UDTO vers l'appareil. Choisir un endroit dont l'espace libre sur la partition sera suffisant. Éviter les partitions qui hébergent les systèmes.

12) Il faut maintenant monter l'image dans un répertoire sur l'appareil.
Pour ce faire, il y a deux possibilités soit une simple et une plus complexe.
a) La méthode simple consiste à installer «iFile» à partir de Cydia, puis ouvir l'image .dmg décompressée. Celle-ci sera montée dans le répertoire "/var/mnt/mount[X]", dont X représente le numéro du point de montage (si l'on monte plus d'une image à la fois).
b) La méthode plus complexe consiste à utiliser les outils «attach» et «detach» qui sont disponibles dans mon repository Cydia.
L'outil «attach» permet d'associer l'image .dmg à un device dans /dev et «detach» permet de la dissocier.
Associer l'image .dmg à un device: root#attach /DataB/048-2748-005_dec_UDTO.dmg
Il faut ensuite monter ce nouveau «device» dans un répertoire (comme on le fait pour une partition) par cette commande: root#mount_hfs /dev/disk1s3 /mnt
On monte alors l'image .dmg dans le dossier /mnt.
Erreur d'affichage de la photo

13) Procéder à la copie intégrale du contenu de l'image vers une partition système secondaire en utilisant une des méthodes suivantes:
a) Utilisation de la commande «cp» avec les arguments -rfp (récursif, force, permissions), root#cp -rfp /mnt/* /SystemB/
Attendre jusqu'à la fin de la copie.
b) Utilisation de la commande «cp» avec l'argument -a (attributs), root#cp -a /mnt/* /SystemB/
Attendre jusqu'à la fin de la copie.

14) Procéder à la copie intégrale du dossier /var de l'image vers la partition de données secondaire associée à la partition système de l'étape 13 en utilisant une des méthodes suivantes:
a) Utilisation de la commande «cp» avec les arguments -rfp (récursif, force, permissions), root#cp -rfp /mnt/var/* /DataB/
Attendre jusqu'à la fin de la copie.
b) Utilisation de la commande «cp» avec l'argument -a (attributs), root#cp -a /mnt/var/* /DataB/
Attendre jusqu'à la fin de la copie.

15) Apporter les modifications à la «fstab» du système secondaire de façon à ce qu'elle soit cohérente aux partition utilisées par ce système. Le noyau aura besoin de cette information pour monter la racine du système secondaire ainsi que la partition de données correspondante sur /var. root#cd /SystemB/etc/
Utilisation d'un éditeur de texte, root#nano fstab

/dev/disk0s1s3 / hfs rw 0 1
/dev/disk0s1s4 /private/var hfs rw 0 2

Enregistrer avec la fontion prévue à cet effet dans l'éditeur de texte.
Nous y avons apporté trois modifications:
a) Cohérence aux partition utilisées par ce système (monter la racine «/» système secondaire à partir de /dev/disk0s1sX et /private/var du système secondaire à partir de /dev/disk0s1sY.
b) Montage de la partition système en «rw» (lecture et écriture).
c) Retrait des «flags», «nosuid» et «nodev» concernant l'élèvation de privilèges pour la partition de données.







16) Résoudre le problème de cohérence entre les versions d'iOS et le keybag système.
Un des principaux problèmes que l'on peut rencontrer lors de l'implantation d'un multi-amorçage iOS est l'erreur de chargement du keybag système, soit le «Fatal kb_load() error, rebooting in recovery mode» lors du démarrage (niveau kernel).
Voici deux cas possibles qui peuvent causer cette erreur:
a) Le fichier keybag système (systembag.kb) n'est pas présent dans le dossier /private/var/keybags/.
Par défaut, le fichier systembag.kb n,est pas présent dans ce dossier. C'est le «daemon» de restauration (restored_external) qui appel le framework MKBKeyBagCreateSystem() pour le créer dans ce dossier vers la fin du processus de restauration.
Dans le cas d'une restauration manuelle tel est le cas de l'implantation d'un système iOS secondaire, cet appel pour la création du keybag système ne se fera pas.
b) Le format du keybag système est incompatible avec l'instance d'iOS en cours d'exécution, tel est le cas lors d'un multi-amorçage impliquant iOS 7.1.2 (primaire) vers des versions antérieures (secondaire).
Il y a incompatibilité du keybag système d'iOS 7.1.2 avec iOS 6.x et plus ancien. C'est à dire que l'on ne peut pas copier le keybag système d'iOS 7.1.2 vers le dossier correspondant de la partition de données du système plus ancien.
On aura le kb_load() error lors du démarrage.
Un autre keybag système, mais dans le format accepté par l'ancienne version (système secondaire) doit être généré par appel au framework MKBKeyBagCreateSystem(). Il y a cependant un problème assez complexe qui survient lors de la génération de ce second keybag système.
Apple a fait d'iOS un système très sécuritaire, le keybag système est l'un de ces méchanisme de sécurité. Lorsque celui-ci est crée lors de la restauration, un keybag associé à ce nouveau keybag système est aussi généré dans l'«effacable-storage» de l'appareil. Cet emplacement se trouve sur une partition cachée dans la NAND de l'appareil, difficile d'accès. Chaque fois que l'on construit un keybag système par appel à MKBKeyBagCreateSystem(), il y a mise à jour de l'«effaceable-storage» pour le keybag associé. On perd alors définitivement le keybag système associé au keybag système du système primaire, donc kb_load() error au démarrage du système primaire (une restauration complète de l'appareil s'impose alors, si c'est du A5 et plus récent).
Par contre, l'inverse ne soulève pas le kb_load() error, c'est à dire qu'utiliser un keybag système d'iOS 6.x (primaire) avec iOS 7.1.2 (secondaire) ne retourne pas d'erreur.
Voici certains cas de multi-amorçage et la solution pour arranger le keybag système:
a) Si le multi-amorçage implique deux versions d'iOS qui utilisent le même format de keybag système, par exemple iOS 6.x (primaire) avec 5.x (secondaire), le keybag système d'iOS 6.x (primaire) peut être copié vers la partition de données d'iOS 5.x (secondaire) en utilisant les commande suivante :
root#mkdir /Data[X]/keybags, celle-ci fera la création du dossier qui accueil les keybags dans la partition de données d'un système secondaire.
root#cp -rfp /private/var/keybags/systembag.kb /DataX/keybags/, celle-ci fait la copie du keybag système.
b) Si le multi-amorçage implique deux versions d'iOS qui n'utilisent pas le même format de keybag système, par exemple iOS 7.1.2 (primaire) avec 6.x (secondaire), le keybag système doit être généré dans le format compatible sans écraser le keybag qui se trouve dans l'«effaceable-storage» pour le système primaire.
Pour ce faire, il faut construire un outil qui fera l'appel au framework MKBKeyBagCreateSystem() pour créer un keybag système secondaire.
Une version compilée de l'outil est disponible sur mon «repository» Cydia, sous le nom de mksysbag.
Installer ce paquet, mais surtout ne pas exécuter mksysbag. Sinon, on perd définitivement le keybag système associé au keybag système du système primaire.
Pour résoudre le problème, il faut d'abord copier l'outil mksysbag qui se trouve dans le dossier /usr/bin vers le dossier /usr/bin de l'instance secondaire d'iOS.
root#cp -rfp /usr/bin /SystemX/usr/bin
Ensuite, créer un fichier launchd.conf avec la commande suivante:
root#nano /SystemX/etc/launchd.conf
Dans ce fichier, placer cette commande à la première ligne:
bsexec .. /usr/bin/mksysbag
Ceci fera en sorte qu'un nouveau keybag système sera généré au démarrage du système secondaire avant que keybagd (le «daemon» qui charge le keybag système) commence à charger celui-ci.
Donc pas de kb_load() error, mais on perd définitivement le keybag système associé au keybag système du système primaire, car il y aura écrasement de ce keybag dans l'«effaceable-storage».
La résolution de ce problème se fait au niveau du DeviceTree dans le démarrage de bas niveau. Ce sera dans la partie A (démarrage «Untethered») ou B (démarrage «Tethered»).

17) Cette étape est nécessaire pour le multi-amorçage de type «untethered», mais facultative pour l’amorçage de type «tethered». Celle-ci consiste à installer les kernels secondaires dans le système de fichiers de façon cohérente avec les chargeurs d’amorçage iBoot secondaires «flashées» dans l’étape A.
Une des modifications à apporter au conteneur IMG3 d’iBoot (voir le fichier iBoot.n90ap.RELEASE.txt utilisé à l’étape A) consiste à modifier la dernière lettre qui compose le nom de fichier du kernel qu'iBoot recherchera dans le système de fichiers pour que celui-ci exécute le kernel de l’instance secondaire.
Par exemple, j’ai remplacé 0x65 (le dernier «e» de «kernelcache») par 0x62 (pour «kernelcachb») à l’étape A lors de l’application des modifications sur le conteneur de l’iBoot secondaire étiqueté par «ibob». Ceci fait en sorte que cet iBoot secondaire exécutera le kernel nommé «kernelcachb».
Allons dans le dossier «Original», crée à l’étape A. Ensuite faire une copie du fichier kernelcache.release.n90_dec vers le dossier «Patché», aussi crée à l’étape A. Renommer ce fichier en «kernelcach[e]», dont la valeur entre crochet est une variable. Dans mon cas, je renomme celui-ci en «kernelcach[b]».
À partir d’une connexion SSH ou bien AFC2 (DiskAid, iFunBox, etc.), transférer le fichier «kernelcach[e]» vers le dossier /System/Library/Caches/com.apple.kernelcaches qui est dans le système de fichiers de l’appareil.
Transférer aussi le fichier LLBB.[BoardID].[Security Fusing].img3 vers le dossier de votre choix dans le système de fichiers de l’appareil.

18) Sur l’appareil, ouvrir l’application «Cydia». Rechercher, puis installer les paquets suivants :
a) «kloader for iOS 6.x». Celui-ci permettra d’exécuter le chargeur d’amorçage de premier niveau d’une instance d’iOS secondaire à partir de l’instance courante.
b) «iOS[6]Bootstrap». C’est une application minimale qui exécute un script bash. Celle-ci permettra d’exécuter «kloader» à partir de l’écran d’accueil. Le script bash exécuté par cette application se trouve dans le dossier /usr/bin sur l’appareil et se nomme « iOS[6]Bootstrap.sh. Le «6» est variable selon l’instance secondaire d’iOS installée.

19) À partir d’une connexion SSH, aller dans le dossier /usr/bin.
root#cd /usr/bin
Ouvrir le script «iOS[6]Bootstrap.sh» en utilisant l’éditeur de texte «nano».
root#nano iOS[6]Bootstrap.sh
Modifier le chemin du LLB secondaire que «kloader[6]» doit exécuter selon l’endroit où celui-ci se trouve dans le système de fichiers (transféré à l’étape 17).
Le script «iOS[6]Bootstrap.sh» doit ressembler à ceci.
#!/bin/bash
kloader6 [Chemin du LLB]
Si le système primaire installé sur l'appareil est iOS 5.x, il faut avoir installé depuis Cydia la version de kloader compatible avec iOS 5.x et adapter la commande dans le script.
#!/bin/bash
kloader5 [Chemin du LLB]

20) Sur l’appareil, exécuter l’application «iOS[6]» qui se trouve sur l’écran d’accueil. L’écran deviendra noir et l’appareil ne sera plus dans un état actif. Appuyer sur le bouton d’allumage et l’instance d’iOS secondaire devrait démarrer.


Copyright © 2020 — Pierre-Marc Bonneau

Conditions d'utilisation