décompilation DEX en code source Java


706

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


Jetez un oeil ici . Vous obtiendrez des pistes possibles à partir de là pour continuer.
Kevin Boyd

Des informations mises à jour sont disponibles sur le blog du hub des codeurs: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin

Si vous avez de l'argent, achetez jeb , sinon utilisez jadx , voyez ici pourquoi
polym

Il existe une nouvelle plateforme croisée (java) et un outil open source, qui vous permettent de le faire, il suffit de consulter bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Réponses:


882

C'est facile

Obtenez ces outils:

1) dex2jar pour traduire des fichiers dex en fichiers jar

2) jd-gui pour afficher les fichiers java dans le bocal

Le code source est assez lisible car dex2jar fait quelques optimisations.

Procédure:

Et voici la procédure de décompilation:

É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 1: sur les machines Windows, tous les .shscripts sont remplacés par des .batscripts

Remarque 2: sous linux / mac, n'oubliez pas shou bash. La commande complète doit être:

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

Remarque 3: N'oubliez pas non plus d'ajouter l'autorisation d'exécution au dex2jar-X.Xrépertoire, par exemplesudo chmod -R +x dex2jar-2.0

documentation dex2jar

Étape 2:

Ouvrez le pot dans JD-GUI

La source décompilée


57
+1. J'ai essayé à la fois Baksmali et Dex2jar. Dex2Jar + JD-Gui gagne pour vous avoir donné un code source parfaitement lisible pour la plupart des fichiers .dex.
Jonathan Dumaine

salut, voulez-vous s'il vous plaît partager la façon dont vous allez? Je vous en serai très reconnaissant.
Arslan Anwar

2
La phrase ci-dessus a sonné la cloche - il semble s'agir d'une semi-citation d'ici: geeknizer.com/decompile-reverse-engineer-android-apk (ou l'inverse?). Les articles liés expliquent brièvement les outils mentionnés ci-dessus ainsi que Smali et APKTool.
AgentKnopf

2
@JonathanDumaine cela dépend. Si les fichiers JAR sont obscurcis et que vous souhaitez apporter de petites modifications, Backsmali est la seule solution. Prime! Avec APKTool, vous récupérez également tous les XML, images et autres ressources. Voir ma réponse .
Alba Mendez

3
@JonathanDumaine Je suis d'accord avec jmendeth, apktool est aussi la voie à suivre si vous voulez décompiler votre apk, le modifier puis le recompiler. En utilisant dex2jar et jd-gui, la source est vraiment lisible mais vous ne pouvez pas recompiler sans erreurs!
darkheir

138

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

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

L'autre alternative majeure consiste à démonter le bytecode en smali , un langage d'assemblage conçu précisément à cet effet. J'ai trouvé que la façon la plus simple de le faire est avec apktool . Une fois apktool installé, vous pouvez simplement le pointer vers un fichier apk et vous récupérerez 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 d'une nouvelle source Java (pour ce faire, vous pouvez compiler votre source .java en fichiers .class avec javac, puis convertir vos fichiers .class en fichiers .dex avec Android's compilateur dx, puis utilisez baksmali (désassembleur smali) pour convertir les fichiers .dex en .smali, comme décrit dans cette question. Il peut y avoir un raccourci ici). Une fois que vous avez terminé, vous pouvez facilement empaqueter à nouveau l'apk avec apktool. Notez que apktool ne signe pas l'apk résultant, vous devrez donc vous en occuper comme toute autre application Android .

Si vous suivez la voie smali, vous voudrez peut-être essayer APK Studio , un IDE qui automatise certaines des étapes ci-dessus pour vous aider à décompiler et recompiler une apk et à l'installer sur un appareil.

En bref, vos choix sont à peu près soit de décompiler en Java, qui est plus lisible mais probablement irréversible, ou de démonter en smali, qui est plus difficile à lire mais beaucoup plus flexible pour apporter des modifications et reconditionner une application modifiée. L'approche que vous choisiriez dépendrait de ce que vous cherchez à réaliser.

Enfin, la suggestion d' oser est également à noter. C'est un outil de reciblage pour convertir des fichiers .dex et .apk en fichiers java .class, afin qu'ils puissent être analysés à l'aide d'outils d'analyse statique java typiques.


61

Je recommanderais en fait d'aller ici: https://github.com/JesusFreke/smali

Il fournit BAKSMALI, qui est un excellent outil de rétro-ingénierie pour les fichiers DEX. Il est fait par JesusFreke, le gars qui a créé les ROM célèbres pour Android.


3
smali est un langage de type assemblage basé sur dalvik IL, il ne peut pas être directement traduit en Java.
refloger

@endryha Il n'y a aucun outil capable de le faire. Voir cette question pour plus d'informations.
Alba Mendez

1
Code, code, code, ... Pourquoi seulement coder? Si vous utilisez APKTool, vous récupérez tout ! Et c'est aussi simple que ./apktool d myprogram.apk. Voir ma réponse .
Alba Mendez

30

Une version plus complète de la réponse de Fred :

Manière manuelle

Vous avez d'abord besoin d'un outil pour extraire toutes les classes (compilées) du DEX dans un 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 JAR en code source.
La source résultante doit être assez lisible, car dex2jar applique certaines optimisations.

Manière automatique

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

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

Important: APKTool se démonte . Il ne se décompile pas .
Le code généré ne sera pas une source Java.
Mais vous devriez pouvoir le lire, et même le modifier si vous êtes familier avec jasmin .
Si vous voulez une source Java, veuillez suivre la voie manuelle .


25

Parfois, vous obtenez du code cassé, lorsque vous utilisez dex2jar/ apktool, notamment dans les boucles. Pour éviter cela, utilisez jadx , qui décompile le bytecode dalvik en code source java, sans créer d'abord un fichier .jar/ .classcomme le dex2jarfait (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 l'interface graphique. Essayez!


Je suppose que jadx n'a pas d'option de compilation mais le code est lisible
Buddy

@EnesBattal tu veux dire comme javac "$(find . -name '*.java')"?
polym

que diriez-vous de former un apk? placer des cours dans apk, zipalign, signer etc.
Buddy

@EnesBattal Eh bien, vous pouvez aider à implémenter cela - sinon vous pouvez utiliser apktool pour cela .. ou zipalign / signer avec les outils Android
polym

1
@lejonl Peine de mort pour vous, monstre!
polym

17

j'ai utilisé

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

Mais rien ne vaut les propres outils de Google

1) Android Studio 2.x: build> analyser apk entrez la description de l'image ici

2) Android Studio 3.0: profil ou débogage APK entrez la description de l'image ici entrez la description de l'image ici


1
Plus un pour Enjarify. D'après mon expérience personnelle, il s'est avéré donner de meilleurs résultats par rapport à d2j
qre0ct

15

Puisque personne ne l'a mentionné, il existe un autre outil: la page d'accueil DED

Installez le guide pratique et quelques explications: Installation .

Il a été utilisé dans une étude assez intéressante sur la sécurité des meilleures applications du marché (pas vraiment liées, juste si vous êtes curieux): A Survey of Android Application Security


Cela semble prometteur. Décompile-t-il le code Java directement depuis l'APK? Qu'en est-il du code Java obscurci?
sandalone

14

Depuis Dheeraj Bhaskarla réponse « est relativement vieux que de nombreuses années passées.

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

Logique principale

du dexau java sourcecode, propose actuellement deux types de solutions:

  • One Step: convertir directement dexenjava sourcecode
  • Two Step: première conversion dex en jar, deuxième convertir jarenjava sourcecode

Solution en une étape: dexdirectementjava sourcecode

Outils

Processus

  1. téléchargez jadx-0.9.0.zip , décompressez-le, dans le bindossier peut voir la ligne de commande jadxou la version GUI jadx-gui, double-cliquez pour exécuter la version GUI:jadx-gui

  1. ouvrir le dexfichier

peut alors afficher le code source java:

  1. File -> save as gradle project

puis obtenu le code source java:


Solution en deux étapes

Étape 1: dex pourjar

Outils

Processus

téléchargez 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 pourjava sourcecode

Outils

Processus

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

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

en utilisant l'éditeur VSCode pour ouvrir le code source exporté, ressemble à ceci:

Conclusion

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

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


pour une explication plus détaillée, veuillez consulter mon livre électronique chinois en ligne : 安卓 应用 的 安全 和 破解


étrange, mais si j'essaie d'exécuter 1 étape (décompilation dex to jar sous Windows) via cette commande, dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexje viens de recevoir une exception:java.io.IOException: the src file not a .dex or zip file
Сергей

@ Сергей pourriez-vous essayer: ça d2j-dex2jar.bat "D:\android\some_dex_file.dex"va ou pas?
crifan

oui, j'ai essayé exactement >d2j-dex2jar.bat file.dexmais ce n'est pas ok. c'est peut-être parce que mon .dexfichier a été copié dalvik-cache?
Сергей

1
@ Сергей oui, la raison la plus possible est votre avis dex is copied from dalvik-cache, devrait êtredex is decompiled from apk
crifan

@crifan, merci pour cette réponse. JADX est impressionnant. je vais retourner au travail. Emmanuel @ JD-Gui
Emmanuel Dupuy

13

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

  1. Convertissez votre fichier apk en zip (pendant le démarrage de votre téléchargement, n'allez pas avec l'option "enregistrer", allez simplement avec "enregistrer sous" et mentionnez votre extension en tant que .zip) en faisant cela, vous pouvez éviter APKTOOL ...
  2. Extrayez le fichier zip, vous y trouverez un nom de fichier.dex. alors maintenant nous devons convertir dex -> .class
  3. Pour ce faire, vous avez besoin de "dex2jar" (vous pouvez le télécharger depuis http://code.google.com/p/dex2jar/ , une fois extrait, dans l'invite de commande, vous devez mentionner comme, [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Gardez à l'esprit que votre somefilename.dex doit se trouver dans le même dossier que celui où vous avez gardé votre dex2jar.)
  4. Téléchargez jad depuis http://www.viralpatel.net/blogs/download/jad/jad.zip et extrayez-le. Une fois extrait, vous pouvez voir deux fichiers comme "jad.exe" et "Readme.txt" (parfois "jad.txt" peut y apparaître au lieu de "jad.exe", il suffit donc de renommer son extension as.exe pour l'exécuter)
  5. Enfin, dans l'invite de commande, vous devez mentionner comme [D: \ jad> jad -sjava yourfilename.class] il analysera votre fichier de classe dans un document java modifiable.

8

Avec Dedexer , vous pouvez démonter le .dexfichier en bytecode dalvik (.ddx ).

Pour autant que je sache, la décompilation vers Java n'est pas possible.
Vous pouvez lire sur le bytecode dalvik ici .


1
accepté puisque c'est vous qui dites que ce n'est pas (actuellement) possible, ce qui semble vrai.
Will

@Tout sera possible. Tout dépend de la façon dont vous le voyez. La décompilation est possible, mais peut-être pas comme vous le pensez.
Alba Mendez

8

Android Reverse Engineering est possible . Suivez ces étapes pour obtenir le fichier .java à partir du fichier apk.

Étape 1 . Utilisation de dex2jar

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

Étape 2 . Décompilation de .jar à l'aide de JD-GUI

  • il décompile les fichiers .class -à- dire, nous allons obtenir obscurcie .java retour de l'APK.

Mais si je compile à nouveau tout le code source décompilé, il ne fonctionnera pas, le compilateur montre beaucoup d'erreurs.

existe-t-il une solution disponible pour décompiler le code source java android s'exécutera dans eclipse

2
L'ingénierie inverse ne signifie pas nécessairement une décompilation . En fait, les fichiers JAR masqués par ProGuard ne se décompilent pas correctement.
Alba Mendez

Si vous avez affaire à du code obscurci , il est préférable de simplement le démonter . Vous n'obtiendrez pas de source Java, mais vous pourrez toujours voir / modifier le code. Voir ma réponse .
Alba Mendez

Je recommanderais de faire à la fois la décompilation et le démontage. Le code décompilé résultant est plus facile à comprendre, mais toutes les modifications doivent être effectuées avec la version démontée. Particulièrement vrai si proguard a été utilisé. Je trouve que dex2jar combiné avec jd-gui est le meilleur pour la décompilation.
Mikko Rantalainen

6

Debian récent a un paquet Python 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 packages correspondants:

sudo apt-get install androguard python-networkx

Décompiler le fichier DEX:

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

Extrait classes.dexd'Apk + Decompile:

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

Le fichier apk n'est rien de plus qu'une archive Java (JAR), vous pouvez extraire des fichiers de l'archive via:

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

5

Beaucoup de choses ont changé depuis que la plupart de ces réponses ont été publiées. De nos jours, il existe de nombreux outils simples avec des interfaces graphiques, 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 des développeurs XDA.




2

La méthode la plus simple pour décompiler une application Android consiste à télécharger une application nommée ShowJava depuis Playstore. 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).


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.