English | 简体中文
UNISOC(展锐)BootROM/FDL 刷写工具的 macOS 移植。基于
ilyakurdyukov/spreadtrum_flash(MIT),
补齐闭源 spd_dump 的 exec_addr2(CVE-2022-38694 签名校验绕过),
并在 macOS(arm64 + libusb)上完成全链路:
BootROM → CVE 越界写 → FDL1 → FDL2 → GPT 解析 → 分区读写 → reset
验证平台:UMS9621(T158),Android 13,kernel 5.15,GKI(init_boot)架构。 UMS9620 家族地址兼容;其他 SoC 见适配。
依赖:Xcode CLT、brew install libusb。
./scripts/build-macos.sh # 产出 ./spd_dump
关机断电状态按住 Reset(或机型对应组合键)插入 USB,设备枚举为
1782:4d00。BootROM 仅在枚举后约 20 秒内应答,之后静默(USB 仍在);
自动化须按设备"无→有"边沿触发(见 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
| 参数 | 说明 |
|---|---|
exec_addr2 <addr> | CVE 绕过,自动加载 custom_exec_no_verify_<addr>.bin;实现 |
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 按 GPT 生成 read_part 序列(断点续传;GPT size 单位为 MB),
并对 vbmeta* 离线置 AVB flags=3(等价 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 内置分区规则(runtimenv 转擦除、fixnv/calinv 跳过、
无槽位别名按 mtime 去重),末尾追加 erase_part userdata + reset。
verbose 1 会提前终止该循环0x8A(DOWN_SIZE_ERROR)同时用于:受保护地址独立下载、runtimenv 写入、
超大读块nr_fixnv1)经名字寻址读取会挂死会话;规则见
docs/partition-rules.md静态分区(dtb 等)与已知同型镜像做 md5 交叉比对,可验证读取链路正确性。
| 项 | 来源 |
|---|---|
| fdl1/fdl2 加载地址 | 机型 pac 固件 XML(SPD Research Tool 解包) |
| CVE blob 与栈地址 | TomKing062/CVE-2022-38694 soc/<chip>/ |
| fdl 镜像 | 机型官方固件提取(DHTB 签名头) |
src/ 含补丁源码无屏设备 Magisk su 预授权:docs/headless-magisk-su.md。
BootROM 级操作有变砖风险;先备份,自担风险(AS IS)。
fdl <file> <addr> | FDL 镜像及 SoC 相关 SRAM 加载地址 |
disable_transcode | 每个新进程开头必须发送一次(状态跨进程残留) |
| 校验项 | 值 |
|---|
| 尺寸 | 与 GPT 逐一比对(字节精确) |
| boot / init_boot | ANDROID! @0 |
| vendor_boot | VNDRBOOT @0 |
| vbmeta 族 | AVB0 @0,flags @0x78 |
| splloader/trustos/uboot/fdl | DHTB @0 |
| super | gDla @4096 与 @8192(几何双副本),首 4K 保留零 |
| NV | NV(0x4E56)@0 或 @0x200 |