# Reverse engineering (iOS)

## Outils

### Cycript

ressource: <http://www.cycript.org/>

### ipsw

ipsw est un utilitaire permettant d'intéragir avec les applications iOS pour de la décompilations, du reverse-engineering et autres actions intéressantes.

ressource: <https://github.com/blacktop/ipsw>

## Extraction d'un fichier IPA

### Via SSH

Méthode rapide:

* Connectez-vous à votre iphone via SSH : ssh root\@ip (le mot de passe par défaut est Alpine)
* Recherchez l'application que vous voulez extraire dans /private/var/containers/Bundle/Application
* Fermez la connexion SSH
* Utilisez cette commande:

`$ scp -r root@X.X.X.X:/private/var/containers/Bundle/Application/[ID]/[AppName.app] /path/to/Payload`

* Compressez le répertoire Payload au format IPA : zip -r target.ipa Payload

Méthode longue:

* Connectez-vous à votre iphone via SSH : ssh root\@ip (le mot de passe par défaut est Alpine)&#x20;
* Accédez au répertoire suivant : /var/containers/Bundle/Application&#x20;
* Recherchez maintenant l'application : recherchez | grep "nom\_application"&#x20;
* Accédez au dossier contenant votre application : cd \<app\_directory> Créez un répertoire avec le nom Payload : mkdir Payload&#x20;
* Copiez les données dans le répertoire Payload : cp -r \<appname.app>/ Payload/&#x20;
* Compressez le répertoire Payload au format IPA : zip -r /var/root/.ipa Payload/

### Via USB

Pour interagir avec un appareil physique iOS via USB, il faut utiliser un proxy TCP vers USB. Cela peut être fait avec **iproxy**:

```
$ iproxy 2222 22
$ ssh root@localhost -p 2222
```

Le procédé est ensuite le même qu'en SSH.

### Via AnyTrans

AnyTrans est un logiciel de gestion d'iPhone qui permet notamment de faire des transferts de fichiers entre un iPhone et un Ordinateur.

## Décompiler une application iOS

* Dézipper l'ipa de l'application: `unzip target.ipa`

### Dump les classes Objective-C

```
$ ipsw class-dump ./Payload/target.app/target --headers -o ./class_dump
```

### Dump les classes Swift

```
# MacOS
ipsw swift-dump ./Payload/target.app/target > ./swift_dump_mangled.txt
ipsw swift-dump ./Payload/target.app/target --demangle > ./swift_dump_demangled.txt

# Linux
SWIFT_DEMANGLE="$(find /usr/libexec -type f -executable -name "swift-demangle")"

ipsw swift-dump ./Payload/target.app/target > ./swift_dump_mangled.txt
ipsw swift-dump ./Payload/target.app/target | $SWIFT_DEMANGLE --simplified > ./swift_dump_demangled.txt
```

{% hint style="info" %}
Swift est présent par défaut avec Xcode mais sur linux cela nécessite d'installer swift au préalable:

```
sudo apt install -y curl
curl -L https://swiftlygo.xyz/install.sh | bash
sudo swiftlygo install latest
```

{% endhint %}

## Patcher un IPA

De la même manière que pour les APK, Objection permet de patcher les IPA avec la commande:

*`$ objection patchipa --source path/to/target.ipa -c <provisioning profile>`*

## Patcher une instruction avec Ghidra

* Ouvrir le binaire à patcher dans Ghidra
* Trouver la fonction à patcher (via la barre de recherche de la fenêtre "Symbol Tree")
* Trouver la/les variables à modifier
* Trouver la/les lignes correspondant(es) dans le code assembleur
* Faire "**Clic droit > Patch Instruction**"
* Modifier les valeurs à modifier

Exemple pour un contournement de validation basique:

Remplacez « **and w0, w8, #01** » par « **mov w0, #0x0** ».\
La fonction renverra toujours 0 (w0 étant le registre contenant les valeurs de retour des fonctions et prenant désormais toujours la valeur 0x0 grâce à l'instruction MOV) au lieu d'effectuer une comparaison bit à bit (instruction AND), selon la logique de la fonction.

* Enregistrer le fichier binaire modifié (File > Export Program ⇒ Format = Original File)
* Remplacer le binaire d'origine avec le binaire patché
