Android e iOS

El presente libro es una recolección mía y personal de utilidades y tutoriales para Android e iOS.

Se incluyen tanto temas de seguridad como tutoriales e información sobre la arquitectura de los sistemas.

Toda la información contenida es mi completa autoria, así como las imágenes.

La información acá presentada es libre, podes bajarla y hacer lo que quieras.

El conocimiento es libre.

Android - Introducción

Android es un sistema operativo, con soporte para ARM y x86, que utiliza el kernel Linux, librerías en Rust/C y la JVM (Java Virtual Machine) para hacer funcionar todo el sistema operativo.

Android fue desarrollado originalmente por Google, ahora siendo desarrollado por la Open Handset Alliance que la conforman; HTC, Sony, Dell, Intel, Motorola, Qualcomm, Texas Instruments, Google, Samsung, LG, T-Mobile, Nvidia, entre muchos otros.

Licenciamiento

Android está licenciado en “Apache License”, una licencia de fuente abierta (“open source”). Por lo que es normal encontrar en diversos lugares (Github, Gitlab, XDA Developers, etc) versionados (llamados ROMs) de distintas fuentes.

Distribuciones

Una distribución es todo sistema empaquetado y distribuido (de ahí el nombre) de diferentes formas, cada una con sus propias características. Generalmente se suelen encontrar diferencias pequeñas, aunque es normal (pero menos común) encontrar distribuciones con modificaciones tan profundas que a primera imagen parecen sistemas diferentes.

Acá un listado de distribuciones de Android, cada una con sus características;

  1. AOSP (Android Open Source Project)

    https://android.com/

    Es la distribución original de Android, la creada por el consorcio “Open Handset Alliance” y sin productos internos de compañia alguna.

    Así mismo, esta distribución es la considerada la “versión pura” debido a que no tiene; personalizaciones, productos internos de compañias, modificaciones internas, etc.

    Se debe tener en cuenta que el kernel de esta distribución no tiene driver alguno, por lo que para ser compatible con un dispositivo se debe encontrar una modificación adaptada a ese dispositivo.

    Su código se encuentra en este repositorio;

    • https://android.googlesource.com/platform/
  2. Lineage OS

    https://www.lineageos.org/

    Anteriormente conocido como “CyanogenMod”.

    Distribución nacida en el 2016 cuando “CyanogenMod” finalizó como proyecto. A diferencia del primero, este proyecto es comunitario de forma completa, por lo que no lo domina ninguna compañía.

    Se basa en AOSP para aplicar modficaciones que le dan muchísima más personalización y poder de control al usuario propietario del dispositivo (overclocking, control de root, etc) sin incluir bloatware (software basura; publicidad, etc) que viene con teléfonos con distribuciones modificadas por compañías.

    Así mismo aplica modificaciones en el código de AOSP, en donde generalmente se encargan de hacer modificaciones de performance (optimizaciones a todo nivel) como AudioFX, etc.

    Su código se encuentra en estos repositorios;

    • https://github.com/LineageOS/android
    • https://gitlab.com/LineageOS/android/android_system_core
  3. Android x86

    https://www.android-x86.org/

    Es una distribución de AOSP, pero se enfoca en dar soporte para la arquitectura x86_64.

    Hay que tener en consideración que no todas las apps de la Play Store tienen soporte para x86, ya que la mayoría están para ARM64. Por lo que puede ser que algunas aplicaciones no se encuentren disponibles.

    Su código se encuentra en este repositorio;

    • https://git.osdn.net/view?a=project_list;pf=android-x86

Android - Arquitectura

Todas las distribuciones de Android siguen la misma arquitectura (para mantener la compatibilidad de aplicaciones).

  1. Bootloader

    Los dispositivos ARM tienen una característica; dependen de una implementación externa para tener un bootloader funcional.

    De esta manera nos podemos encontrar diferentes bootloaders dependiendo del fabricante, cada uno tiene su propia implementación. Sumale que al ser propietarios, la mayoría son de código cerrado, sin documentaciones y de extrema dificultad para acceder (es parte del firmware embebido).

    El bootloader es el encargado de (en este orden); ver e inicializar la memoria, verificar que los certificados del sistema operativo Android sean del fabricante (que está intrinsicamente relacionado al uso de UEFI y el bloqueo OEM), verificar las particiones “boot”, “dtbo”, “init_boot” y “recovery”, verificar si existen actualizaciones aplicar en el sistema o si al fallar el sistema (o si el usuario mantiene los botones correctos) debe iniciar el modo recovery.

    Por último, carga las imágenes de inicio; “boot.img”, “vendor_boot.img”, “init_boot.img” y otras imágenes propietarias del fabricante. Al igual que que u-boot, grub, lilo y demás cargadores carga el kernel y el “initramfs” en memoria.

    A partir de Android 12 el bootloader soporta pasar configuraciones al kernel para modificar el inicio por defecto.

    En el archivo; system/core/mkbootimg/bootimg.h está la configuración de inicio.

    En sistemas Android hablamos del modo “fasboot” cuando podemos interactuar con el bootloader. Sus estados son “LOCKED” ó “UNLOCKED”, dependiendo uno u otro va impedir la instalación de otro SO o no (respectivamente). Por defecto en encuentra en modo “LOCKED”, permitiendo cargar una distribución Android firmada digitalmente por el fabricante. Ese certificado digital es lo que se conoce como “Root of Trust”, y en el dispositivo solamente se encuentra la parte pública de esa llave, el fabricante se queda con la privada. Algunos dispositivos permiten que el usuario indique su propia llave, pero no es la norma.

  2. Kernel

    Utilizan el kernel Linux con algunas modificaciones para alivianar el mismo.

    Android posee de forma nativa habilitado SELinux (Security Enhanced Linux), entre otros componentes a nivel de kernel.

  3. Android ART / Dalvik

    Tanto Dalvik como ART (Android Runtime) son entornos de ejecución (véase, presenta y contiene todo para que aplicaciones se puedan ejecutar apropiadamente arriba) que se utilizan para hacer andar las aplicaciones en el sistema operativo.

    Desde hace un tiempo ART ya remplaza a Dalvik.

    Como ART y Dalvik usan Java para funcionar, ocurria un problema; como Java (no confundir con JavaScript, son dos cosas diferentes) es un lenguaje interpretado, cada vez que la aplicación se iniciaba había que esperar a que la aplicación se compile para luego poder ejecutarla (lo que se conoce como “JIT”: “just-in-time”) cuando se usaba Dalvik. Esto no es así con el uso de ART, en donde se usa un esquema de “AOT”; “ahead-of-time” que compila la aplicación apenas es instalada en el dispositivo.

    Así mismo ART trae mejoras en rendimiento, el recolector de basura (característica de los lenguajes interpretados), depuración de la aplicación, etc. Y empezó a estar disponible a partir de Android 4.4.

    Dalvik usa archivos “.dex” cuando la aplicación es compilada e iniciada (“DEX”; “Dalvik EXecutable”). El archivo APK contiene un solo archivo “dex” llamado “classes.dex”, por temas de compatibilidad esto se mantiene en ART.

    Dalvik usa archivos “.odex” cuando cachea (véase; procesar y almacenar cosas que no cambian) la aplicación, para hacer más rápido su inicio. Muchas veces esto también se usaba para segmentar la aplicación hasta tal punto que sí o sí parte de la misma estaba solamente en el archivo “.odex”, haciendo tremendamente dificil su ingenieria inversa ya que se tenía que realizar el proceso inverso y empaquetar todo correctamente dentro del apk. Esto no se mantiene en ART, si no que utiliza el formato ejecutable nativo del kernel Linux; “ELF”: “Executable and Linkable Format” el cual permite una mayor optimización en muchos sentidos (la librería estándar, las dependencias externas, el “LTO”: “Link Time Optimization”, etc) y un menor consumo de recursos en todo sentido.

    Copyright; Wikipedia

    Si hasta ahora vas entendiendo te darás cuenta de una cosa si queres realizar ingeniería inversa a un programa; como desde Android 4.4 KitKat se usa principalmente ART vas a tener que urgar en el apk los archivos “dex” y tener conocimiento de Java o Kotlin para poder entender que hace la aplicación leyendo el código.

Android - Seguridad

Android - Correr un Linux ARM nativo dentro

Acá describo los pasos necesarios para poder ejecutar una distribución Linux dentro de Android sin necesidad de root. Yo elegí la distribución Alpine pero ustedes pueden usar la que quieran, dentro del catálogo disponible claro.

  1. Instalar Fdroid

    Fdroid es una tienda de aplicaciones opensource (tanto las apps que almacena como la tienda en sí misma) con repositorio de código en;

    https://github.com/f-droid

    Para instalarlo van al siguiente enlace y instalan el archivo “apk”; https://f-droid.org/F-Droid.apk

  2. Instalar Termux

    Desde FDroid instalen Termux, un emulador de terminar con algunas utilidades de sistemas GNU/Linux. No recomiendo la versión que está en la Play Store, ya que esta tiene un teclado mucho peor, la versión proveniente de FDroid tiene un teclado con las teclas de; “tab”, “ctrl”, flechas de dirección (arriba, abajo, izquierda, derecha), “home”, “end”, “/”, “ESC”, “pgup” y “pgdown”

  3. Instalar Andronix

    Desde la Play Store instalen “Andronix - Linux on Android”

    • https://play.google.com/store/apps/details?id=studio.com.techriz.andronix&hl=es_419&gl=US