
Gravador BootROM/FDL da UNISOC para macOS: spd_dump com patch para CVE-2022-38694 exec_addr2, referência de protocolo, regras de partição, verificação de backup (UMS9621)
English | 简体中文
Porte para macOS da ferramenta de gravação BootROM/FDL da UNISOC (Spreadtrum). Baseado no
ilyakurdyukov/spreadtrum_flash (MIT),
adiciona o exec_addr2 do spd_dump proprietário (bypass da verificação de assinatura CVE-2022-38694)
e conclui o fluxo completo no macOS (arm64 + libusb):
BootROM → escrita fora dos limites do CVE → FDL1 → FDL2 → análise do GPT → leitura/gravação de partições → reset
Plataforma de validação: UMS9621 (T158), Android 13, kernel 5.15, arquitetura GKI (init_boot). Endereços da família UMS9620 compatíveis; para outros SoCs, veja Adaptação.
Dependências: Xcode CLT, brew install libusb.
./scripts/build-macos.sh # Gera ./spd_dump
Com o aparelho desligado e sem energia, mantenha pressionado Reset (ou a combinação de teclas correspondente ao modelo) ao conectar o USB; o dispositivo é enumerado como
1782:4d00. O BootROM responde apenas por cerca de 20 segundos após a enumeração e depois fica silencioso (o USB permanece);
a automação deve ser acionada pela borda "ausente → presente" do dispositivo (veja 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 | Descrição |
|---|---|
exec_addr2 <addr> | Bypass do CVE, carrega automaticamente ; |
python3 scripts/backup_gen.py gpt.xml backup/ --img-dir data/
./spd_dump --wait 3 verbose 0 disable_transcode $(cat backup_args.txt)
O backup_gen.py gera a sequência de read_part com base no GPT (com retomada; a unidade de size do GPT é MB) e define offline AVB flags=3 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' ' ')
O flash_gen.py tem regras de partição embutidas (runtimenv é convertido em apagamento, fixnv/calinv são pulados, aliases sem slot são deduplicados por mtime) e anexa erase_part userdata + reset ao final.
Consulte docs/protocol-notes.md:
verbose 1 encerra esse loop prematuramente0x8A (DOWN_SIZE_ERROR) também é usado para: download separado de endereços protegidos, gravação do runtimenv e blocos de leitura excessivamente grandesnr_fixnv1) por endereçamento por nome trava a sessão; veja as regras em docs/partition-rules.mdAs partições estáticas (dtb etc.) são comparadas por md5 com imagens conhecidas do mesmo modelo, o que valida a corretude do caminho de leitura.
| Item | Origem |
|---|---|
| Endereços de carregamento fdl1/fdl2 | XML do firmware pac do modelo (extraído com SPD Research Tool) |
| Blob do CVE e endereço de pilha | TomKing062/CVE-2022-38694 soc/<chip>/ |
| Imagens fdl | Extraídas do firmware oficial do modelo (cabeçalho de assinatura DHTB) |
src/ contém o código-fonte dos patchesPré-autorização do su do Magisk em dispositivos sem tela: docs/headless-magisk-su.md.
Operações no nível do BootROM apresentam risco de brick; faça backup antes e use por sua conta e risco (AS IS).
custom_exec_no_verify_<addr>.binfdl <file> <addr> | Imagem FDL e endereço de carregamento na SRAM específico do SoC |
disable_transcode | Deve ser enviado uma vez no início de cada novo processo (o estado persiste entre processos) |
| Item de verificação | Valor |
|---|
| Tamanho | Comparado um a um com o GPT (exato em bytes) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| Família vbmeta | AVB0 @0, flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 e @8192 (dupla cópia geométrica), primeiros 4K mantidos como zero |
| NV | NV (0x4E56) @0 ou @0x200 |