
macOS용 UNISOC BootROM/FDL 플래셔: CVE-2022-38694 exec_addr2로 패치된 spd_dump, 프로토콜 참조, 파티션 규칙, 백업 검증 (UMS9621)
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을 추가한다.
자세한 내용은 docs/protocol-notes.md 참조:
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는 0 유지 |
| NV | NV(0x4E56) @0 또는 @0x200 |