
Flasher UNISOC BootROM/FDL per macOS: spd_dump patchato con CVE-2022-38694 exec_addr2, riferimento al protocollo, regole di partizionamento, verifica del backup (UMS9621)
English | 简体中文
Porting macOS dello strumento di flashing BootROM/FDL UNISOC (Spreadtrum). Basato su
ilyakurdyukov/spreadtrum_flash (MIT),
completa la funzionalità exec_addr2 (bypass del controllo firma CVE-2022-38694) della spd_dump closed-source
e realizza l'intera catena su macOS (arm64 + libusb):
BootROM → CVE 越界写 → FDL1 → FDL2 → GPT 解析 → 分区读写 → reset
Piattaforma verificata: UMS9621 (T158), Android 13, kernel 5.15, architettura GKI (init_boot). Gli indirizzi della famiglia UMS9620 sono compatibili; per altri SoC vedi Adattamento.
Dipendenze: Xcode CLT, brew install libusb.
./scripts/build-macos.sh # 产出 ./spd_dump
A dispositivo spento, tieni premuto Reset (o la combinazione di tasti specifica del modello) e inserisci l'USB: il dispositivo viene enumerato come 1782:4d00. Il BootROM risponde solo per circa 20 secondi dopo l'enumerazione, poi resta in silenzio (l'USB rimane attivo); l'automazione deve essere attivata sul fronte "assente→presente" del dispositivo (vedi 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
| Parametro | Descrizione |
|---|---|
exec_addr2 <addr> | Bypass della CVE, carica automaticamente ; |
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 sequenza di read_part in base al GPT (riprendibile; l'unità di size nel GPT è MB) e imposta offline su vbmeta* i flag AVB a 3 (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 include regole integrate per le partizioni (runtimenv convertito in erase, fixnv/calinv saltate, deduplicazione per mtime in assenza di alias di slot) e alla fine aggiunge erase_part userdata + reset.
Vedi docs/protocol-notes.md:
verbose 1 termina anticipatamente quel ciclo0x8A (DOWN_SIZE_ERROR) viene usato anche per: download indipendente di indirizzi protetti, scrittura di runtimenv, blocchi di lettura troppo grandinr_fixnv1), se letta tramite indirizzamento per nome, blocca la sessione; regole in docs/partition-rules.mdLe partizioni statiche (dtb, ecc.) vengono incrociate tramite md5 con immagini note dello stesso modello, per verificare la correttezza del percorso di lettura.
| Voce | Origine |
|---|---|
| Indirizzi di caricamento di fdl1/fdl2 | XML del firmware pac del modello (estratto con SPD Research Tool) |
| CVE blob e indirizzo dello stack | TomKing062/CVE-2022-38694 soc/<chip>/ |
| Immagini fdl | Estratte dal firmware ufficiale del modello (header firmato DHTB) |
src/ contiene il codice sorgente delle patchPre-autorizzazione di Magisk su per dispositivi senza schermo: docs/headless-magisk-su.md.
Le operazioni a livello BootROM comportano il rischio di brick del dispositivo; esegui prima un backup, a tuo rischio (AS IS).
custom_exec_no_verify_<addr>.binfdl <file> <addr> | Immagine FDL e indirizzo di caricamento SRAM relativo al SoC |
disable_transcode | Va inviato una volta all'inizio di ogni nuovo processo (lo stato persiste tra i processi) |
| Voce di controllo | Valore |
|---|
| Dimensioni | Confrontate con il GPT una a una (precisione in byte) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| Famiglia vbmeta | AVB0 @0, flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 e @8192 (doppia copia geometrica), i primi 4K restano zero |
| NV | NV (0x4E56) @0 o @0x200 |