Modifier une application iOS

Il existe plusieurs façons de modifier une application iOS (sans avoir accès au code source), vous pouvez éditer les instructions en assembleur avec Hopper ou même modifier certains bits avec un éditeur hexadecimal (je vous conseille Hex Fiend). Ici je vais parler d’une manière plus complète de modifier mais aussi d’ajouter des fonctionnalités à une application.

Tout d’abord pour comprendre la logique de cette technique il faut comprendre une partie du fonctionnement des binaires Mach-O.

Les Mach-O sont constitués de 3 sections principales, le Header, les Load Commands et la section Data.

 

mach_o_segmentsLa partie Load Commands liste les librairies à charger pour l’execution du binaire. Pour modifier l’application nous allons créer une librairie dynamique et l’ajouter aux librairies chargées à l’execution.

Ainsi nous pouvons effectuer toutes les modifications (et ajouts de fonctions) souhaitées dans notre librairie, qui sera ensuite chargée lors de l’ouverture de l’application modifiée.

La modification consistera en 3 étapes :

  1. Créer une librairie dynamique (dylib)
  2. Insérer la commande de chargement de notre librairie dans le Mach-O de l’application
  3. Signer l’application

Créer une librairie dynamique

Dans un premier temps si vous souhaitez modifier l’application il vous faut comprendre son fonctionnement, il est donc conseillé de la décompiler (détails sur la décompilation expliqués ici) pour mieux l’analyser.

Pour la création de la librairie nous allons créer un nouveau projet de framework iOS acec Xcode.

 

Capture-d’écran-2015-10-16-à-09.46.42Nous implémentons alors les modifications souhaitées dans le constructeur de la librairie.

Après complication du framework je renomme le binaire dans inject.framework/inject en inject.dylib.

Insérer la commande de chargement

Tout d’abord il faut extraire l’exécutable du fichier .ipa de l’application à modifier, pour cela il suffit de déziper le fichier qui est en fait une archive .zip renommée en .ipa. L’exécutable se trouve alors dans Payload/{MON_APP}.app/{MON_APP}. Avant d’ajouter notre commande de chargement, nous allons examiner les librairies chargées par notre application avec otool -L.

 

Capture-d’écran-2015-10-15-à-14.49.20On peut voir ici toutes les librairies nécessaires au bon fonctionnement de l’application 2048.

Ensuite j’utilise optool pour patcher le Mach-O et y insérer la commande de chargement de ma librairie.

 

Capture-d’écran-2015-10-16-à-14.03.02Puis je vérifie que la commande a bien été ajoutée à la section ‘Load Commands’ du binaire Mach-O.

 

Capture-d’écran-2015-10-15-à-15.12.44On remarque la présence de la commande @executable_path/inject.dylib, qui fait que notre binaire chargera la librairie inject.dylib se trouvant dans le même dossier (@executable_path). Il reste maintenant à copier la librairie dynamique au même endroit que le binaire avant de re-signer le tout.

Signer l’application

La signature permet d’exécuter l’application modifiée même sur des appareils non jailbreakés.

Pour signer une application iOS il vous faut déjà un certificat de développeur et un profil d’approvisionnement (que vous pouvez générer sur https://developer.apple.com/account/overview.action).

Vous devez copier le profil d’approvisionnement dans le dossier (.app) de l’application sous le nom embedded.mobileprovision. Ensuite il vous faut ensuite utiliser l’utilitaire codesign pour signer votre application avec votre certificat (ici iPhone Distribution).

/usr/bin/codesign -fs "iPhone Distribution" --entitlements="entitlements.plist" "2048-App/Payload/2048.app"

Voila! Il ne vous reste plus qu’a re-ziper l’ipa pour l’installer sur votre appareil avec iTunes et profiter des modifications apportées 🙂

 

Image

4 réflexions au sujet de « Modifier une application iOS »

  1. Bonjour,
    La signature du programme est valable combien de temps sur l’appareil testeur?
    A priori, si l’on ne possède pas de compte développeur payant, elle ne serait utilisable 7 jours, et un an avec le compte payant.
    Suis je dans le vrai?
    Une fois ce délai dépassé, doit on signer l’application à nouveau et la réinstaller avec iTunes?
    Cordialement

    1. Bonjour, la signature est valable tant que le profil d’approvisionnement l’autorise, l’application ne s’ouvrira plus à l’expiration de ce dernier.
      Pour connaitre la date d’expiration d’un profil d’approvisionnement « PROFIL.mobileprovision »:
      security cms -D -i PROFIL.mobileprovision | grep ExpirationDate -A1

Laisser un commentaire

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