# Reverse engineering

## Description

La rétroingénierie est un procédé par lequel on va comme son nom l'indique inverser le processus d'ingénierie grâce au code source de l'application testé. On va alors tenter d'en comprendre tout ou une partie intéressante du fonctionnement de l'application pour en déceler des vulnérabilités qui pourront ensuite être exploité en modifiant le code et en le recompilant.

L'ingénierie inverse d'un fichier APK pourrait conduire à contourner diverses mesures de sécurité. Les fichiers APK peuvent être inversés à l'aide d'outils open source tels que [dex2jar](https://blog.s1rn3tz.ovh/pentest-mobile/android/..#dex2jar), [APKTOOL ](https://blog.s1rn3tz.ovh/pentest-mobile/android/..#apktool)et autres.

## Obtenir un APK

### Téléchargement en ligne

[APK Combo](https://blog.s1rn3tz.ovh/pentest-mobile/android/..#sites) est un excellent site pour trouver et télécharger des APK en ligne.

### Extraire l'APK d'une application installée

Une autre méthode vise à extraire le fichier APK d'une application déjà installée. Des outils tiers Android peuvent être utilisés pour exporter des fichiers APK. APK Export par exemple est une application Android qui exporte automatiquement le fichier APK d'une autre application et le stocke localement.

### Directement depuis l'appareil

Lorsqu'une application est déjà installée sur l'appareil, le fichier APK est stocké dans le répertoire `/data/app/<package name>`.

Commande utile pour retrouver le nom du package souhaité:

*`$ adb shell pm list packages | grep <nom de l'application>`*

Une fois que nous obtenons le nom du package, nous tapons la commande suivante pour obtenir le chemin complet du fichier APK.

*`$ adb shell pm path com.example.myapp`*

Enfin, nous pouvons taper la commande suivante pour récupérer le fichier apk.

*`$ adb pull /data/app/com.example.myapp-1/exemple.apk`*

## Edition d'un APK

Avec [Apktool](https://blog.s1rn3tz.ovh/pentest-mobile/android/..#apktool):

Pour décompiler, entrer la commande:

*`$ apktool d exemple.apk`*

dans les répertoires et fichiers qui en ressortent, on retrouve un répertoire smali dans lequel on va trouver le code à compiler. C'est ces fichiers qu'il faut modifier.

Une fois les modifications voulus effectuées, on peut recompiler l'apk avec la commande:

*`$ apktool b exemple.apk`*

Il nous faut ensuite signer le nouveau fichier avec un certificat auto-signé comme ceci:

*`$ keytool -genkey -keystore exemple.keystore -validity 1000 -alias exemple`*

puis,

*`$ jarsigner -keystore exemple.keystore -verbose exemple/dist/exemple.apk exemple`*

puis,

*`$ zipalign -v 4 exemple.apk exemple-final.apk`*

Avant de lancer le nouvel apk, il nous reste alors à désinstaller l'ancien comme ceci:

*`$ adb uninstall com.example.demo`*

puis à installer le nouveau avec la commande:

*`$ adb install exemple.apk`*

{% hint style="warning" %}
Si l'application fonctionne normalement après modification, c'est à rapporter.
{% endhint %}

### Debug

Si erreur "Failed to extract native libraries": Mettre extractNativeLibs="false" à "true".

Si erreur "Invalid certificate": utiliser un algorithme, exemple: *`keytool -genkey -keystore exemple.keystore -validity 1000 -alias exemple -sigalg SHA1withRSA -keyalg RSA -keysize 1024`*

## Extraction du code source

Dans JADX-GUI:

1. Ouvrir l'APK souhaité
2. Aller dans **File > Save All** ou faire un **ctrl+E**
