前言
我承认我稍有些标题党……因为我主要的目的是绕过所有的分区校验,而不是去解锁,但是这么写小白大概率是看不懂的,也引不来人,所以说不要怪我喽。
上一个解锁方案 AVB 关闭的不彻底,今天给平板焊了个 TTL,但是日志等级太低,改 dtb 日志详细度是上去了,但是 AVB 和我杠上了,突然就想到了这个事,于是就和 AVB 激情奋战了一下午(?),产出了这篇文章。
为什么要解锁 BootLoader
这个是写给小白的。
当你厌倦了讯飞像史一样的 iStudyUI(没错,这个神似山寨机系统的 UI 并不是半成品,而是拿正式启用过的 C 端 UI 改的,人家有名字,哈?你不知道啊,可以去看看市场版的 X1Pro 和 Z1 早期版本呢)的时候,你就会开始寻找美味的 GSI。但是不好意思,我们有严格的安卓分区校验,也就是 AVB(Android Verified Boot),付费内容需要解锁哦~(bushi)
解锁BootLoader VS 绕过分区校验
这个是写给有经验的人的。
解锁 BootLoader 后,设备状态为 UNLOCK,U-Boot 将不再调用 TrustOS 校验 system(这个比较特殊)、vendor 和 product,TrustOS 将不再校验 boot 和 recovery,其它安卓分区继续将会校验。
还有点好玩的,U-Boot 不管你有没有解锁,都会在验证那三个分区前先调用 TrustOS 校验dtb、dtbo 和 vbmeta。而且 U-Boot 其实自己有一套 AVB 实现,随着 BootLoader 解锁而停用。为什么说 system 比较特殊呢?因为 U-Boot 不仅调用了 TrustOS 来校验它,还使用了自己的 AVB 实现去校验它,这个特殊待遇是独一份。
这个 U-Boot 自己的 AVB 实现其实也会被用于校验全部安卓分区,但是貌似和基带安全性有关系。我们学生机没有基带,所以我也就是看了一眼,没有深究。
但是这对于我们这些爱鼓捣的人来说显然是不够的,如果你绕过了分区校验,就能解除掉最后的枷锁,让这个平板所有分区都对你开绿灯。
欸?你也发现上面的文字同时出现安卓分区和所有分区了?因为我们这篇文章要绕过的分区校验可不止 AVB 哦!
准备 IDA Pro
熟悉的人请跳过。
安装 IDA Pro
绕过分区校验当然要逆向啦,本次使用的工具为:IDA Pro!
我提供了 IDA Pro 9.0 的安装包(IDA Professional 9.0 (密码:QQ565887).exe),在末尾的附件下载章节获取。
点击前进:

勾选接受然后点击前进:

选择一个你喜欢的目录,并且记下来,后面要用,然后点击前进:

Python 大家应该都会装吧……但愿,确认后点击前进:

密码在文件名上(密码为QQ565887),在密码框输入完成后点击前进:

点击前进:

安装完毕即可。
安装 Keypatch 插件
Keypatch 让我们在修补二进制时获得更好的体验。
打开命令行,执行:
pip install keystone-engine six
将 keypatch.py(在末尾的附件下载章节获取)复制到你安装目录的 plugins 文件夹,例如:C:\Program Files\IDA Professional 9.1\plugins
有条件就重启一下电脑,没条件的话我就认为你安装好了。
安装展讯驱动
熟悉的人请跳过。
解压 [紫光展锐驱动]SPD_Driver_R4.20.4201.zip(在末尾的附件下载章节获取),打开 Install 文件夹,运行 DriverSetup.exe:

点击下一页:

等待安装完成:

安装完成后点击完成:

提取分区
进入深刷模式
熟悉的人请跳过。
解压spd_dump_SPRD_Release.zip 到一个文件夹(在末尾的附件下载章节获取),运行spd_dump.exe:


在接下来的 30 秒内,你需要将学生机关机,等待 8 秒后,按住音量-,将数据线插入,电脑提示有设备接入,spd_dump 提示 CMD_CONNECT bootrom 视为成功进入 BootROM 模式:


提取分区
这里我们提取 splloader、trustos、uboot 和 miscdata分区。
修改 splloader 用于绕过底层分区校验(uboot、trustos 和 sml),修改 trustos 用于绕过安卓分区校验(绕过 AVB),修改 uboot 用于解锁 BootLoader。
备份原 uboot 和 miscdata 用于清除 BootLoader 解锁状态,也就是回锁 BootLoader(解锁信息存储于 miscdata)。
自己一定要留好原件!!!单独复制一份到自己放心的地方。
熟悉的人请跳过。
依次输入:
fdl 你下载的fdl1.bin的文件路径 0x5500
fdl 你下载的fdl2.bin的文件路径 0x9efffe00
exec
文件路径示例
E:\Team\刷机\紫光\FDL\fdl(chip0-1)\fdl1.bin
E:\Team\刷机\紫光\FDL\fdl(chip0-1)\fdl2.bin
打印分区表视为成功进入 FDL2 模式:

依次输入(r 是 read 的意思,便于理解喵):
r splloader
r trustos
r uboot
r miscdata

四个进度条全部跑完后,返回文件夹,发现多出了splloader.bin、trustos.bin、uboot.bin 和 miscdata.bin:

自己一定要留好原件!!!单独复制一份到自己放心的地方。
修改 Splloader
修改 splloader 用于绕过底层分区校验(uboot、trustos 和 sml)
熟悉的人请跳过。
将 splloader.bin 拖入桌面上的 IDA Professional 9.2 快捷方式,弹出 Load a new file 窗口后,在大红框中向上滚动,找到 ARM Little-endian:

双击 ARM Little-endian,然后点击 OK:

弹出 Disassembly memory organization 窗口后,将 ROM start address 和 Loading address 改为 0x5500,然后点击 OK:

弹出这个窗口点击 Yes:

弹出这个窗口点 OK:

开始加载,当电脑想起提示音,下方的 Output 区域提示 The initial autoanalysis has been finished. 视为加载完成

按下 Shift+F12,加载完成弹出字符串窗口后,按下 Ctrl+F ,输入 uboot,搜索完成之后双击红框圈的那一项的黄色区域:

跳转到文本模式的汇编代码窗口后,双击红框圈出的区域:

跳转到图形模式的汇编代码窗口后,按下 F5,弹出警告点击 OK:

弹出信息点击 OK:

转成伪代码后,单击红框圈出的区域,然后按下键盘上的 H 键:

转成 16 进制后复制(不要后面的LL,留好了):

复制后双击红框圈出的区域:

双击红框圈出的区域:

单击红框圈出的区域,按下 Tab 键:

跳转到图形模式的汇编代码窗口后,单击红框圈出的那一行,按下 Ctrl+Alt+K:

把 Assembly 原有内容替换为 MOV W0, #0,让它强制返回 0,即验证成功:

按下回车,Patch 下一行,这里把 Assembly 原有内容替换为 RET:

再次按下回车,这次不替换,点击下面的 Cancel:

这样就是修改成功了(Keypatch modified this from: 证明你这里被 Keypatch 修补过,后面紧跟的是原来的指令):

最后保存修改到新文件,点击左上角的的 Edit:

然后点击 Patch program,点击 Apply patches to input file…,弹出 Apply patches to input file 窗口,勾选上 Create backup:

最后点击 OK,修改输入到了 splloader.bin,splloader.bin.bak 是原文件。
为了方便区分,我建议你把修改过的 splloader.bin 重命名为 splloader_disverify.bin。
关闭 IDA Pro,弹出 Save database 窗口,如果你想保留你的工程文件,方便下次看改了哪里,那就点击 OK,如果你不想留着,那就勾选 DONT SAVE the database,点击 OK:

至此,splloader 修改完毕。
修改 TrustOS
修改 trustos 用于绕过安卓分区校验(绕过 AVB)
将 trustos.bin 拖入桌面上的 IDA Professional 9.2 快捷方式,弹出 Load a new file 窗口后,滚动找到 ARM Little-endian,双击 Little-endian 后点击 OK。
弹出 Disassembly memory organization 窗口后,将 ROM start address 和 Loading address 改为我们刚刚复制到 16 进制数字,然后点击 OK:

SMC case 0x20 部分
弹出的窗口和刚刚一样,确认后按下 Shift+F12,加载完成弹出字符串窗口后,按下 Ctrl+F ,输入 enter vboot verify,搜索完成之后双击红框圈出的那一项的黄色区域:

跳转到文本模式的汇编代码窗口后,双击红框圈出的区域:

跳转到图形模式的汇编代码窗口后,往上翻,单击红框圈出的区域:

按下 Ctrl+X,弹出 Jump to xref 窗口,这里有一个唯一的调用,双击红框圈出的区域:

单击红框圈出的那一行,按下 Ctrl+Alt+K:

把 Assembly 原有内容替换为 MOV X0, #0,让它强制返回 0,不再调用:

点击 Patch,弹出下一行的 Patch 窗口,这次不替换,点击下面的 Cancel:

这样就是修改成功了:

KBC AVB 部分
再次按下 Shift+F12,加载完成弹出字符串窗口后,按下 Ctrl+F ,输入 [kbc]avb_slot_verify result,搜索完成之后双击红框圈出的那一项的黄色区域:

跳转到文本模式的汇编代码窗口后,双击红框圈出的区域:

跳转到图形模式的汇编代码窗口后,往上翻,单击红框圈出的那一行,按下 Ctrl+Alt+K:

把 Assembly 原有内容替换为 MOV W0, #0,让它强制返回 0:

按下回车,Patch 下一行,这里把 Assembly 原有内容替换为 RET:

再次按下回车,这次不替换,点击下面的 Cancel:

这样就是修改成功了:

最后保存修改到新文件。为了方便区分,我建议你把修改过的 trustos.bin 重命名为 trustos_bypavb.bin。
关闭 IDA Pro。
至此,trustos 修改完毕。
修改 U-Boot
修改 uboot 用于解锁 BootLoader。
熟悉的人请跳过。
将 trustos.bin 拖入桌面上的 IDA Professional 9.2 快捷方式,弹出 Load a new file 窗口后,滚动找到 ARM Little-endian,双击 Little-endian 后点击 OK。
弹出 Disassembly memory organization 窗口后,将 ROM start address 和 Loading address 改为 0x9efffe00,然后点击 OK:

弹出的窗口和刚刚一样,确认后按下 Shift+F12,加载完成弹出字符串窗口后,按下 Ctrl+F ,输入 ,搜索完成之后双击红框圈出的那一项的黄色区域:VerifiedBoot-UNLOCK

跳转到文本模式的汇编代码窗口后,双击红框圈出的区域:

然后就会跳转到图形模式的汇编代码窗口,按下空格,往下翻,单击黄框圈出那一行,按下 Ctrl+Alt+K:

把 Assembly 原有内容中的 CBZ W0, 替换为 B,让它永远都走成功分支:

点击 Patch,弹出下一行的 Patch 窗口,这次不替换,点击下面的 Cancel:

这样就是修改成功了:

最后保存修改到新文件。为了方便区分,我建议你把修改过的 uboot.bin 重命名为 uboot_unlock.bin。
关闭 IDA Pro。
至此,uboot 修改完毕。
刷入修改过的分区镜像

这是我文件夹目前的状态,splloader_disverify.bin、trustos_bypavb.bin 和 uboot_unlock.bin 是我修改过的。
我没猜错的话,你的学习机应该还在 FDL2 模式吧?如果你自己重启了的话就要重新按照之前章节说的进入 FDL2 模式哦。
依次输入:
w splloader 你修改的splloader分区镜像路径
w trustos 你修改的trustos分区镜像路径
w uboot 你修改的uboot分区镜像路径
镜像路径示例
C:\Users\worryzu\Desktop\spd_dump_SPRD_Release\backup\splloader_disverify.bin
C:\Users\worryzu\Desktop\spd_dump_SPRD_Release\backup\trustos_bypavb.bin
C:\Users\worryzu\Desktop\spd_dump_SPRD_Release\backup\uboot_unlock.bin

五个进度条全部跑完后(trustos 和 uboot 分区紫光因为安全考虑设计的是必须是双重写入,所以一共是五个进度条)就输入命令重启吧!
reset

不出意外,你的平板左上角(竖着看是启动时候的屏幕方向)已经出现解锁提示啦!这代表你的 BootLoader 已经解锁,至少证明 uboot 和 splloader 改的没问题,至于 trustos 改的怎么样就需要你自己去试喽~
如何清除 BootLoader 解锁状态(回锁 BootLoader)
很简单,进入 FDL2 模式,把你备份的原 uboot 和 miscdata 刷回去即可。
如何让你的学生机回归安全状态
回锁 BootLoader 后把你备份的原 splloader 和 trustos 刷回去即可。
机器死了怎么救
小白改起来当然会有一点点问题,但是这一点小问题足以导致机器死掉(砖了),这时候,我们长按音量-和电源键 15 秒,然后立即插入数据线,这个长按 15 秒强制重启是不经过系统的,一定能成功。但请注意,插慢了设备标识符请求失败,插快了 U2S 就是残废。但是也没什么大不了的,重新来一遍就好了嘛……
附件下载
IDA Professional 9.0 (密码:QQ565887).exe:https://pan.linearteam.top/d/%E8%BD%AF%E4%BB%B6/%E5%B7%A5%E5%85%B7/IDA%20Professional%209.0%20(%E5%AF%86%E7%A0%81%EF%BC%9AQQ565887).exe?sign=q1Ppxxz8qhHODAfb4jriSFNvbTSy2IAjIE7esHBC6kg=:0
[紫光展锐驱动]SPD_Driver_R4.20.4201.zip:https://pan.linearteam.top/d/%E8%BD%AF%E4%BB%B6/%E5%B7%A5%E5%85%B7/%5B%E7%B4%AB%E5%85%89%E5%B1%95%E9%94%90%E9%A9%B1%E5%8A%A8%5DSPD_Driver_R4.20.4201.zip?sign=9RpiobJfKPrNYkGSwBrMb7Z_LuxNfS0R8JjYdeQJpyU=:0
spd_dump_SPRD_Release.zip:https://pan.linearteam.top/d/%E8%BD%AF%E4%BB%B6/%E5%B7%A5%E5%85%B7/spd_dump_SPRD_Release.zip?sign=06Gf951bCtu-psg42IqLUM8mZxcLWw0kKyp_6WnkL9s=:0
ud710-fdl(chip0-1).zip:https://pan.linearteam.top/d/%E5%88%B7%E6%9C%BA%E5%8C%85%26%E9%95%9C%E5%83%8F/iFLYTEK/UD710-FDL(Chip0-1)/ud710-fdl(chip0-1).zip?sign=i8DygTre_UTMaKO1A-bOSw8N6hWYr_Zy3W8guUIVi08=:0
如果上面的 fdl1.bin 无法进入 FDL1 模式,请使用这个压缩包的 ud710_2c11-fdl1.bin 进入:
ud710-fdl(chip2).zip:https://pan.linearteam.top/d/%E5%88%B7%E6%9C%BA%E5%8C%85%26%E9%95%9C%E5%83%8F/iFLYTEK/UD710-FDL(Chip2)/ud710-fdl(chip2).zip?sign=pSir8OIrKg98_pCMUNC76pLGCmmbNunSHzuKmfEdY-k=:0
小彩蛋!
我修改过的C8Pro分区镜像:https://pan.baidu.com/s/11BRfDWIiJtD5GBw6mAO5TA?pwd=6hxq
发表回复