
Flasher UNISOC BootROM/FDL para macOS: spd_dump parcheado con CVE-2022-38694 exec_addr2, referencia del protocolo, reglas de partición, verificación de copia de seguridad (UMS9621)
English | 简体中文
Puerto para macOS de la herramienta de flasheo BootROM/FDL de UNISOC (Spreadtrum).
Basado en ilyakurdyukov/spreadtrum_flash (MIT),
implementa el exec_addr2 (bypass de verificación de firma CVE-2022-38694) que falta en el spd_dump
de código cerrado y completa toda la cadena en macOS (arm64 + libusb):
BootROM → escritura fuera de límites (CVE) → FDL1 → FDL2 → análisis de GPT → lectura/escritura de particiones → reset
Plataforma de verificación: UMS9621 (T158), Android 13, kernel 5.15, arquitectura GKI (init_boot). Las direcciones de la familia UMS9620 son compatibles; para otros SoC, ver Adaptación.
Dependencias: Xcode CLT, brew install libusb.
./scripts/build-macos.sh # genera ./spd_dump
Con el dispositivo apagado y sin alimentación, mantenga pulsado Reset (o la combinación de teclas correspondiente al modelo) y conecte el USB; el dispositivo se enumera como
1782:4d00. El BootROM solo responde durante unos 20 segundos tras la enumeración y luego queda en silencio (el USB sigue presente);
la automatización debe activarse por el flanco "ausente → presente" del dispositivo (ver scripts/runner.sh).
./spd_dump --wait 3 exec_addr2 0x65017f08 verbose 1 \
fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0xbefffe00 \
disable_transcode partition_list gpt.xml
| Parámetro | Descripción |
|---|---|
exec_addr2 <addr> | Bypass del CVE; carga automáticamente ; |
python3 scripts/backup_gen.py gpt.xml backup/ --img-dir data/
./spd_dump --wait 3 verbose 0 disable_transcode $(cat backup_args.txt)
backup_gen.py genera la secuencia de read_part según el GPT (con reanudación; la unidad de size del GPT es MB)
y establece AVB flags=3 sin conexión para vbmeta* (equivalente a verity 0).
python3 scripts/flash_gen.py gpt.xml data/ flash_ops.txt
N=$(grep -c 'write_part\|erase_part' flash_ops.txt)
{ yes yes | head -n $N; sleep 3600; } | ./spd_dump --wait 3 verbose 0 \
disable_transcode $(cat flash_ops.txt | tr '\n' ' ')
flash_gen.py incorpora reglas de partición integradas (runtimenv convertido en borrado, fixnv/calinv omitidos,
alias sin ranura deduplicados por mtime) y añade erase_part userdata + reset al final.
Ver docs/protocol-notes.md para más detalles:
verbose 1 termina ese bucle antes de tiempo0x8A (DOWN_SIZE_ERROR) se usa también para: descarga independiente de direcciones protegidas, escritura de runtimenv
y bloques de lectura demasiado grandesnr_fixnv1) por direccionamiento por nombre cuelga la sesión; ver las reglas en
docs/partition-rules.mdLas particiones estáticas (dtb, etc.) se contrastan por md5 con imágenes conocidas del mismo modelo, lo que permite verificar la corrección de la cadena de lectura.
| Elemento | Fuente |
|---|---|
| Direcciones de carga de fdl1/fdl2 | XML del firmware PAC del modelo (desempaquetado con SPD Research Tool) |
| Blob del CVE y dirección de pila | TomKing062/CVE-2022-38694 soc/<chip>/ |
| Imágenes fdl | Extraídas del firmware oficial del modelo (cabecera con firma DHTB) |
src/ contiene el código fuente con los parchesPreautorización de Magisk su en dispositivos sin pantalla: docs/headless-magisk-su.md.
Las operaciones a nivel de BootROM conllevan riesgo de brick; haga una copia de seguridad primero. Úselo bajo su propio riesgo (AS IS).
custom_exec_no_verify_<addr>.binfdl <file> <addr> | Imagen FDL y dirección de carga SRAM correspondiente al SoC |
disable_transcode | Debe enviarse una vez al inicio de cada proceso nuevo (el estado persiste entre procesos) |
| Elemento de verificación | Valor |
|---|
| Tamaño | Comparado uno a uno con el GPT (precisión de bytes) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| Familia vbmeta | AVB0 @0, flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 y @8192 (doble copia geométrica), los primeros 4K se conservan en cero |
| NV | NV (0x4E56) @0 o @0x200 |