¿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
.sh
secuencias de comandos se reemplazan por.bat
secuencias de comandosNota 2: en Linux / Mac no te olvides de
sh
obash
. 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.X
directorio, 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
/ .class
como lo dex2jar
hace (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 Bhaskar
la respuesta es relativamente antigua como muchos años atrás.
Aquí está mi última respuesta (año 2019):
de dex
a java sourcecode
, actualmente tiene dos tipos de solución:
One Step
: convertir directamente dex
ajava sourcecode
Two Step
: primer convertir dex
a jar
, segundo convertir jar
ajava sourcecode
dex
directamente ajava sourcecode
bin
carpeta puede ver la línea de comandos jadx
o la versión GUI jadx-gui
, haga doble clic para ejecutar la versión GUI:jadx-gui
dex
archivoentonces puede mostrar el código fuente de Java:
File
-> save as gradle project
luego obtuve el código fuente de Java:
dex
ajar
descargue dex2jar zip , descomprima got d2j-dex2jar.sh
, luego:
apk
a jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
a jar
:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
ejemplo:
➜ 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
jar
ajava sourcecode
many
código descompilará el errorminor
código descompilará el errorno
error de descompilación de código
popularProcyon
aquí la demostración Procyon
convierte 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.dex
solo 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.dex
pero no está bien. tal vez es porque mi .dex
archivo 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 .dex
archivo 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.apk
Paso 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.dex
de 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_grabber
script python para descompilar cualquier apk en archivos jar. Luego los lees con jd-gui.