
本教程仅供学习研究,对产生的一切后果概不负责,禁止商用!
本教程所有涉及工具均为公开可见的,不涉及任何版权问题!
洋葱平板有四款,都是学习平板,具体参数如下(官网公布的不全)

由于Q10搭载紫光展锐T618,也就是UMS512,刷机较为复杂,现有教程都是解管控之后刷机。这里我们着重讲解在管控状态下如何刷机,备份系统,甚至是修改系统一部分固件。而且这里我们是永久解锁BL并且禁用安全启动!。
也就是说我们不仅可以自由刷机还可以替换系统关键组件比如trustos uboot!!!
下面正片开始!!紫光展锐刷机概述在最后
首先github搜索CVE-2022-38694_unlock_bootloader,然后找到release

下载ums512_for_android10_alldocube_iplay_50_repack.zip
然后解压,解压之后

然后需要安装紫光展锐深度刷机驱动。安装之前请确保卸载你电脑上的libusb驱动,二者会冲突!!

安装完之后最好重启一下电脑
首先解压刚刚下载的压缩包,进入那个文件夹,然后右键打开cmd或者终端(终端需要输入cmd按回车)
然后执行下面的命令
spd_dump --wait 300 exec_addr 0x3ee8 fdl fdl1-dl.bin 0x5500 fdl fdl2-dl.bin 0x9efffe00 exec
按回车

然后平板关机按住音量下键不放,用type-c线连接电脑,保持音量下按住直到屏幕上的内容有变化(或者设备管理器识别出 sprd u2s diag),然后立即松手
此时spd_dump程序会和bootrom深刷模式握手并且绕过签名验证然后上传修补的fdl1和fdl2,过一会儿你会看到类似FDL2 >的字样,此时你的电脑已经可以和平板的fdl2进行通信,在这里输入命令即可。
然后我们先在刚刚那个文件夹下面建立bak目录
我们输入path bak回车
然后输入r splloader,这一步很重要,是备份splloader的(相当于联发科preloader),后面禁用安全启动要用
然后输入r all,按回车,这时候开始备份全部分区,除了userdata。

备份完之后我们去bak文件夹下面看,应该会有很多分区

然后下一步就是永久禁用安全启动
这个实际上利用了bootrom没有验证splloader的公钥是否匹配,所以我们可以在公钥里面实施缓冲区溢出覆盖堆栈从而跳过签名验证。
首先下载

然后安装DEV-CPP 5.11(就是C++编程那个)
安装之后找到这个目录
盘符:\Program Files (x86)\Dev-Cpp\MinGW64\bin
把里面的mingw32-make.exe改名成make.exe

然后把这个目录添加到path环境变量

然后解压刚刚github下载的那个压缩包,进入解压后的目录,右键打开cmd
然后输入make按回车会自动编译

编译完成后目录下面会出现patcher.exe,然后找到你最开始下载的那个ums512_for_android10_alldocube_iplay_50_repack解压后的目录,把里面chsize和gen_spl-unlock.exe到刚刚那个38691的目录下面

然后接下来复制那个ums512_for_android10_alldocube_iplay_50_repack\bak下面的备份的那个splloader.bin到刚刚那个38691那个目录下面
然后执行chsize splloader.bin回车然后输入gen_spl-unlock.exe splloader.bin回车
然后输入patcher.exe cfg\ums512.cfg spl-unlock.bin回车

然后你就会发现目录下面多出来一个spl-unlock.bin,这个就是修补之后的splloader,复制到ums512_for_android10_alldocube_iplay_50_repack目录下面,刷回设备即可永久禁用安全启动。
首先安装一个winhex(单文件版就可以),然后用单文件版打开ums512_for_android10_alldocube_iplay_50_repack\bak的uboot.bin,然后ALT+G输入650d8,选择从文件头开始

确定之后看到60 00 00 34四个字节

改成03 00 00 14

然后另存为到ums512_for_android10_alldocube_iplay_50_repack根目录下面
然后平板关机按住音量下键不放,用type-c线连接电脑,保持音量下按住直到屏幕上的内容有变化(或者设备管理器识别出 sprd u2s diag),然后立即松手
此时spd_dump程序会和bootrom深刷模式握手并且绕过签名验证然后上传修补的fdl1和fdl2,过一会儿你会看到类似FDL2 >的字样,此时你的电脑已经可以和平板的fdl2进行通信,在这里输入命令即可。
输入w splloader spl-unlock.bin回车
然后输入w uboot uboot.bin按回车
然后输入w misc misc-wipe.bin按回车
然后输入reset按回车平板会自动重启进入recovery恢复出厂设置
然后恢复完出厂设置再开机时候出现这个就代表解锁成功了。(必须有两行)

首先下载GSI。

然后解压缩GSI里面有system.img只要刷这个,vbmeta不要刷
接下来还是
然后平板关机按住音量下键不放,用type-c线连接电脑,保持音量下按住直到屏幕上的内容有变化(或者设备管理器识别出 sprd u2s diag),然后立即松手
此时spd_dump程序会和bootrom深刷模式握手并且绕过签名验证然后上传修补的fdl1和fdl2,过一会儿你会看到类似FDL2 >的字样,此时你的电脑已经可以和平板的fdl2进行通信,在这里输入命令即可。
然后输入 reboot-fastboot回车重启进入fastbootd(不是fastboot!)

然后电脑上打开cmd,切换到有adb工具的目录,输入fastboot flash system gsi路径\system.img
刷入完成后fastboot reboot,然后会卡第二屏或者自动重启,卡第二屏就再重启,就会自动格式化userdata恢复出厂,如果不好用就再按照之前方法进深刷执行命令到FDL2 >之后输入w misc misc-wipe.bin回车然后reset回车,这样就好自动开始恢复出厂
然后再重启就能正常开机了




这步比较麻烦,需要重新签名
首先下载这个aik-windows

下载完后解压
找到刚刚备份分区的bak文件夹下面把boot.bin,把他传到平板上用magisk修补,然后修补完的文件传回电脑,复制到解压后的目录下面
然后改名改成boot.img
然后双击unpackimg.bat,注意你解压的路径里面一定不能有空格和中文不然报错
解压完之后把boot.img删除
然后再双击repackimg.bat,重新打包
重新打包之后目录下面会多出一个新的img文件
然后


下载这个spd signer v2,解压
解压之后进到in目录里面
把刚刚打包好的img文件放进in目录,重命名为boot.img
然后把之前分区备份的bak文件夹下面的vbmeta.bin复制到in目录,改名改成vbmeta-sign.img
然后打开SPDVbmetaSignerV2FIX.exe
上面选项改成android 10,然后点击下面的extract vbmeta,解压完了之后勾选右边的boot,然后点击sign checked images,签名完成后关闭工具

然后打开out目录,里面有boot.img

然后平板连接adb,电脑输入adb reboot-bootloader回车重启到真正的fastboot
然后输入fastboot flash boot 刚刚那个out目录下面的boot.img然后回车
然后输入fastboot reboot回车,如果重启正常进入系统就说明root成功!

至此本教程结束,下面是紫光展锐通用的介绍!
本文花费3H,希望读者多多点点赞点点关注投个币感谢了!!
紫光展锐遵循和联发科 高通等相差甚远的启动流程。
这里分为两条路径,一条是正常启动(这里包括SD卡启动和EMMC/NAND/UFS启动,但是具体的开关在哪没找到,也许在efuse),另一条是BOOTROM下载模式,也就是深刷。
正常启动:
BOOTROM--->SPLLOADER---->SML---->TRUSTOS------>UBOOT--->KERNEL--->ANDROID
这里SPLLOADER相当于高通的sbl1或者联发科的preloader,负责初始化DRAM,然后接着加载trustzone的相关组件,SPLLOADER处于EL3
这个SML是用来加载TRUSTOS(和teecfg)的,然后从trustos再启动到uboot,这时候UBOOT在EL1,
不知道你有没有发现大多数紫光展锐的机子没有hypervisior
也就是EL2上面没有虚拟机管理程序,但是对于一部分新soc已经有了,
那么此时SPLLOADER会先加载trustos,然后会加载hyp,最后加载uboot,这时候我们可以考虑替换虚拟机管理程序的组件从而实现KVM(暂未实现)
然后uboot实际上也有可能是lk,具体看oem。这里uboot实施avbv2的签名校验
但是需要注意的是即使解锁bootloader,uboot仍然会校验vbmeta分区的签名,所以除非能够完全禁用安全启动然后换成自己的私钥,否则请不要修改VBMETA!!!
但是对于紫光展锐:
安卓12以及以上:只要解锁bl就不会对boot分区进行校验,直接修补boot可以正常启动
安卓11安卓10:解锁BL之后不会把boot分区的签名和vbmeta中的签名进行对比,但是仍然会对比boot分区的哈希值和boot分区证书中的哈希值,也就是可以自己拿avbtool随便签个名。但是不要动vbmeta
安卓9以及以下:解锁BL之后仍然完整的校验boot分区,因此除非永久禁用安全启动或者修补uboot分区,否则不能动boot。vbmeta也是不能动
只要解锁BL不管安卓版本都会停止对system recovery分区的校验。
所以为什么刷GSI简单,root难。
下载模式:
BOOTROM--->FDL1--->FDL2(UBOOT/LK)
但是为了解锁BL,可以改成:
BOOTROM-->SPLLOADER(patched)--->正常启动的流程(但是uboot修补了)
下载模式保留一个COM端口,和电脑通信,采取HDLC协议,通信时候需要发送写入地址和写入内容,实际上这里是用来发送FDL1的。然后发送exec命令执行fdl1
需要注意的是发送FDL1之后执行前bootrom仍然会进行签名验证,但是我们发现对于UMS9621之前的发送写入地址时候没有检查写入地址的范围!所以可以任意发送写入地址破坏bootrom堆栈实现绕过签名验证。这就是CVE 38694原理
然后FDL1不同于SPLLOADER,是类似于firehorse loader,是用来初始化内存然后暴露一个端口用于上传FDL2.
FDL1不在本机,理论上售后那里才有,但是由于绕过了签名验证,所以可以拿同样DRAM分布的机子的FDL1使用。
FDL2实际上就是修改版的uboot或者lk,这个也可以直接修补本机的uboot镜像得到,实际上就是暴露了一个COM端口和电脑进行交互。
官方的解锁BL是拿你手机序列号作为token,然后你需要对token签名发回fastboot,fastboot flashing unlock_bootloader X:\xxx\signature.bin,然后fastboot会执行解锁命令,解锁标志储存在miscdata分区。
这就是SpreadTrumTools工具的原理。但是能用这个工具前提这个签名用的私钥和你手机的rsa公钥匹配,也就是采用公用的rsa证书。
如果oem用自己的签名那么就用不了了。
有一种解锁方案是直接拿公钥签名自己的vbmeta,然后自己签名boot,但是这种也是要求rsa证书采用公用的密钥,否则不可行。
还有一种使用spd_dump的解锁方案,也就是利用CVE 38694,不上传FDL1,而是上传修补的splloader,临时关闭对uboot的签名验证,然后启动修补的uboot,修补的uboot直接调用解锁函数而不会进行任何验证
最后一种方案是利用CVE 38691也就是永久禁用安全启动,直接修补uboot改解锁状态就行,这种仅限于UMS512 UMS312 UD710,因为新版的漏洞修复了。
至于为什么很多人说中兴的或者一些设备用spd_dump 38694的解锁不了,那是因为新版紫光展锐对解锁状态检查添加了额外的限制,解锁bl不仅是在miscdata写入解锁标志,还要写入你上传的那个签名文件到miscdata,每次开机会验证那个签名文件的签名,如果不匹配bl仍然是锁定状态。