¿Cómo se puede descompilar archivos Android DEX (VM bytecode) en el código fuente Java correspondiente?
¿Cómo se puede descompilar archivos Android DEX (VM bytecode) en el código fuente Java correspondiente?
Respuestas:
Obtenga estas herramientas:
1) dex2jar para traducir archivos dex a archivos jar
2) jd-gui para ver los archivos java en el jar
El código fuente es bastante legible ya que dex2jar hace algunas optimizaciones.
Y aquí está el procedimiento sobre cómo descompilar:
Convierte classes.dex en test_apk-debug.apk a 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
Nota 1: en las máquinas con Windows, todas las
.shsecuencias de comandos se reemplazan por.batsecuencias de comandosNota 2: en Linux / Mac no te olvides de
shobash. El comando completo debe ser:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
Nota 3: Además, recuerde agregar permiso de ejecución al
dex2jar-X.Xdirectorio, por ejemplosudo chmod -R +x dex2jar-2.0
Abra el tarro en JD-GUI

Para aclarar un poco, hay dos caminos principales que puede tomar aquí dependiendo de lo que quiera lograr:
Descompile el bytecode de Dalvik (dex) en una fuente Java legible. Puede hacerlo fácilmente con dex2jar y jd-gui , como menciona fred. La fuente resultante es útil para leer y comprender la funcionalidad de una aplicación, pero es probable que no produzca código 100% utilizable. En otras palabras, puede leer la fuente, pero realmente no puede modificarla y volver a empaquetarla. Tenga en cuenta que si la fuente se ha ofuscado con proguard, el código fuente resultante será mucho más difícil de desenredar.
La otra alternativa importante es desmontar el código de bytes a smali , un lenguaje ensamblador diseñado precisamente para este propósito. Descubrí que la forma más fácil de hacerlo es con apktool . Una vez que haya instalado apktool, puede apuntarlo a un archivo apk y obtendrá un archivo pequeño para cada clase contenida en la aplicación. Puede leer y modificar las clases smali o incluso reemplazarlas por completo mediante la generación de smali a partir de una nueva fuente Java (para hacer esto, puede compilar su fuente .java en archivos .class con javac, luego convertir sus archivos .class en archivos .dex con Android) compilador dx, y luego use baksmali (pequeño desensamblador) para convertir los archivos .dex a .smali, como se describe en esta pregunta. Puede haber un atajo aquí). Una vez que haya terminado, puede volver a empaquetar fácilmente la apk con apktool. Tenga en cuenta que apktool no firma la apk resultante, por lo que tendrá que ocuparse de eso como cualquier otra aplicación de Android .
Si va por la ruta pequeña, puede probar APK Studio , un IDE que automatiza algunos de los pasos anteriores para ayudarlo a descompilar y recompilar un apk e instalarlo en un dispositivo.
En resumen, sus opciones son más o menos descompilar en Java, que es más legible pero probablemente irreversible, o desmontar a smali, que es más difícil de leer pero mucho más flexible para hacer cambios y reempaquetar una aplicación modificada. El enfoque que elija dependerá de lo que desee lograr.
Por último, la sugerencia de atrevimiento también es notable. Es una herramienta de reorientación para convertir archivos .dex y .apk a archivos java .class, de modo que puedan analizarse utilizando las herramientas de análisis estático java típicas.
De hecho, recomiendo ir aquí: https://github.com/JesusFreke/smali
Proporciona BAKSMALI, que es una excelente herramienta de ingeniería inversa para archivos DEX. Está hecho por JesusFreke, el tipo que creó las famosas ROM para Android.
./apktool d myprogram.apk. Mira mi respuesta .
Una versión más completa de la respuesta de Fred :
Primero necesita una herramienta para extraer todas las clases (compiladas) en el DEX a un JAR.
Hay uno llamado dex2jar , que está hecho por un estudiante chino.
Luego, puede usar jd-gui para descompilar las clases en el JAR al código fuente.
La fuente resultante debería ser bastante legible, ya que dex2jar aplica algunas optimizaciones.
Puedes usar APKTool . Será automáticamente extraer todas las clases ( .dex), recursos ( .asrc), entonces se convertirá XML binario a XML legible por humanos , y también será dissassemble las clases para usted.
¡El desmontaje siempre será más robusto que el descompilación, especialmente con
JAR ofuscados con Pro Guard!
Solo dígale a APKTool que decodifique el APK en un directorio, luego modifique lo que desee
y finalmente vuelva a codificarlo en un APK. Eso es todo.
: Importante APKTool dissassembles . No se descompila .
El código generado no será fuente Java.
Pero debería poder leerlo e incluso editarlo si está familiarizado con Jasmin .
Si desea una fuente Java, vaya a la forma Manual .
A veces obtienes código roto, cuando usas dex2jar/ apktool, más notablemente en bucles. Para evitar esto, use jadx , que descompila el bytecode de dalvik en código fuente de java, sin crear primero un archivo .jar/ .classcomo lo dex2jarhace (apktool usa dex2jar, creo). También es de código abierto y en desarrollo activo. Incluso tiene una GUI, para fanáticos de la GUI. ¡Intentalo!
javac "$(find . -name '*.java')"?
He usado
Pero ninguno supera las herramientas de Google
Como nadie mencionó esto, hay una herramienta más: la página de inicio de DED
Instalar instrucciones y algunas explicaciones: Instalación .
Se utilizó en un estudio bastante interesante sobre la seguridad de las principales aplicaciones del mercado (no realmente relacionado, solo si tiene curiosidad): una encuesta sobre la seguridad de las aplicaciones de Android
Dado que Dheeraj Bhaskarla respuesta es relativamente antigua como muchos años atrás.
Aquí está mi última respuesta (año 2019):
de dexa java sourcecode, actualmente tiene dos tipos de solución:
One Step: convertir directamente dexajava sourcecodeTwo Step: primer convertir dexa jar, segundo convertir jarajava sourcecodedexdirectamente ajava sourcecodebincarpeta puede ver la línea de comandos jadxo la versión GUI jadx-gui, haga doble clic para ejecutar la versión GUI:jadx-gui
dexarchivo
entonces puede mostrar el código fuente de Java:

File -> save as gradle project
luego obtuve el código fuente de Java:

dexajardescargue dex2jar zip , descomprima got d2j-dex2jar.sh, luego:
apka jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apkdexa jar:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dexejemplo:
➜ 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
jarajava sourcecodemanycódigo descompilará el errorminorcódigo descompilará el errornoerror de descompilación de código
popularProcyon
aquí la demostración Procyonconvierte el código fuente jar a java:
descarga procyon-decompiler-0.5.34.jar
luego usando la sintaxis:
java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName
ejemplo:
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
usando el editor VSCode para abrir el código fuente exportado, tenga este aspecto:

Corrección de conversión: Jadx> Procyon> CRF>JD-GUI
Uso recomendado: (solución de un paso) Jadx
Para obtener una explicación más detallada, consulte mi ebook chino en línea : 安卓 应用 的 安全 和 破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexsolo consiguió excepción:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"está bien o no?
>d2j-dex2jar.bat file.dexpero no está bien. tal vez es porque mi .dexarchivo fue copiado dalvik-cache?
dex is copied from dalvik-cache, debería serdex is decompiled from apk
Una vez que haya descargado su archivo APK, debe realizar los siguientes pasos para obtener un código / documento editable de Java.
Con Dedexer , puede desmontar el .dexarchivo en el código de bytes de Dalvik ( .ddx).
Descompilar hacia Java no es posible hasta donde yo sé.
Puede leer sobre el código de bytes de Dalvik aquí .
La ingeniería inversa de Android es posible . Siga estos pasos para obtener el archivo .java del archivo apk.
Paso 1 . Usando dex2jar
dex2jar sampleApp.apkPaso 2 . Descompilación de .jar usando JD-GUI
Debian reciente tiene paquete 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
Instale los paquetes correspondientes:
sudo apt-get install androguard python-networkx
Descompilar archivo DEX:
$ androdd -i classes.dex -o ./dir-for-output
Extracto classes.dexde Apk + Descompilar:
$ androdd -i app.apk -o ./dir-for-output
El archivo Apk no es más que un archivo Java (JAR), puede extraer archivos del archivo a través de:
$ unzip app.apk -d ./dir-for-output
Mucho ha cambiado desde que se publicaron la mayoría de estas respuestas. Hoy en día hay muchas herramientas fáciles con GUI, como estas:
APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit
El mejor lugar para encontrarlos es en el foro de desarrolladores de XDA.
Puede probar JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), esta es una herramienta perfecta para la descompilación DEX.
Y sí, también está disponible en línea en (mi: 0)) nuevo sitio: http://www.javadecompilers.com/apk/
Esto se puede hacer en los siguientes cinco pasos:
El método más fácil para descompilar una aplicación de Android es descargar una aplicación llamada ShowJava de la tienda de juegos. Simplemente seleccione la aplicación que necesita descompilarse de la lista de aplicaciones. Hay tres descompiladores diferentes que puede usar para descompilar una aplicación, a saber:
CFR 0.110, JaDX 0.6.1 o FernFlower (descompilador analítico).
Si no está buscando descargar dex2jar, simplemente use el apk_grabberscript python para descompilar cualquier apk en archivos jar. Luego los lees con jd-gui.