# 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é


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://blog.s1rn3tz.ovh/pentest-mobile/ios/reverse-engineering-ios.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
