Saltar al contenido

Análisis de APK: desempaquetar, leer el manifiesto y seguir el flujo

    Análisis de APK:

    desempaquetar, leer el manifiesto y seguir el flujo

    Malware y Reversing  |  unfantasmaenelsistema.com

    Una aplicación Android es, por dentro, un archivo ZIP con una estructura fija. Dentro viven el manifiesto que declara permisos y componentes, el bytecode compilado en formato DEX, los recursos, las librerías nativas y la firma que garantiza que nadie ha tocado el paquete después de construirlo. Con herramientas gratuitas se puede abrir ese envoltorio, recuperar un código Java o Kotlin muy legible y entender qué hace la app sin instalarla en ningún teléfono.

    Este artículo recorre el APK de fuera hacia dentro con la mirada de quien hace triaje: qué contiene cada pieza, cómo leer el manifiesto para localizar la superficie de ataque, cómo pasar de DEX a código fuente con jadx, qué comportamientos levantan sospecha y cómo montar un entorno de análisis aislado. Todos los ejemplos son de lectura: inspeccionar el paquete, nunca modificarlo ni ejecutar la muestra fuera de un laboratorio sin salida a la red.

    Qué aprenderás en este artículo

    La estructura de un APK y de un AAB: manifiesto, DEX, resources.arsc, lib nativa y firma v2/v3 · Cómo desempaquetar con apktool y decodificar el AndroidManifest.xml binario · Cómo leer permisos peligrosos y componentes exportados como superficie de ataque · Cómo recuperar código legible con jadx y navegar el flujo desde los puntos de entrada · Qué patrones sospechosos buscar: SMS premium, abuso de accesibilidad, carga dinámica de DEX, ofuscación · Cómo analizar en un emulador aislado y automatizar el primer barrido con MobSF

    1. Qué hay dentro de un APK

    Un APK (Android Package) es un ZIP con la extensión cambiada. Descomprimirlo con cualquier utilidad de archivo deja a la vista una estructura estándar. Un AAB (Android App Bundle) es el formato que se sube a Google Play: no se instala directamente, sino que Play genera APK optimizados por dispositivo a partir de él; para el análisis se suele trabajar con el APK universal que se puede extraer del bundle con bundletool.

    PiezaQué esQué aporta al análisis
    AndroidManifest.xmlManifiesto en XML binario: permisos, componentes, SDK mínimo/objetivoEl mapa de la app: qué pide y qué expone al resto del sistema
    classes.dex (uno o varios)Bytecode Dalvik con todo el código de la aplicaciónSe decompila a Java/Kotlin legible; es el grueso del trabajo
    resources.arscTabla binaria de recursos: cadenas, colores, layoutsCadenas de texto, URLs y claves a veces guardadas como recurso
    res/Recursos sin compilar: iconos, XML de layout, ficheros rawConfiguración embebida, endpoints, certificados fijados
    lib/<abi>/*.soLibrerías nativas ELF por arquitectura (arm64-v8a, etc.)Lógica movida a C/C++ para dificultar el análisis; se mira con radare2/Ghidra
    assets/Ficheros arbitrarios empaquetados tal cualSegundas etapas, DEX adicionales, modelos, bases de datos
    META-INF/Firma del paquete: certificados y manifiestos de firmaIdentidad del firmante y esquema de firma usado

    1.1 La firma del paquete

    Android exige que todo APK vaya firmado. El esquema v1 (JAR signing) firmaba fichero a fichero dentro de META-INF y dejaba margen para manipular el ZIP; v2 (Android 7) firma el archivo completo como un bloque; v3 (Android 9) añade rotación de clave; v4 acompaña con una firma incremental en un fichero aparte. Verificar la firma con apksigner verify –verbose dice qué esquemas están presentes y qué certificado firma. La firma garantiza integridad y continuidad del firmante entre actualizaciones, no que la app sea legítima: cualquiera genera un certificado autofirmado, y hay familias de malware que reutilizan el mismo certificado en decenas de muestras, lo que a su vez sirve para agruparlas.

    2. Desempaquetar: apktool y el manifiesto

    El AndroidManifest.xml de un APK no es texto: es XML en un formato binario propio. Para leerlo hay que decodificarlo. apktool d muestra.apk hace dos cosas: reconstruye el manifiesto y los recursos a XML legible, y desensambla el DEX a smali, la representación textual del bytecode Dalvik. El smali es verboso pero fiel; sirve cuando la decompilación a Java falla o cuando hay que ver instrucciones exactas.

    # Desempaquetado y lectura de metadatos. Ninguna de estas ordenes ejecuta la app.
    apktool d -o muestra_out muestra.apk        # manifiesto + recursos + smali
     
    # Metadatos rapidos sin desempaquetar del todo:
    aapt dump badging muestra.apk               # package, versiones, permisos, features
    aapt dump permissions muestra.apk           # solo la lista de permisos
    apksigner verify --verbose --print-certs muestra.apk   # esquema de firma y certificado
    unzip -l muestra.apk                         # inventario de ficheros del paquete

    Con el manifiesto ya en claro, la lectura sigue un orden fijo: package y versiones; uses-sdk (un targetSdk bajo relaja comprobaciones modernas del sistema); la lista de uses-permission; y el bloque de componentes — activities, services, broadcast receivers y content providers — prestando atención a cuáles son accesibles desde otras apps.

    2.1 Permisos peligrosos

    Android clasifica los permisos por nivel de protección. Los dangerous son los que dan acceso a datos o funciones sensibles y requieren consentimiento explícito en tiempo de ejecución. No hay permiso «malicioso» en sí mismo — una app de mensajería legítima pide SMS y contactos — pero el conjunto pedido debe encajar con lo que la app dice ser. Una supuesta linterna que pide SMS, accesibilidad y administración del dispositivo no cuadra.

    Permiso / grupoDa acceso aPor qué se vigila
    RECEIVE_SMS, SEND_SMS, READ_SMSLeer, recibir y enviar mensajes de textoRobo de OTP bancarios, suscripción a SMS premium, propagación
    BIND_ACCESSIBILITY_SERVICELeer la pantalla y simular toques en cualquier appBase de los troyanos bancarios: rellenan formularios y conceden permisos solos
    BIND_DEVICE_ADMINPolíticas de administración: bloqueo, borradoDificultar la desinstalación; ransomware de bloqueo de pantalla
    SYSTEM_ALERT_WINDOWDibujar por encima de otras appsOverlays de phishing sobre la app del banco
    REQUEST_INSTALL_PACKAGESInstalar otros APKDescarga e instalación de una segunda etapa (dropper)
    QUERY_ALL_PACKAGESEnumerar todas las apps instaladasReconocimiento: buscar apps de banca concretas para atacarlas

    2.2 Componentes exportados

    Un componente está exportado cuando otra aplicación del dispositivo puede invocarlo. Lo está de forma explícita con android:exported=»true», o de forma implícita si declara un intent-filter y no lo desmiente (desde Android 12 hay que declararlo siempre). Cada componente exportado es una entrada a la app que hay que revisar: un content provider exportado sin permisos puede filtrar la base de datos interna; un service exportado puede ejecutar acciones privilegiadas por encargo de un tercero; un broadcast receiver exportado puede recibir eventos falsificados. En el análisis se listan todos, se marca cuáles no deberían ser públicos y se sigue su código.

    3. De DEX a código legible: jadx

    El código de la app está compilado en DEX (Dalvik Executable), un formato de bytecode diseñado para dispositivos con poca memoria: un solo fichero agrupa todas las clases. jadx decompila DEX directamente a Java (con soporte razonable para reconstruir patrones de Kotlin) y ofrece una interfaz — jadx-gui — con árbol de clases, búsqueda global, navegación por referencias y decompilado del manifiesto ya decodificado. Para automatizar, jadx en línea de comandos vuelca todo el proyecto a ficheros .java.

    # Decompilacion a codigo fuente. Lectura: genera .java, no toca la muestra.
    jadx -d muestra_src muestra.apk             # vuelca todo el proyecto
    jadx-gui muestra.apk                        # exploracion interactiva
     
    # Alternativa clasica en dos pasos:
    d2j-dex2jar muestra.apk -o muestra.jar      # DEX -> JAR (dex2jar)
    #   y abrir muestra.jar en un visor de bytecode Java

    Con el código delante, el flujo se sigue desde los puntos de entrada, no leyendo de arriba abajo. Los puntos de entrada de una app Android son: la clase Application (su onCreate corre antes que nada), la activity de lanzamiento, los services y receivers declarados en el manifiesto, y cualquier callback de bibliotecas (push, jobs programados). Desde ahí se navega por llamadas hacia las zonas interesantes: red, ficheros, criptografía, reflexión, telefonía.

    Cadenas y secretos

    Ejecuta un `strings` sobre el APK y sobre cada classes.dex y lib .so; muchas URLs de mando, tokens de API y nombres de paquete objetivo aparecen en claro · Revisa `res/values/strings.xml` y `resources.arsc`: endpoints y claves se guardan a veces como recurso para no tenerlos en el código · Busca `BuildConfig`, ficheros en `assets/` y `.properties`: credenciales de desarrollo olvidadas

    4. Comportamientos que levantan sospecha

    El análisis estático no demuestra intención, pero ciertos patrones concentran el riesgo y marcan por dónde seguir. Ninguno es concluyente por sí solo — hay usos legítimos de casi todos — así que se valoran en conjunto y contra lo que la app dice hacer.

    PatrónCómo se ve en el códigoRiesgo asociado
    SMS premium / interceptación de OTPSmsManager.sendTextMessage a números cortos; receiver de SMS_RECEIVED con abortBroadcastFraude por suscripción; robo de códigos de un solo uso
    Abuso de accesibilidadAccessibilityService que inspecciona nodos y ejecuta performAction (GLOBAL_ACTION, clicks)Control remoto de la interfaz, autoconcesión de permisos, fraude bancario
    Carga dinámica de códigoDexClassLoader / PathClassLoader sobre un fichero de assets, cache o descargadoEl código real no está en el APK; evade el análisis y las revisiones de tienda
    Reflexión para ocultar llamadasClass.forName + getMethod + invoke con nombres montados en tiempo de ejecuciónAPIs sensibles que no aparecen en un grep directo
    Overlay de phishingTYPE_APPLICATION_OVERLAY o TYPE_SYSTEM_ALERT sobre eventos de apertura de otra appCaptura de credenciales encima de la app legítima
    AntianálisisComprobación de emulador (Build.FINGERPRINT, TelephonyManager), root, depurador, hookingLa muestra cambia de comportamiento si se sabe observada
    Ofuscación agresivaNombres de clase a/b/c, cadenas cifradas descifradas en un helper, control de flujo aplanadoNo prueba malicia, pero eleva el listón: pasa a smali o a análisis dinámico

    La ofuscación no es una acusación

    R8/ProGuard viene activado por defecto en las compilaciones de release: el renombrado de clases y métodos es normal en apps legítimas. Lo que orienta es el cifrado de cadenas hecho a mano, la carga de DEX externo, la reflexión sistemática para tapar llamadas y las comprobaciones de entorno. Se combina con permisos, componentes exportados y destinos de red antes de concluir nada.

    5. Análisis dinámico en entorno aislado

    Cuando el estático deja preguntas — y con carga dinámica o cifrado de cadenas las deja siempre — toca ejecutar la muestra de forma controlada. La regla es no instalarla nunca en un teléfono personal ni con la SIM puesta. Un emulador (Android Virtual Device, Genymotion) sobre una máquina sin credenciales, con la red enrutada a un proxy de inspección o directamente cortada, permite observar sin exponer nada.

    • Emulador dedicado: imagen limpia, sin cuentas, snapshot para revertir tras cada ejecución.
    • Red: sin salida, o a través de un proxy con certificado propio para ver el tráfico TLS que la app no fije; si hay certificate pinning, se documenta y se decide si merece esfuerzo saltarlo en el lab.
    • Observación: logcat filtrado por el paquete, monitor de ficheros y de conexiones, y volcado de los DEX que se carguen en tiempo de ejecución para decompilarlos aparte.
    • Instrumentación: Frida sobre el emulador para registrar llamadas a APIs de SMS, cripto y reflexión, y para recuperar cadenas ya descifradas en memoria.
    • Nunca un dispositivo físico de uso real; si hace falta hardware, un terminal de laboratorio reservado para esto, sin SIM y con borrado entre muestras.

    5.1 MobSF para el primer barrido

    MobSF (Mobile Security Framework) automatiza casi todo lo anterior: sube el APK y devuelve manifiesto decodificado, permisos clasificados, componentes exportados, hallazgos en el código (criptografía débil, secretos, WebView inseguro), dominios y URLs extraídos, estado de la firma y una puntuación orientativa. Su análisis dinámico usa un emulador que hay que tener configurado. Es un excelente punto de partida para priorizar, pero sus hallazgos se revisan a mano: marca verdaderos y falsos positivos con la misma seguridad aparente.

    6. Herramientas de referencia

    HerramientaTipoPara qué
    apktoolCLIDecodificar manifiesto y recursos; desensamblar a smali y reempaquetar
    jadx / jadx-guiCLI + GUIDecompilar DEX a Java/Kotlin legible; navegación por referencias
    aapt / aapt2CLIVolcado rápido de package, versiones, permisos y features
    apksignerCLIVerificar esquema de firma (v1/v2/v3/v4) y certificado del firmante
    androguardLibrería Python + CLIAutomatizar análisis estático: manifiesto, llamadas, grafos, similitud entre muestras
    dex2jarCLIConvertir DEX a JAR para visores de bytecode Java
    MobSFPlataforma webBarrido estático y dinámico automatizado con informe
    Frida / objectionInstrumentación dinámicaEnganchar funciones en runtime, recuperar cadenas y saltar comprobaciones en el lab
    bundletoolCLIExtraer un APK universal de un AAB para analizarlo

    Un triaje de APK en diez minutos: hash y verificación de firma; aapt dump badging para package y permisos; apktool d y lectura del manifiesto marcando permisos peligrosos y componentes exportados; jadx y recorrido del flujo desde los puntos de entrada; strings sobre DEX, recursos y librerías nativas buscando URLs y claves; y comprobación de carga dinámica, reflexión y servicios de accesibilidad. Con eso se decide si la muestra pasa a análisis dinámico en emulador o a un informe.

    Marco legal y de seguridad

    Analiza solo APK propios, de repositorios de muestras para investigación, de retos públicos, o recibidos en un encargo con autorización por escrito; no descargues ni redistribuyas malware fuera de esos cauces · Ejecuta las muestras únicamente en un emulador o terminal de laboratorio aislado, sin SIM, sin cuentas y sin salida a la red; nunca en un dispositivo de uso personal · La ingeniería inversa de apps de terceros está acotada en la UE a fines concretos (interoperabilidad, corrección de errores, seguridad) y con matices según el país y la licencia; reempaquetar y distribuir una app modificada infringe la propiedad intelectual · Usar el análisis para atacar cuentas o dispositivos ajenos, interceptar comunicaciones o distribuir versiones troyanizadas es ilícito: en España aplican los artículos 197, 197 bis, 197 ter y 264 del Código Penal, además de la normativa de propiedad intelectual · Si encuentras datos de víctimas reales o indicios de una campaña en curso, documenta y deriva a INCIBE-CERT o a las fuerzas y cuerpos de seguridad; no lo difundas por tu cuenta

    Referencias

    Android Developers — «Application Fundamentals», «App Manifest overview» y «Application signing» · OWASP MASTG (Mobile Application Security Testing Guide) y el MASVS — metodología completa de análisis Android · Documentación de jadx, apktool y androguard — opciones y ejemplos de uso · MobSF (github.com/MobSF/Mobile-Security-Framework-MobSF) — instalación y guía de uso · «Android Security Internals» (Nikolay Elenkov, No Starch Press) — modelo de permisos y firma en profundidad

    Conclusión

    Un APK es un ZIP con una estructura conocida, y esa estructura entrega gran parte del análisis gratis: el manifiesto declara permisos y componentes exportados, el DEX se decompila a código muy legible con jadx, y las cadenas de recursos y librerías nativas suelen guardar URLs y claves en claro. Antes de ejecutar nada se puede describir la superficie de ataque de la app y formular una hipótesis sobre lo que hace.

    El método que rinde es siempre el mismo: verificar la firma, leer el manifiesto marcando permisos peligrosos y componentes públicos, seguir el flujo desde los puntos de entrada, buscar patrones de riesgo — SMS premium, accesibilidad, carga dinámica de DEX, ofuscación hecha a mano — y solo entonces, si quedan preguntas, bajar a un emulador aislado o a MobSF. La muestra no se instala jamás en un teléfono real.

    unfantasmaenelsistema.com | Seguridad, sistemas y todo lo que no debería funcionar (pero funciona)

    Etiquetas:
    Resumen de privacidad

    Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.