Méthode pour la sauvegarde d'un firmware

Lors du processus global de restauration d'un appareil iOS, il ya decryption, puis restauration d'une image au format .dmg qui contient le système de fichier de la version d'iOS concernée vers /dev/disk0s1s1. Le «RamDisk» de restauration fait ensuite la préparation de la partition de données (/dev/disk0s1s2). En résumé, on passe de .dmg encrypté (tel que retrouvé dans le fichier .IPSW) vers un système de fichiers (FS pour «FileSystem») décrypté. Une fois l'appareil «Jailbreaké», tout le système de fichiers est accessible en lecture et écriture et ce, avec tous les droits.

L'objectif de la sauvegarde d'un firmware est de faire l'inverse, soit retourner du système de fichiers vers l'image au format .dmg primitive, mais décryptée.
Un retour en .dmg peut s'avérer utile pour plusieurs raisons, dont trois principales soit:
1) La mise en place d'un multiboot vers des versions antérieurs ou ultérieures d'iOS dont on ne connait pas les clés de décryption, en supposant que celles de la version actuellement installée soient connues. Il pourrait être alors possible d'utiliser les chargeurs d'amorçage décryptés de la version actuellement installée (celle dont les clés sont connues) pour démarrer la version dont le «RootFS» .dmg reconstruit a été restauré. Ceci est seulement envisageable avec les versions très semblables, telles que 5.1 et 5.1.1, 8.4 et 8.4.1, etc. Cette utilitée est plutôt un PoC (Proof of Concept), il est fort probable que cela ne fonctionne pas pour tous les versions.
2) La restauration d'un firmware dont les clés de décryption ne sont pas connues, déja installé sur un appareil vers un autre appareil de même modèle par l'usage d'un exploit BootROM ou iBoot. Un «TetheredBoot» sera nécéssaire pour démarrer l'appareil, puisque la chaîne de démarrage en mode DFU ne sera pas correctement signée. Il pourrait aussi être possible de manuellement restaurer ce .dmg pas crypté vers une seconde partition système, donc faire un dual boot et pourvoir utiliser kloader avec les bootloaders appropriés.
Étapes à suivre pour construire une image .dmg à partir d'un système de fichiers.
AVERTISSEMENT, la méthode suivante nécessite l'utilisation de commandes qui interviennent sur la base du système iOS. Une simple erreur de syntaxe peut endommager le système de fichiers et ainsi provoquer une perte irrécupérable des données. Je ne suis pas responsable de l'utilisation que vous faites de ce tutoriel, de la perte des données ainsi que de tout dommages causés à votre matériel.
1) Procéder au «Jailbreak» de l'appareil pour avoir accès en lecture et écriture sur le système de fichiers et ce, avec tous les droits. 2) Vérifier que le service de transfert AFC2 est actif ou bien installer OpenSSH à partir de Cydia dans le cas contraire. 3) Se connecter à l'appareil soit par AFC2 (iPhoneExplorer, Diskaid) ou SSH (WinSCP, Fugu) et transférer les utilitaire suivants dans le dossier /var.
a) attach: Sert à lier une image .dmg en tant que «device» (/dev).
b) detach : Retire la liaison de l'image .dmg au «device» attaché.
c) unzip : Sert à extraire une archive .zip

4) Avec un ordinateur sous Mac OS X, créer une image .dmg vide en lecture et écriture (RW, Read/Write) à l'aide de l'utilitaire de disque. La taille de l'image doit être suffisamment grande pour accueillir l'intégrité du système iOS à sauvegarder.
5) Puisque l'image disque .dmg nouvellement créée est vide (contient presque seulement des zéros), compresser celle-ci à l'aide de l'outil .zip intégré à Mac OS X permettera de réduire considérablement les temps de transfert.
6) Transférer l'archive .zip qui contient l'image disque dans le dossier /var de l'appareil iOS par AFC2 ou SSH.
7) Créer un dossier «backup» dans /var/mnt de l'appareil. On a alors /var/mnt/backup/.
8) Changer le répertoire courant (current directory) pour /var avec la commande «cd /var».
9) Décompresser l'archive .zip avec la comamnde «./unzip ./archive.zip».
10) Déplacer le fichier .dmg décompressé dans le répertoire /var/mnt avec la commande «mv ./[image.dmg] /var/mnt»
11) Lier le fichier image .dmg en tant que «device» (/dev) avec la commande «./attach ./mnt/[image.dmg]».
12) Monter l'image .dmg liée au système de fichiers avec la commande «mount_hfs /dev/disk1s2 /var/mnt/backup/». Celle-ci montera l'image .dmg dans le dossier /var/mnt/backup. Il est important de s'assurer que «disk1s2» est bien le «device» liée à notre image.
13) Changer le répertoire courant (current directory) pour /var/mnt/backup avec la commande «cd /var/mnt/backup». S'assurer avec «ls -la» qu'il n'y a pas déja des fichiers présents dans ce dossier tels que .trashes et .fseventsd qui sont des fichiers crées par Mac OS X. Si ceux-ci sont présents, il faut les supprimer avec la commande «rm -rf ./.trashes». 14) Changer le répertoire courant (current directory) pour / avec la commande «cd /». 15) Entrer la commande qui fera la magie, soit «rsync -rav --exclude="/var/mnt/" --exclude="/private/var/mnt/" / /var/mnt/backup/». Celle-ci synchronisera le système de fichiers d'iOS à partir de la racine (/) vers notre image .dmg montée dans /var/mnt/backup.
16) Une fois l'opération terminée, faire «ls -la /var/mnt/backup» et s'assurer que le système de fichiers d'iOS s'est bien synchronisé. On doit voir les mêmes dossiers que dans la racine /.
17) Démonter proprement l'image .dmg du répertoire /var/mnt/backup avec «umount /var/mnt/backup» et retirer la liaison de l'image .dmg avec le «device» /dev/[device] en utilisant «/var/detach /dev/disk1s2»
18) En utilisant une connexion AFC2 ou SSH, transférer l'image .dmg qui se trouve dans /var/mnt vers l'ordinateur.

Copyright © 2017 — Pierre-Marc Bonneau

Conditions d'utilisation