
Flasheur UNISOC BootROM/FDL pour macOS : spd_dump corrigé avec CVE-2022-38694 exec_addr2, référence du protocole, règles de partition, vérification de sauvegarde (UMS9621)
English | 简体中文
Portage macOS de l'outil de flashage BootROM/FDL d'UNISOC (Spreadtrum). Basé sur
ilyakurdyukov/spreadtrum_flash (MIT),
il complète le spd_dump propriétaire avec exec_addr2 (contournement de la vérification de signature CVE-2022-38694),
et réalise la chaîne complète sur macOS (arm64 + libusb) :
BootROM → CVE 越界写 → FDL1 → FDL2 → GPT 解析 → 分区读写 → reset
Plateforme de validation : UMS9621 (T158), Android 13, kernel 5.15, architecture GKI (init_boot). Les adresses de la famille UMS9620 sont compatibles ; pour les autres SoC, voir Adaptation à d'autres SoC.
Dépendances : Xcode CLT, brew install libusb.
./scripts/build-macos.sh # 产出 ./spd_dump
Éteint et débranché, maintenez Reset (ou la combinaison de touches propre au modèle) et insérez le câble USB ; l'appareil est énuméré comme
1782:4d00. Le BootROM ne répond que durant environ 20 secondes après l'énumération, puis reste silencieux (l'USB reste présent) ;
l'automatisation doit se déclencher sur le front « absent → présent » de l'appareil (voir 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
| Paramètre | Description |
|---|---|
exec_addr2 <addr> | Contournement du CVE, charge automatiquement ; |
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 génère la séquence de read_part à partir du GPT (reprise après interruption ; l'unité de size du GPT est le Mo),
et applique hors ligne AVB flags=3 aux vbmeta* (équivalent à 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 intègre des règles de partition (runtimenv converti en effacement, fixnv/calinv ignorés,
déduplication par mtime des alias sans slot), et ajoute erase_part userdata + reset à la fin.
Voir docs/protocol-notes.md :
verbose 1 termine cette boucle prématurément0x8A (DOWN_SIZE_ERROR) est utilisé à la fois pour : le téléchargement isolé d'adresses protégées, l'écriture de runtimenv,
les blocs de lecture surdimensionnésnr_fixnv1) par adressage par nom suspend la session ; règles dans
docs/partition-rules.mdLes partitions statiques (dtb, etc.) sont recoupées par md5 avec des images connues du même modèle, ce qui permet de valider la chaîne de lecture.
| Élément | Source |
|---|---|
| Adresses de chargement fdl1/fdl2 | XML du firmware pac du modèle (dépaqueté avec SPD Research Tool) |
| Blob CVE et adresse de pile | TomKing062/CVE-2022-38694 soc/<chip>/ |
| Images fdl | Extraites du firmware officiel du modèle (en-tête signé DHTB) |
src/ contient le code source des correctifsPré-autorisation de Magisk su pour les appareils sans écran : docs/headless-magisk-su.md.
Les opérations au niveau BootROM comportent un risque de brick ; sauvegardez d'abord, à vos risques et périls (AS IS).
custom_exec_no_verify_<addr>.binfdl <file> <addr> | Image FDL et adresse de chargement SRAM spécifique au SoC |
disable_transcode | Doit être envoyé une fois au début de chaque nouveau processus (l'état persiste entre les processus) |
| Élément de vérification | Valeur |
|---|
| Taille | Comparée une à une au GPT (exactitude à l'octet près) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| Famille vbmeta | AVB0 @0, flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 et @8192 (double copie géométrique), les 4 premiers Ko restent à zéro |
| NV | NV (0x4E56) @0 ou @0x200 |