patch_do_cboot‐FDL1_zh - TomKing062/CVE-2022-38694_unlock_bootloader GitHub Wiki
第 1 部分:修改 FDL1
data_exec
中的验证部分的指令改为NOP(1F 20 03 D5)
1.1 补丁 1:将按照程序顺序寻找,如图,从 _start
到 reset
再到 main
(sub_10218)
这里我们看到一系列函数注册,#4 是 data_exec
(sub_10094),现在NOP(1F 20 03 D5)函数中的验证。
1.2 补丁 2:将下载模式 (0x102)(40 20 80 52) 更改为启动模式 (0x104)(80 20 80 52)
1.3 补丁 3(安卓11及以上)
soc | sml | teecfg | trustos |
---|---|---|---|
(旧)非 ums9620 类型 1 | 0x94000000 | 0x94020000 | 0x94040000 |
(旧)非 ums9620 类型 2 | 0x94000000 | 0x94040000 | 0x94060000 |
(新)非 ums9620 | 0xb0000000 | 0xb0040000 | 0xb0060000 |
ums9620 | 0xbd000000 | 0xbd040000 | 0xbd060000 |
(新类型和 ums9620 上)sml 需要 trustos 地址和 teecfg 地址作为参数
因此返回到 data_exec()
,添加 trustos addr 和 teecfg addr(图例为安卓13的ums9620)
1.4 保存文件
将补丁 1 应用于原始 FDL1,另存为 fdl1-dl.bin。
将补丁 1 和补丁 2(以及补丁 3(如果需要))应用于原始 FDL1,另存为 fdl1-boot.bin。
第 2 部分:修改 FDL2(uboot/lk)
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参数的语句)之后进行修改
将补丁应用于原始 FDL2,另存为 fdl2-cboot.bin
第 3 部分:从 splloader 获取 trustos 映像并获取加载地址
虽然 1.3 给出了地址列表,但建议分析 splloader 确保地址无误
在 splloader 中,_start
调用 reset
,reset
调用 nand_boot/emmc_boot/ufs_boot
,x_boot
会将映像从 nand/emmc/ufs 加载分区到内存并启动。
最后一步:准备解锁命令
-
发送 fdl1-dl.bin,发送 fdl2-dl,
read_part
trustos 相关分区并chsize
这些文件 -
发送 fdl1-boot.bin,发送 trustos 相关分区以及 fdl2-cboot,
sml
必须最后一个发送到设备内存,然后执行exec
。 -
擦除用户数据。