La descompilación de Android Apk parece fácil

Solo estaba jugando. Descargué el dex2jar http://code.google.com/p/dex2jar/ y el descompilador de Java JD-GUI http://java.decompiler.free.fr/?q=jdgui

tengo mío apk (firmado, sellado y en Google Play), usó dex2jar para convertirlo en un repositorio jar.

línea de comando (los usuarios de Windows usan .bat, todos los demás .sh):

d2j-dex2jar.bat -f MyAwesomeApp.apk

Arrastré y solté la salida en un JD-GUI, y todos los archivos de clase, reapareció el código original. Me desconcertó un poco. ¿Está mi código Java/Android así de expuesto? ¿Cómo protege ProGuard mi apk si se puede descompilar y regenerar tan fácilmente? No parece ofuscado en absoluto...

Gracias de antemano.

preguntado el 29 de julio de 12 a las 03:07

¡JAJAJA! ¿No has aplicado proguard a tu apk? Si la respuesta es no, ¡esa es tu respuesta! :) -

Necesitas configurar ProGuard desarrollador.android.com/tools/help/proguard.html Además, es posible que desee echar un vistazo a NDK desarrollador.android.com/tools/sdk/ndk/index.html -

Usé Proguard y edité el archivo project.properties antes de liberar mi aplicación. Debo mencionar que los nombres de las clases no son mis originales, pero todos los nombres de los métodos parecen ser originales. Es decir, revertir mi aplicación es fácil, porque solo han cambiado los nombres de las clases. EDITAR: También parece que los nombres de los métodos estáticos han cambiado. Pero revertir esto no es ciencia espacial. -

¿Puedes publicar tu proguard.cfg? y has comprobado ejemplos -

Parece que no ha configurado proguard correctamente; para obtener aún más ofuscación, consulte saikoa.com/dexguard -

2 Respuestas

Los ofuscadores generalmente simplemente cambian los nombres de clases, métodos y campos a nombres que no tienen significado. Entonces, si tiene "ScoreCalculator.computeScore (Player p, Match m)", terminará con "A.zk (F f, R r)". Esto es similar a lo que hacen los compiladores Uglify o Closure para javascript, excepto que en javascript es para reducir la longitud de la fuente.

Es posible entender lo que hace el método de todos modos, solo que es más difícil.

Además, Java utiliza enlace tardío (como archivos DLL o SO). Por lo tanto, las llamadas que van fuera de su código (como paquetes java.util, java.lang, etc.) no se pueden ofuscar. Además, si su código necesita recibir llamadas desde el exterior (un ejemplo típico, registrar un oyente en un botón), ese código no se puede ofuscar. Lo mismo sucede con una DLL, donde puede ver claramente el nombre del método que debe llamarse desde fuera de la DLL y las llamadas a otras DLL.

Sin embargo, el mapeo entre un determinado código fuente y el código compilado no es necesariamente uno a uno. Los compiladores de C más antiguos solían producir el mismo código de operación para una directiva fuente dada, por lo que los descompiladores eran muy efectivos. Luego, los compiladores de C agregaron muchas optimizaciones al código de operación resultante, y estas optimizaciones hicieron que el descompilador fuera en su mayoría ineficaz. [ XNMUX ]

Java nunca implementó (muchas) optimizaciones en tiempo de compilación, porque para ejecutarse en diferentes plataformas (que incluyen diferentes dispositivos Android), Java decidió aplicar optimizaciones serias más tarde, en tiempo de ejecución, según la arquitectura y las propiedades de hardware del dispositivo en ejecución. (De esto se trata principalmente "HotSpot" [ XNMUX ]).

Los buenos ofuscadores generalmente también reordenan las instrucciones del código de bytes, o insertan algunas inútiles, o aplican algunas optimizaciones por adelantado para que los descompiladores no puedan (o sean menos capaces) de derivar el código fuente tan fácilmente.

Esta técnica es inútil cuando se trata de personas que pueden leer bytecode, ya que cualquier posible ofuscación de C es inútil si una persona puede leer código ensamblador.

Como demuestran muchos softwares de craqueo, la ingeniería inversa siempre es posible, incluso con C u otros idiomas, incluso en el firmware (piense en los firmwares de iPhone), porque el cliente en el que se ejecuta su código siempre no es de confianza y siempre se puede manipular.

Si tiene un código de misión crítica, algo que vale mucho dinero y que alguien más puede robar, le sugiero que lo ejecute en el lado del servidor o lo valide en el lado del servidor de alguna manera.

Respondido 01 ago 12, 04:08

También podría agregar que existe una alternativa moderna a esta ruta APKTool->dex2jar->JD-GUI.

Prueba el descompilador de APK y DEX de código abierto llamado Jadx: https://sourceforge.net/projects/jadx/files/ También tiene versión online aquí: http://www.javadecompilers.com/apk

Respondido el 08 de Septiembre de 15 a las 06:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.