
UNISOC BootROM/FDL-Flasher für macOS: gepatchter spd_dump mit CVE-2022-38694 exec_addr2, Protokollreferenz, Partitionsregeln, Backup-Verifizierung (UMS9621)
English | 简体中文
macOS-Portierung des UNISOC (Spreadtrum) BootROM/FDL-Flashtools. Basiert auf ilyakurdyukov/spreadtrum_flash (MIT), ergänzt das geschlossene spd_dump um exec_addr2 (Umgehung der Signaturprüfung CVE-2022-38694) und realisiert die gesamte Kette auf macOS (arm64 + libusb):
BootROM → CVE 越界写 → FDL1 → FDL2 → GPT 解析 → 分区读写 → reset
Verifizierte Plattform: UMS9621 (T158), Android 13, Kernel 5.15, GKI-Architektur (init_boot). Die UMS9620-Familie ist adresskompatibel; für andere SoCs siehe Anpassung.
Abhängigkeiten: Xcode CLT, brew install libusb.
./scripts/build-macos.sh # 产出 ./spd_dump
Im ausgeschalteten Zustand Reset (oder die dem Gerätemodell entsprechende Tastenkombination) gedrückt halten und USB einstecken. Das Gerät wird als 1782:4d00 aufgelistet. Der BootROM antwortet nur etwa 20 Sekunden nach der Enumeration; danach bleibt er stumm (USB bleibt weiterhin vorhanden). Die Automatisierung muss auf die Flanke „kein Gerät → Gerät vorhanden“ reagieren (siehe 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
| Parameter | Beschreibung |
|---|---|
exec_addr2 <addr> | CVE-Umgehung, lädt automatisch custom_exec_no_verify_<addr>.bin; Implementierung |
fdl <file> <addr> | FDL-Image und SoC-spezifische SRAM-Ladeadresse |
disable_transcode | Muss zu Beginn jedes neuen Prozesses einmal gesendet werden (Status bleibt über Prozesse hinweg erhalten) |
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 generiert die read_part-Sequenz anhand der GPT (Fortsetzung an Unterbrechungspunkten; GPT-size in MB) und setzt für vbmeta* offline AVB flags=3 (entspricht 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 enthält eingebaute Partitionsregeln (runtimenv in Erase umgewandelt, fixnv/calinv übersprungen, Aliasse ohne Slot anhand der mtime dedupliziert) und hängt am Ende erase_part userdata + reset an.
Siehe docs/protocol-notes.md:
verbose 1 beendet die Schleife vorzeitig0x8A (DOWN_SIZE_ERROR) wird gleichzeitig verwendet für: unabhängigen Download an geschützten Adressen, Schreiben von runtimenv, übermäßig große Leseblöckenr_fixnv1) hängt die Session beim Lesen über Namensadressierung auf; Regeln siehe docs/partition-rules.md| Prüfpunkt | Wert |
|---|---|
| Größe | Einzeln mit der GPT abgeglichen (bytegenau) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| vbmeta-Familie | AVB0 @0, flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 und @8192 (geometrische Doppelkopien), erste 4K bleiben null |
| NV | NV (0x4E56) @0 oder @0x200 |
Statische Partitionen (z. B. dtb) werden mit bekannten Images desselben Typs per MD5-Quervergleich abgeglichen, wodurch die Korrektheit der Lesekette verifiziert werden kann.
| Punkt | Quelle |
|---|---|
| fdl1/fdl2-Ladeadresse | XML der PAC-Firmware des Gerätemodells (mit SPD Research Tool entpackt) |
| CVE-Blob und Stack-Adresse | TomKing062/CVE-2022-38694 soc/<chip>/ |
| FDL-Image | Aus der offiziellen Firmware des Gerätemodells extrahiert (DHTB-Signaturkopf) |
src/ enthält den Patch-QuellcodeVorautorisierung von Magisk su auf Geräten ohne Bildschirm: docs/headless-magisk-su.md.
Operationen auf BootROM-Ebene bergen das Risiko eines Bricks; zuerst ein Backup erstellen, Nutzung auf eigene Gefahr (AS IS).