Cómo sacar el código fuente de un archivo APK

Androidpit Tips and tricks 4
© nextpit

Tanto para desarrolladores como para curiosos que quiere conocer que es lo que verdaderamente está pasando dentro del dispositivo y con quién se comunica en el exterior. Podemos tener el código fuente de una aplicación con tan solo unos sencillos pasos. Puede que el código no sea todo lo limpio que nos gustaría pero algo se puede ver.

Ingeniería inversa con un archivo APK ¿es legal?

El proceso para conseguir el código de programación desde un archivo ejecutable o cualquier otro archivo ya compilado se denomina ingeniería inversa. La ingeniería normal, por llamarla de alguna manera sería el propio desarrollo del código fuente.

Esta actividad es legal dependiendo del caso. En cada país la legislación puede ser diferente y puede permitir más o menos. En caso particular de España la legislación permite hacer ingeniería inversa con una serie de condiciones que podemos leer en los artículo 100 de la Ley de Propiedad Intelectual.

code java teaser
Se puede fisgonear en el código. / © ANDROIDPIT

Resumiendo. Vamos a poder extraer el código siempre y cuando seamos propietarios o tengamos licencia de uso, la información no haya sido expuesta previamente y que la información obtenida no se utilice para la comercialización de un programa sustancialmente similar el cual infrinja los derechos de autor.

En nuestro caso principalmente es útil para aprender a desarrollar código viendo ejemplos reales.

Sacar el código de un APK

Si la aplicación es Open Source solo tienes que buscar el código fuente que normalmente se cuelga en repositorios tipo GitHub. Si no es Open Source vamos a tener que hacer lo siguiente:

Para poder leer el código de un archivo con extensión .apk necesitamos varias herramientas y para empezar necesitamos el susodicho archivo APK de la aplicación. Para conseguirlo podemos buscarlo en los repositorios de aplicaciones online o si tenemos la aplicación instalada en el dispositivo podemos extraer la APK desde un explorador de archivos.

A partir de aquí hay varios métodos, varios caminos que llevan más o menos al mismo resultado. Aquí os expongo el que me resulta más sencillo.

woman code 01
Código para todos. / © ANDROIDPIT

Descarga dos herramientas que vamos a necesitar posteriormente. Una es un archivo para exportar las clases del APK a un archivo java  con extensión .jar dex2jar. Y una aplicación para leer los archivos con extensión .jar JD-GUI, disponible para diferentes sistemas.

Haz una copia del archivo APK de la aplicación y cambia la extensión de .apk a .zip. Guárdalo. 

Abre el archivo .zip y extrae el archivo classes.dex. Coloca este archivo en la carpeta descomprimida de dex2jar.

En un lugar vacío de la carpeta pulsa el botón derecho del ratón a la vez que presionas en el teclado shift (en Windows). Del menú elige 'Abrir aquí una ventana de comandos'.

sacar codigo apk
Pasa las clases del APK a un archivo JAR. / © ANDROIDPIT

En la consola que se acaba de abrir  introduce el siguiente comando 'd2j-dex2jar.bat classes.dex'. Pulsa intro y después de unos segundos en la misma carpeta encontraras un nuevo archivo llamado 'classes-dex2jar.jar'. Como alternativa puedes usar la plataforma online APK decompiler.

Con este nuevo archivo 'classes-dex2jar.jar' podemos explorar el código fuente de la aplicación y ver todas sus clases con el programa JD-GUI. 

Descomprime el archivo .zip con el JD-GUI y ejecuta el archivo .exe que encontrarás en su carpeta. Una vez que arranca el programa. Selecciona el icono para abrir un archivo o entra en File > Open file... elige el archivo 'classes-dex2jar.jar' que se encuenta en la carpeta de dex2jar y ábrelo.

Podrás ver las librerías que usa la aplicación y las clases que tiene

sacar codigo apk 02
Código extraído de un archivo APK. / © ANDROIDPIT

Problemas que pueden surgir con el código

Las herramientas de ingeniería inversa no suelen conseguir el código original al 100%. Hay un cierto desfase entre el código que se escribe y el código que se recupera. Por lo general los creadores de una aplicación no le gusta que terceros puedan jugar con el código que tanto trabajo les ha llevado desarrollar.

Para proteger el código de las aplicaciones Google creó hace unos años una herramienta llamada ProGuard. Esta herramienta optimiza el código de la aplicación y lo protege de una posterior ingeniería inversa. Hoy en día la mayoría de las aplicaciones suelen tener el código optimizado con ProGuard así que el código puede ser muy complicado de entender por la perdida de organización.

¿Has querido saber alguna vez que hace de verdad una aplicación?

Ir al comentario (19)
Luis Ortega

Luis Ortega
Redactor

Luis es editor y moderador del foro. Natural de Granada, donde se formó como geólogo y profesor. Después de muchos devenires profesionales aterrizó en AndroidPIT en 2015. Geek confesado. Le gusta el software libre y como no, Android. Le encantan las apps que gestionan su mala memoria y las que facilitan la vida en general. Le encanta el mar y disfruta de su tiempo libre subido sobre cualquier tipo de tabla.

Ver todos los artículos
Te ha gustado este artículo? Compártelo!
Artículos recomendados
Artículo siguiente
19 Comentarios
Escribir un nuevo comentario:
Los cambios realizados se guardarán. No hay borradores guardados durante su edición
Escribir un nuevo comentario:
Los cambios realizados se guardarán. No hay borradores guardados durante su edición

  • 1
    Jose 2 jun. 2020 Link al comentario

    Me podrias darme tu correo psra hacerte unas pregunticas


  • 1
    Juan Patiño 9 jun. 2017 Link al comentario

    Al inicio solo pense en ver el codigo como ejemplo y tomar muchos ejemplos, pero luego me imagine en en inyectar codigo en la aplicacion osea vulneralna. Asi que mi proxima investigacion es: como se inyecta informacion sobre una apk ya instalada.


  • 1
    FerYel Aco 12 abr. 2017 Link al comentario

    buenas tardes muy bueno el tutorial, pero no puedo completar el paso de convertir el archivo 'classes.dex' en un jar porque me sale un error en la ventana de comandos que dice: "java" no se reconoce como un comando interno o externo,
    programa o archivo por lotes ejecutable. NO puedo avanzar más de allí. Ayuda


    • Jesus Lugo 1
      Jesus Lugo 26 abr. 2017 Link al comentario

      Me pasa lo mismo de ahi no puedo avanzar... Alguien nos poderia ayudar por favor?


    • Pedro Soto Almonacid 2
      Pedro Soto Almonacid 9 nov. 2017 Link al comentario

      Estimado, eso ocurre porque de momento en tu pc no se reconoce el lenguaje de programación java dentro de tu consola de comandos y por eso puede que el codigo este bien escrito pero el compilador cmd no lo reconoce como lengua del pc. Para solucionarlo debes descargar e instalar el jdk de java que se descarga gratis por oracle.org creo.. y luego. Una vez instalada una carpeta de jdk en tu pc debes ir a mi pc, click derecho, propiedades, configuración avanzada, opciones avanzadas, variables de entorno, y agregar una nueva variable para tu sistema. Te pedirá elegir una carpeta... Selecciona la carpeta donde instalaste el jdk,por lo general es en program files/java/jdk.versionx/bin es importante que dejes seleccionada la carpeta bin... Una vez que la agreges reinicia tu pc y ahora en tu consola podras escribir ciertos comandos usando java (creo que no puedes usar como IDE la consola.. es por eso que no reconoce todos los códigos que escribas por mas que este en java.. pero algunas acciones puntuales como la de este post si que podras.. saludos desde Chile.

      Luis Ortega


  • Mauricio Davila 1
    Mauricio Davila 2 mar. 2017 Link al comentario

    muy buen, tutorial...te felicito


  • Jorge Leopoldo Capechi 2
    Jorge Leopoldo Capechi 4 ago. 2016 Link al comentario

    Deberia ser:
    Hoy en día la mayoría de las aplicaciones que "NO", son open source suelen tener el código optimizado con ProGuard así que el código puede ser muy complicado de entender por la perdida de organización.
    Si es Open Source es que su código fuente esta disponible para ser leído.

    Luis Ortega


  • Marcos Carrero 2
    Marcos Carrero 12 jun. 2016 Link al comentario

    Luis por favor me envías un correo a Marcostatocarrero@gmail.com. necesito hacerte una consulta


    • Iñaki 76
      Iñaki
      • Admin
      12 jun. 2016 Link al comentario

      Le puede contactar a traves de la pagina tambien, http://www.androidpit.es/usuario/6970559/luis-ortega y luego enviar mensaje, eso solo le llega a el.


      • Marcos Carrero 2
        Marcos Carrero 13 jun. 2016 Link al comentario

        gracias iñaki


  • 14
    Ariel Alejandro Currá 6 feb. 2016 Link al comentario

    La verdad que no me interesa pero igual gracias


  • Ramon A. 35
    Ramon A. 5 feb. 2016 Link al comentario

    Muchas gracias Luis. Interesante articulo. Saludos


  • Iñaki 76
    Iñaki
    • Admin
    5 feb. 2016 Link al comentario

    Interesante articulo @Luis, jijiji, habrá que probarlo, algo me dice que veré cosas curiosas ...


  • Daniel 62
    Daniel 5 feb. 2016 Link al comentario

    A menos que fuera programador o hacker me serviría descomprimir los APK.

    Ariel Alejandro Currá


  • Lucas FC 17
    Lucas FC 5 feb. 2016 Link al comentario

    Algo me dice que a @Luis se le ocurrió el artículo por un hilo en el foro 😀😀

    Squiku A.Luis OrtegaSçbr²⁴


    • Sçbr²⁴ 54
      Sçbr²⁴ 5 feb. 2016 Link al comentario

      Algo me dice lo mismo jajaja

      Lucas FCAriel Alejandro Currá


  • Uchiharturo 42
    Uchiharturo 4 feb. 2016 Link al comentario

    ._. En vez de eso, mejor hago mi propia app

    Ariel Alejandro Currá


  • Sçbr²⁴ 54
    Sçbr²⁴ 4 feb. 2016 Link al comentario

    No termino de entender de que sirve sacar el codigo fuente ._.

    Squiku A.Ariel Alejandro CurráDanielCuenta desactivada

Escribir un nuevo comentario:
Los cambios realizados se guardarán. No hay borradores guardados durante su edición