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

按照程序顺序寻找,从 _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 及以上)
SOCsmlteecfgtrustos
(旧)非 ums9620 类型 10x940000000x940200000x94040000
(旧)非 ums9620 类型 20x940000000x940400000x94060000
(新)非 ums96200xb00000000xb00400000xb0060000
ums96200xbd0000000xbd0400000xbd060000

(新类型和 ums9620 上)sml 需要 trustos 地址和 teecfg 地址作为参数。

因此返回 data_exec(),添加 trustos addr 和 teecfg addr。

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 加载分区到内存并启动。

最后一步:准备解锁命令
  1. 发送 fdl1-dl.bin,发送 fdl2-dl,read_part trustos 相关分区并 chsize 这些文件。
  2. 发送 fdl1-boot.bin,发送 trustos 相关分区以及 fdl2-cboot,sml 必须最后一个发送到设备内存,然后执行 exec。
  3. 擦除用户数据。
友链