SPL 补丁教程
SPL 仅能在(没有触发按键、所有验证失败的)备用 u2s 下载模式中启动(人话:擦掉储存中的 splloader)。
第 1 部分:修改 FDL1,将修改后的 fdl1 保存为 fdl1-dl.bin
按照程序顺序寻找,从 _start 到 reset 再到 main(sub_10218)。
这里看到一系列函数注册,#4 是 data_exec(sub_10094),现在将函数中的验证指令 NOP(1F 20 03 D5)。
第 2 部分:修改 FDL2(uboot/lk)
2.1 补丁 1:do_cboot()
set_lock_status()
搜索 VerifiedBoot-UNLOCK 以找到 set_lock_status。
set_lock_status() 函数后面第一个函数就是 get_lock_status() 函数。
部分厂商(如:ZTE、TECNO、BBK)会修改 set_lock_status() / get_lock_status() 来禁止 bootloader 解锁。
do_download()、dl_powerdown_device()、power_down_devices()、do_cboot()
无 autodloader 功能的 uboot/lk:搜索 do_download 找到 do_download,能够看到一系列函数注册,#0x17 是 dl_powerdown_device()。
有 autodloader 功能的 uboot/lk:搜索 download mode 找到 download_handler,或搜索 reply exec act as Romcode 来查找 autodloader_handler;download_handler 和 autodloader_handler 都会调用 do_download_common,在 do_download_common 中能够看到一系列函数注册,#0x17 是 dl_powerdown_device()。
在 dl_powerdown_device() 中找到 00 00 00 14(即 while 1),while 1 之前的函数是 power_down_devices()。
检查 power_down_devices() 的被调用列表,通常第一个调用 power_down_devices() 的函数就是 do_cboot(),记住 do_cboot() 中该代码块的地址。
补丁:
示例:a9/a10 和一些没有用 vab 布局的 a11(+):
示例:a11(+) 且使用 vab 布局:需要在 boot_env_check(检查 #0x104 参数的语句)之后进行修改。
2.2 补丁 2:删除(NOP)安全分区的写入检查
搜索 sml,在搜索结果中,找到类似 LDR Xm, [Xn],#8 ; "sml" 的代码,修补此函数,禁用检查,让这个函数任何情况都 return 1。
2.3 保存文件
将补丁 1 应用于原始 FDL2,另存为 fdl2-cboot.bin;将补丁 2 应用于原始 FDL2,另存为 fdl2-dl.bin。
第三部分:修改 SPL,将修改后的 spl 保存为 spl-unlock.bin
旧类型
spl 加载镜像 A B C D 并验证,如果验证失败,则从 A_bak B_bak C_bak D_bak 重新加载 A B C D 并再次验证。
(修改 BL secboot_init 为 B loc_F230,0xF230 是 BL update_swVersion 之后 CMP W19, WZR 的地址)
因此修补了 nand_boot,读取分区后跳过验证,直接执行。
新类型
删除 signcheck() 和 signcheck() 的结果检查。
nand_boot() 中通常有 4 个 signcheck()。
最后一步:准备解锁命令
- (正常下载)发送 fdl1-dl.bin,发送 fdl2-dl,将 fdl2-cboot 写入 uboot,擦除 splloader。
- (回退下载)发送 spl-unlock.bin。
- (回退下载)发送 fdl1-dl.bin,发送 fdl2-dl,写回官方 uboot,写回官方 splloader,擦除用户数据。