patch_do_cboot‐FDL1_zh - TomKing062/CVE-2022-38694_unlock_bootloader GitHub Wiki

第 1 部分:修改 FDL1

1.1 补丁 1:将data_exec中的验证部分的指令改为NOP(1F 20 03 D5)

按照程序顺序寻找,如图,从 _startreset 再到 main(sub_10218)

image

这里我们看到一系列函数注册,#4 是 data_exec(sub_10094),现在NOP(1F 20 03 D5)函数中的验证。

data_exec

1.2 补丁 2:将下载模式 (0x102)(40 20 80 52) 更改为启动模式 (0x104)(80 20 80 52)

main

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 地址作为参数

image

因此返回到 data_exec(),添加 trustos addr 和 teecfg addr(图例为安卓13的ums9620)

image

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()

image

有 autodloader 功能的 uboot/lk:搜索 download mode 找到 download_handler,或搜索 reply exec act as Romcode 来查找 autodloader_handlerdownload_handlerautodloader_handler 都会调用 do_download_common,在 do_download_common 中能够看到一系列函数注册,#0x17 是 dl_powerdown_device()

image

在 dl_powerdown_device() 中找到 00 00 00 14 (即while 1),while 1 之前的函数是 power_down_devices()。

image

检查 power_down_devices() 的 被调用 列表,通常第一个调用 power_down_devices() 的函数就是 do_cboot(),记住 do_cboot() 中该代码块的地址。

image

补丁:

示例:a9/a10 和一些没有用 vab 布局的 a11(+)

image

示例:a11(+) 且使用 vab 布局:需要在 boot_env_check(检查#0x104参数的语句)之后进行修改

image

将补丁应用于原始 FDL2,另存为 fdl2-cboot.bin

第 3 部分:从 splloader 获取 trustos 映像并获取加载地址

虽然 1.3 给出了地址列表,但建议分析 splloader 确保地址无误

在 splloader 中,_start 调用 resetreset 调用 nand_boot/emmc_boot/ufs_bootx_boot 会将映像从 nand/emmc/ufs 加载分区到内存并启动。

最后一步:准备解锁命令

  1. 发送 fdl1-dl.bin,发送 fdl2-dl,read_part trustos 相关分区并chsize这些文件

  2. 发送 fdl1-boot.bin,发送 trustos 相关分区以及 fdl2-cboot,sml 必须最后一个发送到设备内存,然后执行exec

  3. 擦除用户数据。