descompilación de DEX en código fuente Java

706

¿Cómo se puede descompilar archivos Android DEX (VM bytecode) en el código fuente Java correspondiente?

Será
fuente
Echa un vistazo aquí . Obtendrá posibles pistas desde allí para seguir adelante.
Kevin Boyd el
La información actualizada está disponible en el blog de coders
Md Mohsin el
Si tiene dinero, compre jeb , de lo contrario use jadx , vea aquí por qué
polym
Hay una nueva plataforma cruzada (java) y una herramienta de código abierto, que le permite hacer eso, solo
consulte

Respuestas:

882

Es fácil

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.

Procedimiento:

Y aquí está el procedimiento sobre cómo descompilar:

Paso 1:

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 comandos

Nota 2: en Linux / Mac no te olvides de sho bash. 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

documentación dex2jar

Paso 2:

Abra el tarro en JD-GUI

La fuente descompilada

Dheeraj Bhaskar
fuente
57
+1. Probé tanto Baksmali como Dex2jar. Dex2Jar + JD-Gui gana por darle un código fuente perfectamente legible para la mayoría de los archivos .dex.
Jonathan Dumaine
Hola, ¿Podrías compartir la forma en que vas? Te estaré muy agradecido.
Arslan Anwar
2
La oración anterior hizo sonar una campana: parece ser una semi cita de aquí: geeknizer.com/decompile-reverse-engineer-android-apk (¿o al revés?). Los artículos vinculados explican brevemente las herramientas mencionadas anteriormente, así como Smali y APKTool.
AgentKnopf
2
@ JonathanDumaine que depende. Si los JAR están ofuscados y desea hacer pequeñas modificaciones, Backsmali es el único camino a seguir. ¡Prima! Con APKTool también recuperas todos los archivos XML, imágenes y otros recursos. Mira mi respuesta .
Alba Méndez
3
@JonathanDumaine Estoy de acuerdo con jmendeth, apktool también es el camino a seguir si desea descompilar su apk, modificarlo y luego volver a compilarlo. Al usar dex2jar y jd-gui, la fuente es realmente legible, ¡pero no puede recompilar sin algunos errores!
darkheir
138

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.

Zach Lipton
fuente
61

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.

volver a registrar
fuente
3
smali es un lenguaje tipo ensamblado basado en dalvik IL, no se puede traducir directamente a Java.
volver a registrar el
@endryha No hay herramientas capaces de hacer eso. Vea esta pregunta para más información.
Alba Mendez
1
Código, código, código, ... ¿Por qué solo código? Si usa APKTool, ¡recupera todo ! Y es tan simple como ./apktool d myprogram.apk. Mira mi respuesta .
Alba Méndez
30

Una versión más completa de la respuesta de Fred :

Forma manual

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.

Manera automática

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 .

Alba Mendez
fuente
25

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!

polimero
fuente
Supongo que jadx no tiene la opción de compilación, pero el código es legible
Buddy
@EnesBattal quieres decir javac "$(find . -name '*.java')"?
Polym
¿Qué tal formar un apk? colocación de clases en apk, zipalign, firma, etc.
Buddy
@EnesBattal Bueno, puedes ayudar a implementar eso; de lo contrario, podrías usar apktool para eso ... o zipalign / sign con las herramientas de Android
2015
1
@lejonl ¡Pena de muerte para ti, monstruo!
polym
17

He usado

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

Pero ninguno supera las herramientas de Google

1) Android Studio 2.x: compilar> analizar apk ingrese la descripción de la imagen aquí

2) Android Studio 3.0: perfil o depuración APK ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ishandutta2007
fuente
1
Más uno para Enjarify. En mi experiencia personal, ha demostrado dar mejores resultados en comparación con d2j
qre0ct
15

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

faetón
fuente
Se ve prometedor. ¿Descompila el código Java directamente desde el APK? ¿Qué pasa con el código ofuscado de Java?
Sandalone
14

Dado que Dheeraj Bhaskarla respuesta es relativamente antigua como muchos años atrás.

Aquí está mi última respuesta (año 2019):

Lógica principal

de dexa java sourcecode, actualmente tiene dos tipos de solución:

  • One Step: convertir directamente dexajava sourcecode
  • Two Step: primer convertir dexa jar, segundo convertir jarajava sourcecode

Solución de un paso: dexdirectamente ajava sourcecode

Herramientas

Proceso

  1. descargue jadx-0.9.0.zip , descomprímalo, en la bincarpeta 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

  1. abrir dexarchivo

entonces puede mostrar el código fuente de Java:

  1. File -> save as gradle project

luego obtuve el código fuente de Java:


Solución de dos pasos

Paso 1: dexajar

Herramientas

Proceso

descargue dex2jar zip , descomprima got d2j-dex2jar.sh, luego:

  • apka jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexa 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

Paso2: jarajava sourcecode

Herramientas

Proceso

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:

Conclusión

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 : 安卓 应用 的 安全 和 破解

crifan
fuente
extraño, pero si trato de ejecutar el paso 1 (DEX a descompilar tarro en Windows) a través de este comando 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
Сергей
@ Сергей podrías probar: ¿ d2j-dex2jar.bat "D:\android\some_dex_file.dex"está bien o no?
crifan
Sí, lo intenté exactamente >d2j-dex2jar.bat file.dexpero no está bien. tal vez es porque mi .dexarchivo fue copiado dalvik-cache?
Diciembre
1
@ Сергей sí, la razón más posible es su dicho dex is copied from dalvik-cache, debería serdex is decompiled from apk
crifan
@crifan, gracias por esta respuesta. JADX es impresionante. Regresaré al trabajo. Emmanuel @ JD-Gui
Emmanuel Dupuy
13

Una vez que haya descargado su archivo APK, debe realizar los siguientes pasos para obtener un código / documento editable de Java.

  1. Convierta su archivo apk a zip (mientras inicia su descarga, no vaya con la opción "guardar", simplemente vaya con "guardar como" y mencione su extensión como .zip) haciendo esto, puede evitar APKTOOL ...
  2. Extraiga el archivo zip, allí puede encontrar somefilename.dex. así que ahora necesitamos convertir dex -> .class
  3. Para hacer eso, necesita "dex2jar" (puede descargarlo desde http://code.google.com/p/dex2jar/ , después de extraerlo, en el símbolo del sistema debe mencionar como, [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Tenga en cuenta que su somefilename.dex debe estar dentro de la misma carpeta donde tiene su dex2jar).
  4. Descargue jad desde http://www.viralpatel.net/blogs/download/jad/jad.zip y extráigalo. Una vez extraído, puede ver dos archivos como "jad.exe" y "Readme.txt" (a veces puede aparecer "jad.txt" en lugar de "jad.exe", así que cambie el nombre de su extensión as.exe para ejecutar)
  5. Finalmente, en el símbolo del sistema, debe mencionar como [D: \ jad> jad -sjava yourfilename.class] analizará su archivo de clase en un documento editable de Java.
Kamal
fuente
8

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í .

hcpl
fuente
1
aceptado ya que eres el que dice que no es (actualmente) posible, lo que parece cierto.
Será
@¿Todo es posible? Solo depende de cómo lo veas. La descomposición es posible, pero tal vez no de la forma en que estás pensando.
Alba Mendez
8

La ingeniería inversa de Android es posible . Siga estos pasos para obtener el archivo .java del archivo apk.

Paso 1 . Usando dex2jar

  • Generar archivo .jar a partir de archivo .apk
  • comando: dex2jar sampleApp.apk

Paso 2 . Descompilación de .jar usando JD-GUI

  • descompila los archivos .class, es decir, volveremos a ofuscar .java desde el apk.
gtiwari333
fuente
Pero si vuelvo a compilar todo el código fuente descompilado, no se ejecutará, el compilador muestra muchos errores.
¿hay alguna solución disponible para descompilar el código fuente de Android Java que se ejecutará en eclipse
2
Ingeniería inversa no no necesariamente significa descompilación . De hecho, los JAR ofuscados con ProGuard no se descompilarán correctamente.
Alba Méndez
Si está tratando con código ofuscado, es mejor simplemente desmontarlo . No obtendrá la fuente Java, pero siempre podrá ver / modificar el código. Mira mi respuesta .
Alba Mendez
Yo recomendaría hacer tanto el descompilación como el desmontaje. El código descompilado resultante es más fácil de entender, pero todas las modificaciones deben hacerse con la versión desensamblada. Especialmente cierto si se ha usado proguard. Encuentro que dex2jar combinado con jd-gui es el mejor para descompilar.
Mikko Rantalainen
6

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
gavenkoa
fuente
5

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.

MPaulo
fuente
2

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).

Rishabh Maurya
fuente
1

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.

Jeff Brateman
fuente