# tree Image/
└── Image
├── boot.img
├── kernel.img
├── kernel.img.krnl
├── MiniLoaderAll.bin
├── misc.img
├── oem.img
├── parameter.txt
├── parameter.txt.parm
├── recovery.img
├── resource.img
├── system.img
├── trust.img
├── uboot.img
└── vendor.img
Veamos de que tipo es cada fichero:
# file ./Image/*
boot.img: Android bootimg, kernel (0x10008000), ramdisk (0x11000000), second stage (0x10f00000), page size: 2048, cmdline (buildvariant=user)
kernel.img: data
kernel.img.krnl: data
MiniLoaderAll.bin: data
misc.img: data
oem.img: Android sparse image, version: 1.0, Total of 32768 4096-byte output blocks in 6 input chunks.
parameter.txt: ASCII text, with very long lines
parameter.txt.parm: Par archive data
recovery.img: Android bootimg, kernel (0x10008000), ramdisk (0x11000000), second stage (0x10f00000), page size: 2048, cmdline (buildvariant=user)
resource.img: data
system.img: Android sparse image, version: 1.0, Total of 665600 4096-byte output blocks in 20 input chunks.
trust.img: data
uboot.img: data
vendor.img: Android sparse image, version: 1.0, Total of 98304 4096-byte output blocks in 8 input chunks.
Hay un poco de todo:
- Ficheros en formato "data" (que significa "no sé que carajos hay ahí dentro")
- Ficheros en formato "Android bootimg"
- Ficheros en formato "Android sparse image"
Partition Info(gpt):
NO LBA Size Name
01 0x00004000 0x00002000 uboot
02 0x00006000 0x00002000 trust
03 0x00008000 0x00002000 misc
04 0x0000a000 0x00008000 resource
05 0x00012000 0x00010000 kernel
06 0x00022000 0x00010000 boot
07 0x00032000 0x00020000 recovery
08 0x00052000 0x00038000 backup
09 0x0008a000 0x00002000 security
10 0x0008c000 0x000c0000 cache
11 0x0014c000 0x00514000 system
12 0x00660000 0x00008000 metadata
13 0x00668000 0x000c0000 vendor
14 0x00728000 0x00040000 oem
15 0x00768000 0x00000400 frp
16 0x00768400 0x032d5bdf userdata
Las particiones anteriores las averiguamos entrando en "adb shell" y haciendo algo de esto.
Como se ve, casi todas las particiones reales de la tablet se corresponden con un fichero .img de los extraidos de update.img. Al actualizar el firmware con update.img lo que se hace realmente es desempaquetar y escribir estos ficheros sobre cada partición, ni más ni menos.
Vamos a husmear dentro de las particiones que podamos descomprimir, a ver que encontramos. Las "data" no las tocamos porque no sabemos como abrirlas.
1. Examinando particiones Android bootimg.
Empezamos por boot.img, que está en formato "Android bootimg":
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android-serialport-api/android_bootimg_tools.tar.gz
# tar xfvz android_bootimg_tools.tar.gz
-rwxrwxr-x cedric/cedric 12095 2011-10-31 20:54 mkbootimg
-rwxrwxr-x cedric/cedric 11936 2011-10-31 20:54 unpackbootimg
# mkdir boot
# ./unpackbootimg -i /ruta/al/fichero/boot.img -o boot
Con esto se desempaqueta el contenido al directorio boot. Veamos que hay dentro:
# file boot/*
boot.img-base: ASCII text
boot.img-cmdline: ASCII text
boot.img-pagesize: ASCII text
boot.img-ramdisk: ASCII cpio archive (SVR4 with no CRC)
boot.img-zImage: data
En los 3 primeros ficheros son de configuración, los dos últimos son imágenes comprimidas de ramdisk e imagen boot. Vamos a descomprimir el ramdisk, que contiene dentro un sistema de ficheros:
# mkdir ramdisk
# cd ramdisk
# zcat ../boot.img-ramdisk.gz | cpio -idmv
# cd ..
# tree ramdisk
ramdisk/
├── acct
├── bugreports -> /data/user_de/0/com.android.shell/files/bugreports
├── cache -> /data/cache
├── charger -> /sbin/charger
├── config
├── d -> /sys/kernel/debug
├── data
├── default.prop -> system/etc/prop.default
├── dev
├── drmboot.ko
├── etc -> /system/etc
├── fstab.rk30board
├── init
├── init.connectivity.rc
├── init.environ.rc
├── init.optee.rc
├── init.rc
├── init.rk30board.bootmode.emmc.rc
├── init.rk30board.bootmode.nvme.rc
├── init.rk30board.bootmode.unknown.rc
├── init.rk30board.environment.rc
├── init.rk30board.rc
├── init.rk30board.usb.rc
├── init.rk3326.rc
├── init.rockchip.rc
├── init.usb.configfs.rc
├── init.usb.rc
├── init.zygote32.rc
├── init.zygote64_32.rc
├── mnt
├── oem
├── proc
├── res
│ └── images
│ └── charger
│ ├── battery_fail.png
│ ├── battery_scale.png
│ └── font.png
├── rk30xxnand_ko.ko
├── sbin
│ ├── charger
│ ├── mkdosfs
│ ├── ueventd -> ../init
│ └── watchdogd -> ../init
├── sdcard -> /storage/self/primary
├── storage
├── sys
├── system
├── ueventd.rc
├── ueventd.rk30board.rc
├── vendor
└── verity_key
Como se ve, tiene un sistema de ficheros con sus script y procesos para el arranque del tablet. Si hacemos lo mismo con recovery.img veremos que hay un minisistema Linux con muchas cositas. Recordemos que el recovery es un Linux que muestra un menú con ciertas funciones básicas de formateo y poco más.
# mkdir recovery
# ./unpackbootimg -i /ruta/al/fichero/recovery.img -o recovery
# cd ramdisk-recovery
# zcat ../recovery.img-ramdisk.gz | cpio -idmv
# cd ..
# tree ramdisk-recovery
ramdisk-recovery/
├── acct
├── bugreports -> /data/user_de/0/com.android.shell/files/bugreports
├── charger -> /sbin/charger
├── config
├── d -> /sys/kernel/debug
├── data
│ └── misc
│ └── wifi
├── default.prop -> prop.default
├── dev
├── drmboot.ko
├── etc
│ ├── bluetooth
│ ├── firmware
│ ├── mke2fs.conf
│ └── recovery.fstab
├── fstab.rk30board
├── init
├── init.rc
├── init.rk30board.usb.rc
├── init.usb.configfs.rc
├── init.usb.rc
├── lib
│ └── firmware
├── mnt
.........................
.........................
.........................
│ │ └── wifi_efuse_8723ds.map
│ ├── firmware
│ └── lib
│ └── modules
│ └── wifi
│ ├── 8188eu.ko
│ ├── 8188fu.ko
│ ├── 8189es.ko
│ ├── 8189fs.ko
│ ├── 8723bs.ko
│ ├── 8723bu.ko
│ ├── 8723cs.ko
│ ├── 8723ds.ko
│ ├── 8822be.ko
│ └── bcmdhd.ko
└── verity_key
Bueno, pues esto no tiene más. Vamos a avanzar mirando más cosas.
2. Examinando particiones Android sparse image.
Vamos a las otras particiones, las "Android sparse image": oem, vendor y system, descritas de forma general aquí. El formato "sparse image" es un tipo de imagen comprimido con menos huecos en blanco para ocupar menos tamaño. Para trabajar con su contenido hay que descomprimir el archivo antes de nada, usando la utilidad "simg2img" que está en el paquete Ubuntu "android-tools-fsutils".
# apt-get install android-tools-fsutils
# mkdir system
# cd system
# simg2img /ruta/al/fichero/system.img system-no-sparse.img
# file system-no-sparse.img
system-no-sparse.img: Linux rev 1.0 ext4 filesystem data, UUID=bd2ccb6e-a94e-53be-9c80-3f438b342f58, volume name "system" (extents) (64bit) (large files) (huge files)
El sistema ext4 es ya un sistema manejable que podemos montar con "mount -o loop":
# mount -t auto -o loop system-no-sparse.img mnt
# tree -d mnt/
├── app
│ ├── BasicDreams
│ │ └── oat
│ │ └── arm64
│ ├── Bluetooth
│ │ ├── lib
│ │ │ └── arm64
│ │ └── oat
│ │ └── arm64
......................
......................
│ └── YouTube
│ └── oat
│ ├── arm
│ └── arm64
├── bin
│ └── hw
├── etc
│ ├── bluetooth
│ ├── init
│ ├── permissions
│ ├── ppp
│ ├── preferred-apps
│ ├── seccomp_policy
│ ├── security
│ │ └── cacerts
│ ├── selinux
│ │ └── mapping
│ └── sysconfig
├── fake-libs
├── fake-libs64
├── fonts
├── framework
│ ├── arm
│ ├── arm64
│ └── oat
│ ├── arm
│ └── arm64
├── lib
│ ├── drm
│ ├── hw
│ ├── modules
│ └── vndk-sp
├── lib64
│ ├── drm
│ ├── hw
│ └── vndk-sp
├── lost+found
├── media
│ └── audio
│ ├── alarms
│ ├── notifications
│ ├── ringtones
│ └── ui
├── priv-app
│ ├── BackupRestoreConfirmation
│ │ └── oat
│ │ └── arm64
......................
......................
│ │ └── arm64
│ └── WallpaperCropper
│ └── oat
│ └── arm64
├── tts
│ └── lang_pico
└── usr
├── hyphen-data
├── icu
├── idc
├── keychars
├── keylayout
├── share
│ ├── bmd
│ └── zoneinfo
└── srec
└── en-US
Esta partición como vemos contiene el sistema android completo, que se monta sobre /system en el arranque, con todas las aplicaciones por defecto y todo el entorno y comandos. Si queremos retocar el firmware del tablet será esta partición la que hay que modificar.
Las otras dos particiones son oem.img y vendor.img. Oem "incorporates OEM (Original Equipment Manufacturer i.e. hardware manufacturer or Mobile Phone brand) small customization (modifications) to original Android (AOSP) during OTA updates such as customized system properties values etc.". Esta partición se monta sobre la ruta /oem cuando el tablet está en funcionamiento. La convertimos y montamos como hicimos con system:
# mkdir oem
# cd oem
# simg2img /ruta/al/fichero/oem.img oem-no-sparse.img
# file oem-no-sparse.img
oem-no-sparse.img: Linux rev 1.0 ext4 filesystem data, UUID=bd2ccb6e-a94e-53be-9c80-3f438b342f58, volume name "oem" (extents) (64bit) (large files) (huge files)
# mkdir mnt-oem
# mount -t auto -o loop oem-no-sparse.img mnt-ome
# tree mnt-oem/
mnt-oem/
├── etc
│ ├── fs_config_dirs
│ ├── fs_config_files
│ └── package_performance.xml
└── lost+found
Para la partición vendor "is sister partition of /system on Android devices which holds system applications and libraries that do not have source code available on AOSP but added by vendors (OEM's). It also contains SoC firmware images i.e. hardware specific libraries and binaries (OpenGL, ISP...). Proprietary blobs (HALs) usually live in /vendor as shared libraries (.so files) which are loaded by Android binders when processes call a hardware component. This partition was optional before Treble support and /vendor used to be just a symlink to /system/vendor"..
# mkdir vendor
# cd vendor
# simg2img /ruta/al/fichero/vendor.img vendor-no-sparse.img
# mount -t auto -o loop vendor-no-sparse.img mnt
# tree -d mnt/
├── bin
│ └── hw
├── etc
│ ├── bluetooth
│ ├── firmware
│ ├── init
│ ├── permissions
│ ├── seccomp_policy
│ ├── selinux
│ ├── usb_modeswitch.d
│ └── wifi
├── lib
│ ├── egl
│ ├── hw
│ ├── mediacas
│ ├── mediadrm
│ ├── modules
│ │ └── wifi
│ ├── optee_armtz
│ ├── soundfx
│ └── vndk-sp
├── lib64
│ ├── egl
│ ├── hw
│ ├── mediacas
│ ├── mediadrm
│ ├── soundfx
│ └── vndk-sp
├── lost+found
├── media
└── overlay
└── SysuiDarkTheme
Y ya está. Supongo que la mayoría de las imágenes de los distintos sistemas Android se desempaquetará y manejará de una menera similar.
La sonda Chang'e-5 recogió sus 2kg de rocas lunares (ya era hora desde los años 70), despegó y está de vuelta.
Hoy 16 de diciembre caerá en algún sitio de Mongolia Interior (que buen lugar para mandar a algunos que yo me sé). Como vemos, si hace falta irán a caballo a recuperarla donde aterrice.
Buenas tenés ese firm para compartirlo?
ResponderEliminar