web-dev-qa-db-fra.com

décompiler DEX en Java code source

Comment décompiler des fichiers Android DEX (bytecode VM) en code source Java correspondant?

690
Will

C'est facile

Obtenez ces outils:

1) dex2jar pour traduire les fichiers dex en fichiers jar

2) jd-gui pour afficher les fichiers Java dans le fichier jar

Le code source est assez lisible car dex2jar effectue certaines optimisations.

Procédure:

Et voici la procédure pour décompiler:

Étape 1:

Convertissez classes.dex dans test_apk-debug.apk en test_apk-debug_dex2jar.jar

d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex

Remarque: Sur les machines Windows, tous les scripts .sh sont remplacés par .bat scripts.

documentation dex2jar

Étape 2:

Ouvrez le pot dans JD-GUI

The decompiled source

860
fred

Pour clarifier un peu, il existe deux voies principales que vous pouvez emprunter ici en fonction de ce que vous voulez accomplir:

Décompiler le bytecode de Dalvik (dex) en source lisible Java. Vous pouvez le faire facilement avec dex2jar et jd-gui , comme le mentionne fred. La source obtenue est utile pour lire et comprendre les fonctionnalités d'une application, mais ne produira probablement pas du code utilisable à 100%. En d’autres termes, vous pouvez lire le source, mais vous ne pouvez pas vraiment le modifier et le reconditionner. Notez que si la source a été masquée avec proguard, le code source résultant sera beaucoup plus difficile à démêler.

L’autre alternative majeure consiste à désassembler le bytecode en smali , un langage d’assemblage conçu précisément à cet effet. J'ai trouvé que le moyen le plus simple de faire ceci est avec apktool . Une fois que vous avez installé apktool, vous pouvez simplement le pointer sur un fichier apk, et vous récupérez un fichier smali pour chaque classe contenue dans l'application. Vous pouvez lire et modifier le smali ou même remplacer entièrement les classes en générant smali à partir de la nouvelle source Java (pour ce faire, vous pouvez compiler votre source .Java en fichiers .class avec javac, puis convertir vos fichiers .class. fichiers .dex avec le compilateur dx d’Android, puis utilisez baksmali (désassembleur smali) pour convertir les fichiers .dex en fichiers .smali, comme décrit dans la section cette question . Il pourrait y avoir un raccourci ici). Une fois que vous avez terminé, vous pouvez facilement reconfigurer l'apk avec apktool. Notez que apktool ne signe pas l'apk obtenu, vous devrez donc vous en occuper comme toute autre application Android .

Si vous choisissez smali, essayez APK Studio , un IDE qui automatise certaines des étapes ci-dessus pour vous aider à décompiler et recompiler un apk et à l'installer sur un dispositif.

En bref, vous avez le choix, soit de décompiler en Java, ce qui est plus lisible mais probablement irréversible, soit de le désassembler en smali, qui est plus difficile à lire, mais beaucoup plus souple pour effectuer des modifications et reconditionner une application modifiée. La démarche que vous choisirez dépendrait de ce que vous cherchez à réaliser.

Enfin, la suggestion de dare est également à noter. Il s'agit d'un outil de reciblage permettant de convertir les fichiers .dex et .apk en fichiers Java .class, de sorte qu'ils puissent être analysés à l'aide d'outils d'analyse statiques Java classiques.

132
Zach Lipton

En fait, je recommanderais d'aller ici: https://github.com/JesusFreke/smali

Il fournit BAKSMALI, qui est un excellent outil de reverse engineering pour les fichiers DEX. Il est fabriqué par JesusFreke, le gars qui a créé les fameuses ROM pour Android.

60
reflog

Une version plus complète de fred 's answer :

Manière Manuelle

Tout d'abord, vous avez besoin d'un outil pour extraire toutes les classes (compilées) de DEX dans un fichier JAR.
Il y en a un appelé dex2jar , qui est fabriqué par un étudiant chinois.

Ensuite, vous pouvez utiliser jd-gui pour décompiler les classes du fichier JAR en code source.
La source obtenue devrait être assez lisible, car dex2jar applique certaines optimisations.

Manière automatique

Vous pouvez utiliser APKTool . Il va extraire automatiquement toutes les classes (.dex), les ressources (.asrc), puis il convertira XML binaire en XML lisible par l'homme , et il va également désassembler les classes pour vous.
Le désassemblage sera toujours plus robuste que la décompilation, , en particulier avec
JAR masqués avec Pro Guard!

Il suffit de dire à APKTool de décoder le fichier APK dans un répertoire, puis de modifier ce que vous voulez,
et enfin le coder en un APK. C'est tout.

Important: APKTool désassemble . Il ne décompile pas .
Le code généré ne sera pas Java source.
Mais vous devriez pouvoir le lire, et même le modifier si vous êtes familier avec jasmin .
Si vous voulez Java source, passez sur la méthode manuelle .

28
Alba Mendez

Parfois, vous obtenez un code cassé lorsque vous utilisez _dex2jar_/apktool, notamment dans les boucles. Pour éviter cela, utilisez jadx , qui décompile le bytecode de dalvik en code source Java, sans créer de fichier _.jar_/_.class_ en tant que _dex2jar_ fait (apktool utilise dex2jar je pense). Il est également open-source et en développement actif. Il a même une interface graphique, pour les fanatiques de GUI. Essayez le!

24
polym

Comme personne n'en a parlé, il existe un outil supplémentaire: page d'accueil DED

Instructions d’utilisation et explications: Installation .

Il a été utilisé dans une étude assez intéressante de la sécurité des applications les plus populaires du marché (pas vraiment liée, mais si vous êtes curieux): Enquête sur Android Sécurité des applications

15
phaethon

J'ai utilisé

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. enjarifier
  4. Apktool

Mais aucun ne bat les propres outils de Google

1) Android Studio 2.x: construire> analyser apk enter image description here

2) Android Studio 3.0: Profil ou Debug APK enter image description hereenter image description here

15
ishandutta2007

Une fois que vous avez téléchargé votre fichier APK, vous devez suivre les étapes suivantes pour obtenir un code/document Java éditable.

  1. Convertissez votre fichier apk en Zip (démarrez votre téléchargement sans l'option "enregistrer", mais avec "enregistrer sous" et mentionnez l'extension .Zip). Vous éviterez ainsi APKTOOL ...
  2. Extrayez le fichier Zip, vous y trouverez nomfichier.dex. alors maintenant nous avons besoin de convertir dex -> .class
  3. Pour ce faire, vous avez besoin de "dex2jar" (vous pouvez le télécharger à partir de http://code.google.com/p/dex2jar/ , après extraction, dans l'invite de commande à mentionner comme suit, [D:\dex2jar-0.09> dex2jar nomfichier.dex] (N'oubliez pas que votre nomfichier.dex doit se trouver dans le même dossier où vous avez conservé dex2jar.)
  4. Téléchargez jad à partir de http://www.viralpatel.net/blogs/download/jad/jad.Zip et extrayez-le. Une fois extrait, vous pouvez voir deux fichiers tels que "jad.exe" et "Readme.txt" (parfois "jad.txt" peut y figurer à la place de "jad.exe", il suffit donc de renommer son extension as.exe pour qu'elle s'exécute).
  5. Enfin, dans l'invite de commande, vous devez mentionner comme [D:\jad> jad -sjava votrefilename.class] , il analysera votre fichier de classe en fichier éditable Java document.
13
Kamal

Android Reverse Engineering est possible . Suivez ces étapes pour obtenir un fichier .Java à partir d'un fichier apk.

Step1. Utiliser dex2jar

  • Générer un fichier .jar à partir d'un fichier .apk
  • commande: dex2jar sampleApp.apk

Step2. Décompiler .jar à l'aide de JD-GUI

  • il décompile les fichiers .class c'est-à-dire que nous obtiendrons obscurci .Java en retour de l'apk.
8
gtiwari333

Avec Dedexer , vous pouvez désassembler le fichier .dex en bytecode dalvik (.ddx).

Décompiler vers Java n'est pas possible à ma connaissance.
Vous pouvez en savoir plus sur le bytecode de Dalvik ici .

8
hcpl

Les dernières Debian ont Python paquet androguard:

Description-en: full Python tool to play with Android files
 Androguard is a full Python tool to play with Android files.
  * DEX, ODEX
  * APK
  * Android's binary xml
  * Android resources
  * Disassemble DEX/ODEX bytecodes
  * Decompiler for DEX/ODEX files

Installez les paquets correspondants:

Sudo apt-get install androguard python-networkx

Décompiler le fichier DEX:

$ androdd -i classes.dex -o ./dir-for-output

Extrait classes.dex de Apk + Decompile:

$ androdd -i app.apk -o ./dir-for-output

Le fichier Apk n'est rien de plus que l'archive Java (JAR), vous pouvez extraire des fichiers d'archive via:

$ unzip app.apk -d ./dir-for-output
6
gavenkoa

Beaucoup de choses ont changé depuis que la plupart de ces réponses ont été postées. De nos jours, il existe de nombreux outils faciles à utiliser avec une interface graphique, comme ceux-ci:

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

Le meilleur endroit pour les trouver est sur le forum XDA Developers.

5
MPaulo

Puisque la réponse de Dheeraj Bhaskar est relativement ancienne, il y a de nombreuses années.

Voici ma dernière réponse (année 2019):

Logique principale

de dex à Java sourcecode, a actuellement deux types de solution:

  • One Step: convertit directement dex en Java sourcecode
  • Two Step: convertit d'abord dex en jar, ensuite convertit jar en Java sourcecode

Solution en une étape: dex directement à Java sourcecode

Outils

Processus

  1. download jadx-0.9.0.Zip , décompressez-le, dans le dossier bin peut voir la ligne de commande jadx ou la version de l'interface graphique jadx-gui, double-cliquez pour exécuter la version de l'interface graphique : jadx-gui

  1. ouvrir le fichier dex

alors peut montrer Java code source:

  1. File -> save as gradle project

puis j'ai Java code source:


Solution en deux étapes

Étape 1: dex à jar

Outils

Processus

télécharger dex2jar Zip , décompressez got d2j-dex2jar.sh, puis:

  • apk à jar: sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dex à jar: sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

exemple:

➜  v3.4.8 /Users/crifan/dev/dev_tool/Android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
➜  v3.4.8 ll
-rw-------  1 crifan  staff   9.5M  3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
-rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

Étape 2: jar à Java sourcecode

Outils

Processus

ici démo Procyon convertir jar en Java code source:

télécharger procyon-decompiler-0.5.34.jar

puis en utilisant la syntaxe:

Java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

exemple:

Java -jar /Users/crifan/dev/dev_tool/Android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612

using editor VSCode pour ouvrir le code source exporté, ressembler à ceci:

Conclusion

Correction de la conversion: Jadx> Procyon> CRF> JD-GUI

Utilisation recommandée: (Solution en une étape) Jadx


pour des explications plus détaillées, veuillez vous référer à mon ebook en ligne en chinois : 应用 的 安全 和 破解

5
crifan

Vous pouvez essayer JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), c'est un outil parfait pour la décompilation DEX.

Et oui, il est également disponible en ligne sur (mon: 0)) nouveau site: http://www.javadecompilers.com/apk/

4
Andrew Rukin

La méthode la plus simple pour décompiler une application Android consiste à télécharger une application nommée ShowJava à partir du magasin de jeux. Sélectionnez simplement l'application à décompiler dans la liste des applications. Il existe trois décompilateurs différents que vous pouvez utiliser pour décompiler une application, à savoir:

CFR 0.110, JaDX 0.6.1 ou FernFlower (décompilateur analytique).

2
Rishabh Maurya

Cela peut être fait en cinq étapes:

Ce bijou fait ces choses pour vous automatiquement même lors de l'installation des outils nécessaires

  1. convertir un fichier apk en Zip
  2. décompressez le fichier
  3. en extraire classes.dex
  4. utiliser dex en jar pour convertir classes.dex en fichier jar
  5. utilisez jadx gui pour ouvrir le fichier jar en tant que code source Java
2
Ajit Singh

Si vous ne souhaitez pas télécharger dex2jar, utilisez simplement le script apk_grabber python pour décompiler tout apk en fichiers jar. Ensuite, vous les lisez avec jd-gui.

1
Jeff Brateman