
UNISOC BootROM/FDL прошивальщик для macOS: пропатченный spd_dump с CVE-2022-38694 exec_addr2, справочник по протоколу, правила разделов, проверка резервных копий (UMS9621)
English | 简体中文
Порт инструмента прошивки BootROM/FDL UNISOC (Spreadtrum) для 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; реализация |
fdl <file> <addr> | Образ FDL и адрес загрузки в SRAM для данного SoC |
disable_transcode | Должен отправляться один раз в начале каждого нового процесса (состояние сохраняется между процессами) |
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 (возобновление с места прерывания; единица size в GPT — МБ),
и офлайн-устанавливает для 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.
Подробнее в docs/protocol-notes.md:
verbose 1 преждевременно завершает этот цикл0x8A (DOWN_SIZE_ERROR) также используется для: отдельной загрузки по защищённым адресам, записи runtimenv, слишком больших блоков чтенияnr_fixnv1) по имени подвешивает сессию; правила см. в docs/partition-rules.md| Проверяемый элемент | Значение |
|---|---|
| Размер | Сверка с 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 (геометрическая двойная копия), первые 4 КБ остаются нулями |
| NV | NV (0x4E56) @0 или @0x200 |
Статические разделы (dtb и т. п.) сверяются по md5 с известными образами той же модели — так можно убедиться в корректности цепочки чтения.
| Элемент | Источник |
|---|---|
| Адреса загрузки fdl1/fdl2 | XML из pac-прошивки модели (распаковано с помощью SPD Research Tool) |
| CVE blob и адрес стека | TomKing062/CVE-2022-38694 soc/<chip>/ |
| Образы fdl | Извлечено из официальной прошивки модели (заголовок с подписью DHTB) |
src/ содержит исходники патчейПредварительная авторизация Magisk su на устройствах без экрана: docs/headless-magisk-su.md.
Операции на уровне BootROM несут риск превратить устройство в «кирпич»; сначала сделайте резервную копию, всё на ваш страх и риск (AS IS).