hacktricks/mobile-pentesting/android-app-pentesting/apk-decompilers.md
2023-06-03 13:10:46 +00:00

139 lines
11 KiB
Markdown

# Décompilateurs APK
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## [JD-Gui](https://github.com/java-decompiler/jd-gui)
Le premier décompilateur Java gui célèbre, vous pouvez l'utiliser pour examiner le code Java de l'APK une fois que vous l'avez obtenu.
## [Jadx](https://github.com/skylot/jadx)
Décompilateur Java (multi-plateforme) intégré et en ce moment je pense que c'est celui recommandé.\
Il suffit de **télécharger** la **dernière** version et de l'exécuter à partir du dossier _**bin**_:
```
jadx-gui
```
En utilisant l'interface graphique, vous pouvez effectuer une **recherche de texte**, accéder aux **définitions de fonctions** (_CTRL + clic gauche_ sur la fonction) et aux références croisées (_clic droit_ --> _Rechercher l'utilisation_).
Si vous voulez **seulement** le **code Java** mais sans utiliser une interface graphique, une méthode très simple est d'utiliser l'outil de ligne de commande jadx :
```
jadx app.apk
```
Quelques **options intéressantes de jadx** (versions GUI et CLI) sont :
```
-d <path to output dir>
--no-res #No resources
--no-src #No source code
--no-imports #Always write entire package name (very useful to know where is the function that you might want to hook)
```
## [Outil de rétro-ingénierie GDA-android](https://github.com/charles2gan/GDA-android-reversing-Tool)
GDA est également une plateforme d'analyse inverse puissante et rapide. Elle ne prend pas en charge uniquement les opérations de décompilation de base, mais également de nombreuses fonctions excellentes telles que la **détection de comportements malveillants, la détection de fuites de confidentialité, la détection de vulnérabilités, la résolution de chemin, l'identification de packer, l'analyse de suivi de variable, la désobfuscation, les scripts Python et Java, l'extraction de la mémoire de l'appareil, le chiffrement et le déchiffrement de données**, etc.
**Uniquement pour Windows.**
![](<../../.gitbook/assets/image (207) (1) (1).png>)
## [Visionneuse de bytecode](https://github.com/Konloch/bytecode-viewer/releases)
Un autre **outil intéressant pour effectuer une analyse statique est** : [**bytecode-viewer**](https://github.com/Konloch/bytecode-viewer/releases)**.** Il vous permet de décompiler l'APK en utilisant **plusieurs décompilateurs en même temps**. Ensuite, vous pouvez voir par exemple, 2 décompilateurs Java différents et un décompilateur Smali. Il vous permet également de **modifier** le code :
![](<../../.gitbook/assets/image (82).png>)
Si vous modifiez le code, vous pouvez alors **l'exporter**.\
Un mauvais point de bytecode-viewer est qu'il **n'a pas de références** ou de **références croisées**.
## [**Enjarify**](https://github.com/Storyyeller/enjarify)
Enjarify est un outil de traduction du bytecode Dalvik en bytecode Java équivalent. Cela permet aux outils d'analyse Java d'analyser les applications Android.\
Dex2jar est un outil plus ancien qui tente également de traduire Dalvik en bytecode Java. Il fonctionne raisonnablement bien la plupart du temps, mais de nombreuses fonctionnalités obscures ou des cas limites le feront échouer ou même produire des résultats incorrects en silence. En revanche, Enjarify est conçu pour fonctionner dans le plus grand nombre de cas possible, même pour le code où Dex2jar échouerait. Entre autres choses, Enjarify gère correctement les noms de classe Unicode, les constantes utilisées comme plusieurs types, les conversions implicites, les gestionnaires d'exceptions sautant dans le flux de contrôle normal, les classes qui font référence à trop de constantes, les méthodes très longues, les gestionnaires d'exceptions après un gestionnaire catchall et les valeurs initiales statiques du mauvais type.
## [CFR](https://github.com/leibnitz27/cfr)
CFR décompilera les fonctionnalités Java modernes - [y compris une grande partie de Java ](https://www.benf.org/other/cfr/java9observations.html)[9](https://github.com/leibnitz27/cfr/blob/master/java9stringconcat.html), [12](https://www.benf.org/other/cfr/switch\_expressions.html) & [14](https://www.benf.org/other/cfr/java14instanceof\_pattern), mais est entièrement écrit en Java 6, donc fonctionnera partout ! ([FAQ](https://www.benf.org/other/cfr/faq.html)) - Il fera même un bon travail en transformant les fichiers de classe d'autres langages JVM en Java !
Ce fichier JAR peut être utilisé comme suit :
```
java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
Pour les fichiers JAR plus volumineux, j'ai constaté que la mémoire était insuffisante. Vous pouvez simplement adapter la taille du pool d'allocation de mémoire du JVM si cela vous arrive également.
```
java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
```
Cet exemple permettra d'allouer un maximum de 4 Go.
Dans le répertoire de sortie, vous trouverez les fichiers `.java` décompilés, ainsi qu'un résumé de la décompilation.
## [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine)
Ensuite, il y a [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine), qui fait partie de [IntelliJ IDEA](https://www.jetbrains.com/idea/). Tout le monde mentionne que c'est un décompilateur _analytique_ (comme indiqué dans leur description de projet), mais personne ne précise ce que cela signifie réellement. J'ai seulement trouvé [cette question Stackoverflow](https://stackoverflow.com/q/62298929), qui malheureusement reste sans réponse à ce jour.
Quoi qu'il en soit, comme il n'y a pas de versions autonomes, vous devez le construire vous-même. En tant que projet basé sur [Gradle](https://gradle.org), vous pouvez le cloner et exécuter la commande suivante, à condition que Gradle soit installé sur votre machine.
```
cd ./plugins/java-decompiler/engine && gradle jar
```
Ici, nous commençons par changer notre répertoire de travail vers le répertoire racine de Fernflower. Ensuite, nous demandons à Gradle de construire le fichier `./build/libs/fernflower.jar`.
L'invocation de Fernflower est similaire à celle de CFR.
```
java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"
```
Parmi les décompileurs décrits ici, c'est le seul qui génère les fichiers `.java` dans un fichier JAR. Vous pouvez facilement extraire les fichiers sources en utilisant `unzip`.
## [Krakatau](https://github.com/Storyyeller/Krakatau)
Vous vous souvenez d'Enjarify ci-dessus ? Le même auteur est également le développeur d'un décompileur nommé [Krakatau](https://github.com/Storyyeller/Krakatau).
Contrairement aux autres projets, celui-ci est écrit en Python. Et je pense que c'est la raison pour laquelle il est un peu différent des autres.
Permettez-moi de citer [le README du projet](https://github.com/Storyyeller/Krakatau/blob/master/README.md).
> Ensuite, assurez-vous d'avoir des fichiers JAR contenant les définitions (sic!) de toutes les classes externes (c'est-à-dire les bibliothèques) qui pourraient être référencées par le JAR que vous essayez de décompiler. Cela inclut les classes de la bibliothèque standard (c'est-à-dire JRT).
Et selon la description, ces classes de bibliothèque standard sont fournies jusqu'à la version 8 de Java sous la forme du fichier `rt.jar`. Pour les versions ultérieures, l'auteur fournit [jrt-extractor](https://github.com/Storyyeller/jrt-extractor), qui peut générer ce fichier pour nous.
Nous téléchargeons donc cet outil et exécutons les commandes suivantes.
```
cd ./jrt-extractor
javac JRTExtractor.java
java -ea JRTExtractor
```
Cela devrait avoir écrit un fichier `rt.jar` à l'intérieur du répertoire.
Avec ce fichier, nous pouvons exécuter Krakatau comme suit.
```
./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"
```
Je vais me référer au GitHub du projet pour une explication des paramètres. Notez simplement que pour toutes les bibliothèques utilisées par votre fichier JAR, Krakatau vous demandera de l'ajouter en tant que fichier JAR au drapeau `-path`.
## [procyon](https://github.com/mstrobel/procyon)
Une fois installé, l'utilisation est simple.
```
procyon -jar "$JARFILE" -o "$OUTDIR"
```
## Références
{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>