Cómo diseccionar una aplicación de Android

Es de conocimiento general que las aplicaciones de Android se distribuyen en forma de Paquete de aplicaciones de Android archivos, o archivos APK para abreviar. Sin embargo, la mayoría de las personas ven una APK como una caja negra y no tienen idea de cómo se creó o qué contiene. Incluso la mayoría de los desarrolladores de aplicaciones solo tienen una comprensión superficial de la anatomía de un APK. En entornos de desarrollo integrado, como Android Studio, todo lo que necesita es un solo clic para transformar un proyecto de Android en un APK.

En este tutorial, vamos a analizar una aplicación de Android. En otras palabras, vamos a abrir su APK y echar un vistazo a su contenido. Además, dado que un archivo APK es un archivo binario que solo deben leer las máquinas, también le presentaré algunas herramientas que puede usar para traducir su contenido a un formato más legible para los usuarios..

Prerrequisitos

Para seguir adelante, necesitas:

  • La última versión del SDK de Android
  • un dispositivo o emulador de Android con Android 4.4 o superior

1. ¿Por qué mirar dentro de un APK??

Muchas personas lo hacen por pura curiosidad. Otros disfrutan de la capacidad de acceder directamente a las imágenes, sonidos y otros activos de sus juegos o aplicaciones favoritas. Hay, sin embargo, razones más importantes por las que querría mirar dentro de un APK.

Aprendizaje

Si acabas de comenzar a aprender sobre el desarrollo de aplicaciones para Android, hay mucho que puedes aprender buscando en los archivos APK de aplicaciones populares o creadas por profesionales. Por ejemplo, al mirar los archivos de diseño XML de una aplicación que se ve bien en múltiples tamaños de pantalla, puede mejorar sus propias habilidades de creación de diseño..

Seguridad

Las aplicaciones descargadas de fuentes no confiables pueden contener código malicioso. Si ya eres un desarrollador de aplicaciones capacitado, al desensamblar tales aplicaciones, puedes mirar su código para comprender mejor lo que realmente están haciendo bajo el capó..

2. ¿Cómo se crea un APK?

No hay mucho que puedas aprender de un APK sin una comprensión básica de cómo se crea. De hecho, las herramientas más importantes que se utilizan para analizar un archivo APK son también las herramientas que se utilizan para crear uno..

Los proyectos de Android se componen principalmente de código fuente Java, diseños XML, metadatos XML y activos, como imágenes, videos y sonidos. Antes de que el sistema operativo Android pueda usar todos esos archivos, deben convertirse a un formato que entienda. Esta conversión implica una gran cantidad de tareas intermedias, que generalmente se conocen como el proceso de compilación de Android. La salida final del proceso de construcción es un APK o Paquete de aplicaciones de Android.

En los proyectos de Android Studio, el complemento de Android para Gradle maneja todas las tareas intermedias del proceso de construcción.

Una de las primeras tareas importantes es la generación de un archivo llamado R.java. Este es el archivo que permite a los desarrolladores acceder fácilmente al diseño del proyecto y a los recursos dibujables en su código Java utilizando constantes numéricas. Para generar el archivo, una herramienta llamada aapt, que es corto para Herramienta de empaquetado de activos de Android, se utiliza La herramienta también convierte todos los recursos XML, junto con el archivo de manifiesto del proyecto, en un formato binario.

Todos los archivos Java, incluyendo R.java, luego se convierten en archivos de clase utilizando el compilador de Java. Como ya sabrá, los archivos de clase constan de un código de bytes, que puede ser interpretado por un motor de tiempo de ejecución de Java. Sin embargo, Android usa un tipo especial de tiempo de ejecución llamado Android runtime (ART), que está optimizado para dispositivos móviles. Por lo tanto, una vez que todos los archivos de clase han sido generados, una herramienta llamada dx se utiliza para traducir el bytecode a Dalvik bytecode, un formato que ART entiende.

Una vez que los recursos y los archivos Java se han procesado, se colocan dentro de un archivo de almacenamiento que es muy similar a un archivo JAR. El archivo de archivado se firma luego, utilizando una clave privada que pertenece al desarrollador de la aplicación. Estas dos operaciones las realiza el complemento Gradle sin utilizar ninguna herramienta externa. La clave del desarrollador, sin embargo, se obtiene de un almacén de claves gestionado por keytool.

Por último, se realizan algunas optimizaciones en el archivo de almacenamiento utilizando el zipalign Herramienta para asegurarse de que la memoria que consume la aplicación mientras se ejecuta se mantenga al mínimo. En este punto, el archivo de almacenamiento es un APK válido, que puede ser utilizado por el sistema operativo Android.

3. Analizando los contenidos de un APK

Ahora que comprende cómo se crean y utilizan los archivos APK, abramos uno y echemos un vistazo a su contenido. En este tutorial, usamos el APK de una aplicación llamada Teclado suave de muestra, Lo que viene preinstalado en el emulador de Android. Sin embargo, si prefieres usar un dispositivo físico, puedes usar el APK de cualquier aplicación que hayas instalado..

Paso 1: Transfiriendo el APK a una computadora

Para examinar el contenido del APK, primero debe transferirlo desde el emulador a su computadora. Antes de hacerlo, debe conocer el nombre del paquete y la ruta absoluta de la APK. Utilizar adb para abrir una sesión de shell en tu emulador.

shell adb

Una vez que vea el indicador de shell, use el lista de pm comando para enumerar los nombres de paquetes de todas las aplicaciones instaladas.

pm lista de paquetes

El nombre del paquete de la aplicación que nos interesa es com.example.android.softkeyboard. Deberías poder verlo en la lista. Al pasar el nombre del paquete a la pm camino comando, puede determinar la ruta absoluta de la APK.

pm ruta com.example.android.softkeyboard

La salida del comando anterior se ve así:

paquete: /data/app/SoftKeyboard/SoftKeyboard.apk

Ahora que conoce su ruta, puede salir del shell y transferir el APK a su computadora usando el adb pull mando. El siguiente comando lo transfiere a su computadora / tmp directorio:

adb pull /data/app/SoftKeyboard/SoftKeyboard.apk / tmp

Paso 2: Extraer los contenidos de la APK

Anteriormente en este tutorial, aprendiste que una APK no es más que un archivo comprimido. Esto significa que puede usar el administrador de archivos predeterminado de su sistema operativo para extraer su contenido. Si está utilizando Windows, es posible que primero deba cambiar la extensión del archivo .apk a .cremallera. Después de extraer el contenido de la APK, debería poder ver los archivos dentro de la APK.

Si eres un desarrollador de aplicaciones, muchos de los archivos en el APK deberían ser familiares. Sin embargo, aparte de las imágenes en el res carpeta, los archivos están en un formato con el que no se puede trabajar sin la ayuda de algunas herramientas.

Paso 3: Descifrando archivos XML binarios

El SDK de Android incluye todas las herramientas que necesita para analizar el contenido de un APK. Aprendiste antes que aapt se utiliza para empaquetar recursos XML durante el proceso de construcción. También se puede utilizar para leer mucha información de un APK.

Por ejemplo, puedes usar su volcar xmltree Opción para leer el contenido de cualquier archivo XML binario en el APK. Así es como puedes leer un archivo de diseño llamado res / layout / input.xml:

aapt dump xmltree /tmp/SoftKeyboard.apk res / layout / input.xml

La salida debe verse algo como esto:

N: android = http: //schemas.android.com/apk/res/android E: com.example.android.softkeyboard.LatinKeyboardView (línea = 21) A: android: id (0x010100d0) = @ 0x7f080000 A: android: layout_width (0x010100f4) = (tipo 0x10) 0xffffffff A: android: layout_height (0x010100f5) = (type 0x10) 0xfffffffe A: android: layout_alignParentBottom (0x0101018e) = (type 0x12)

No es XML, pero, gracias a la sangría y las etiquetas como norte para espacio de nombres, mi por elemento, y UNA Por atributo, deberías poder leerlo..

Paso 4: Descifrando cadenas

En el paso anterior, vio que el XML descifrado tiene números hexadecimales en lugar de cadenas. Esos números son referencias a cadenas en un archivo llamado recursos.arsc, que representa la tabla de recursos de la aplicación.

Puedes usar el volcar recursos opción de aapt para ver la tabla de recursos. Así es cómo:

aapt dump --values ​​resources /tmp/SoftKeyboard.apk

Desde la salida del comando, puede determinar los valores exactos de las cadenas utilizadas en la aplicación. Aquí está la entrada para uno de los números hexadecimales en el XML:

recurso 0x7f080000 com.example.android.softkeyboard: id / keyboard: t = 0x12 d = 0x00000000 (s = 0x0008 r = 0x00)

Paso 5: Desmontaje del código de bytes de Dalvik

El archivo más importante en el APK es classes.dex. Este es el archivo que utiliza el tiempo de ejecución de Android al ejecutar la aplicación. Contiene el código de bytes Dalvik generado durante el proceso de construcción..

Al desensamblar este archivo, puede obtener información sobre las clases Java utilizadas en la aplicación. Para ello, puede utilizar una herramienta llamada dexdump. Con el siguiente comando, puede redirigir la salida de dexdump a un archivo que puede ser abierto por cualquier editor de texto.

dexdump -d /tmp/classes.dex> /tmp/classes.dasm

Si abres classes.dasm, vas a ver que tiene cientos de líneas de código de bajo nivel que se ve así:

No hace falta decirlo, entenderlo es muy difícil. Afortunadamente, puede cambiar el formato de salida de dexdump a XML usando el -l opción. Con el siguiente comando, puede redirigir su salida a un archivo que puede abrir en un navegador.

dexdump -d -l xml /tmp/classes.dex> /tmp/classes.xml

La cantidad de información disponible en el formato XML es menor, pero le da una idea clara de las clases, métodos y campos de Java presentes en la aplicación..

Conclusión

En este tutorial, aprendiste cómo se crea un APK y qué contiene. También aprendió a usar las herramientas disponibles en el SDK de Android para descifrar el contenido de los archivos APK. No hay mucha documentación sobre estas herramientas, pero como son de código abierto, puedes intentar leer su código fuente ampliamente comentado para aprender más sobre ellas..

Si está buscando algo con lo que sea más fácil trabajar, puede intentar usar herramientas populares de terceros como dex2jar, que genera un código desensamblado más legible, o JADX, un descompilador que puede generar código Java.