Décompilation d’une application iOS

La décompilation d’un binaire vous permet de récupérer le code source (ou du moins une partie) et donc de pouvoir mieux comprendre son fonctionnement.

Les applications iOS sont chiffrées par Apple pour empêcher la décompilation, il vous faut donc avant tout obtenir un binaire non chiffré, ce que j’ai pris soin de détailler au préalable dans cet article.

Une fois que vous avez déchiffré le binaire vous pouvez commencer à étudier ce dernier. Ici je vais vous expliquer comment obtenir les headers de l’application (liste des classes et méthodes utilisées) grâce à l’outil class-dump, interagir avec l’application en live avec cycript et comment analyser le contenu des méthodes en assembleur grace au décompilateur Hopper.

Utilisation de class-dump

Class-dump est un utilitaire sous forme de ligne de commande vous permettant de lire les données du runtime Objective-C d’un fichier Mach-O. Ces information sont les mêmes que celles affichées par la commande otool -ov mais présentées sous la forme habituelle d’un header Objective-C.

 

Capture-d’écran-2015-10-13-à-13.36.42Après exécution de class-dump on peut lire les headers Objective-C du binaire (ici enregistrés dans ./2048-Headers/).

 

Capture-d’écran-2015-10-13-à-13.52.14Dans le cas de l’application 2048 l’important du jeu est stocké dans ViewController.h, notamment les fonctions d’envoi des scores (et réalisations) ainsi que les fonctions de contrôle du jeu.

 

Capture-d’écran-2015-10-13-à-14.02.45A ce point nous pouvons déjà voir la structure de base de l’application, l’organisation des classes et méthodes et en déduire son fonctionnement global. Pour confirmer ce fonctionnement nous allons injecter ces commandes pendant l’execution de l’application avec l’outil cycript.

Manipulation avec cycript

Cycript est un outil permettant d’explorer et manipuler les application iOS et Mac OS X pendant leur execution, cela avec de simples commandes en JavaScript (et Objective-C++).

Pour manipuler l’application je commence par installer cycript depuis cydia et j’ouvre l’application à tester (ici 2048) sur mon iPhone. Je me connecte ensuite à ce dernier en SSH depuis mon ordinateur, je recherche le pid (identifiant du processus) de l’application et je lance cycript sur ce processus.

 

Capture-d’écran-2015-10-13-à-14.38.45Après test, les méthodes rightSwipeHandle:leftSwipeHandle:downSwipeHandle: et upSwipeHandle: commandent bien le jeu (chaque appel fait bouger les carrés sur mon iPhone) et la méthode reportScore: envoi le score passé en argument sur le GameCenter. Ce qui fait que je suis maintenant premier sur le classement du jeu…

Capture-d’écran-2015-10-13-à-14.53.38Je vais donc m’empresser de supprimer mes scores (dans le GameCenter) pour ne pas gâcher l’experience des autres joueurs.

 Décompilation avec Hopper

Hopper est un outil d’analyse d’exécutables prenant en charge un grand nombre d’architectures, il permet d’étudier et modifier un exécutable avec une grande simplicité grâce à ses fonctions de recherche et d’affichage de code (blocks d’asm et pseudo-code).

Capture-d’écran-2015-10-13-à-15.39.59Ici on peut voir le détail de la méthode reportScore: en assembleur, ce qui donnerais en Objective-C quelque chose comme :

Normalement Hopper inclus un outil d’affichage de pseudo-code qui donnerais surement quelque-chose comme le code que j’ai écrit au dessus, mais il ne fonctionne pas encore avec les binaires iOS 64bits donc je vous conseille de vous familiariser avec l’assembleur 🙂

Vous pouvez aussi utiliser otool -tv pour afficher les instructions en assembleur d’une méthode, ici reportScore: :

 

Capture-d’écran-2015-10-15-à-12.45.02Pour plus d’informations sur l’utilisation d’Hopper je vous conseille de consulter la page de tutoriel : ici.

4 réflexions au sujet de « Décompilation d’une application iOS »

  1. J’ai lu les articles intéressants et je souhaiterai vous contacter mais je n’ai trouver aucune adresse mail..

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *