Téléphone Android chiffré, écran cassé, données perdues? Que nenni!
Et voilà qu'après une mauvaise chute, mon téléphone se retrouve sans écran. Et si l'écrasante majorité de mes données sensibles sont automatiquement synchronisée (coucou Syncthing, Radicale etc.), ce n'est pas le cas de ma base de donnée SMS. Vous me direz alors qu'adb est mon ami, oui mais il y a un hic, et pas des moindre : mon téléphone est chiffré par un schéma.
En bon libriste que je suis, mon téléphone (un Samsung Galaxy S4) tourne sur un version communautaire d'Android (Cyanogenmod avec Free_Cyngn) avec un recovery custom : TWRP. Celui-ci propose de monter la partition /data
chiffrée, mais saisir le schéma sur un écran cassé, c'est difficile. Pour corser le tout, j'utilise un schéma de 4*4 points qui n'était pas compatible avec l'interface graphique de TWRP.
Mais comme tout est prévu, il est possible d'utiliser un outil en ligne de commande : twrp
avec adb, mais comment rentrer mon schéma en ligne de commande? Un petit tour sur le sur tracker GitHub de TWRP où utilisateur nommé @smarek donne la solution : un petit programme java pour déduire le mot de passe en fonction du schéma. Mais il va falloir repérer les numéros des points utilisés par votre schéma et installer une bricole...
Trouver la suite de chiffre en fonction du schéma
Si on prend l'exemple de mon pattern de 4*4, il y a 16 points. Le point zéro est en haut à gauche et le point 15 en bas à droite. On pourrait alors le dessiner comme ci-dessous :
Je prends comme exemple le schéma correspond au dessin de droite, les numéros des points sont 0, 4, 8, 12, 9 et 6
Trouver le mot de passe
Avec une petite commande shell
C'est T s T qui donne la méthode dans les commentaires) (Merci!) pour remplacer le programme java par une commande dans le terminal, avec notre schéma d'exemple cela donne :
pattern_in_sh() { echo "unlock code: $(printf '%0.2x' "$@")"; }
pattern_in_sh 0 4 8 12 9 6
Ce qui nous donnera en résultat :
unloack code: 0004080c0906
Créer le programme java
Installation,
Je vais prendre ici l'exemple d'ArchLinux (puisque c'est la distribution que j'utilise). ouvrez un terminal et installez les paquets openjdk
yaourt -S jdk-openjdk8
J'ouvre mon éditeur de texte favori et colle le code suivant :
// file named Pattern.java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class Pattern {
public static void main(String... args) {
//remplacez ces chiffres par ceux issus de votre pattern
int[] pattern = {0,4,8,12,9,6};
byte[] res = new byte[pattern.length];
for( int i = 0; i < pattern.length; i++ ) {
res[i] = (byte) (pattern[i]);
}
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < res.length; i++) {
if ((0xff & res[i]) < 0x10) {
hexString.append("0"
+ Integer.toHexString((0xFF & res[i])));
} else {
hexString.append(Integer.toHexString(0xFF & res[i]));
}
}
System.out.print("unlock code: ");
System.out.println(hexString);
}
}
j'ai bien pris soin de remplacer la suite de chiffre indiqué dans le code par celle déduite de mon schéma; je sépare les chiffres par des virgules. J'enregistre le fichier dans mon dossier personnel, et le nomme Pattern.java. Il ne me reste plus qu'à lancer la compilation du bouzin et son exécution :
javac Pattern.java && java Pattern.java
unlock code: 0004080c0906
Et voilà le mot de passe pour débloquer mes données.
Se connectez au téléphone
Maintenant je démarre le téléphone en mode recovery, pour mon Galaxy S4 c'est la combinaison du bouton d'allumage, du bouton home et de la touche volume haut. Une fois le téléphone démarré je le relie à ordinateur et dans un terminal en mode root je lance (sudo fonctionne aussi):
adb shell twrp decrypt 0004080c0906
Comme tout a bien fonctionné, voici le retour que j'ai dans mon terminal
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
Attempting to decrypt data partition via command line.
Data successfully decrypted, new block device: '/dev/block/dm-0'
Updating partition details...
...done
Maintenant il ne me reste plus qu'a récupérer les données de l'application qui m'intéresse : SMS Secure. Je créé un répertoire de destination sur mon ordinateur et je rapatrie les fichiers avec les commandes
mkdir /root/smssecure
cd /root/smssecure/
adb pull /data/data/org.smssecure.smssecure
Là tous les fichiers de l’application vont êtres disponibles dans le répertoire /root/smssecure. en cas de doute sur le dossier contenant les données à sauvegarder, je peux toujours lancer un adb shell ls -la /data/data/
Restaurer les fichiers
Pour restaurer les fichiers sur mon nouveau téléphone (sur lequel est installé TWRP, c'est évident), je vais d'abord installer l'application en question, puis je le démarre en mode recovery, je le branche en USB et je lance les commandes suivantes :
adb shell mount /data
adb shell ls -la /data/data/org.smssecure.smssecure
drwxr-x--x 2 u0_a87 u0_a87 4096 Nov 30 00:19 .
drwxrwx--x 108 system system 4096 Nov 30 00:19 ..
lrwxrwxrwx 1 install install 39 Nov 30 00:19 lib -> /data/app-lib/org.smssecure.smssecure-1
Ce téléphone n'étant pas (encore) chiffré, je monte de dossier /data
avec une commande classique. Puis je vérifie le propriétaire et le groupe du dossier cible (ici u0_a87). C'est très important pour la suite. Je copie maintenant les éléments précédemment sauvegardées avec les commandes
adb push /root/smssecure/ /data/data/org.smssecure.smssecure/
adb shell "chown u0_a87:u0_a87 /data/data/org.smssecure.smssecure/* -R"
Et voilà mes SMS revenus avec l'aide d'adb et de java, il ne reste plus qu'à redémarrer mon nouveau téléphone.
Conclusion
Cette partie traite seulement les données des applications qui ne sont pas dans le dossier accessibles par l'utilisateur mais bien dans une partie cachée. Il est intéressant de noté qu'une application libre permet de faire facilement des sauvegardes (et restaurations) de ce genre de données : oandbackup. couplé à Openkeychain pour le chiffrement (par clés GPG) et Syncthing, se pourrait-être un excellent moyen de sauvegarder des données des applications non?