"Después del juego es antes del juego"
Sepp Herberger

miércoles, 16 de diciembre de 2020

Enredando con una ROM Rockchip RK3326 (II): examinando las particiones de la imagen.

Ya hemos desempaquetado la ROM en Enredando con una ROM Rockchip RK3326 (I). Vamos ahora a ver la estructura. Tenemos un directorio donde se ha descomprimido la imagen:
# 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"
Todo estos ficheros se corresponden con distintas particiones del sistema Android, que en el caso de nuestra tablet serian realmente:
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.


1 comentario: