众所周知,市场上/群友手中有大量高安版(CA)机型库存,高安版刷机一直都被认为是不可能的事。本人经过仔细观察研究,确定了一条可行的刷机方法,在此发出以供交流。
前排提醒:
高安版刷机本质是利用fastboot漏洞。本人研究所使用的机型为EC6108V9C四川/上海电信高安版(hi3798mdmo1g),使用的fastboot版本为
Fastboot 3.3.0-00709-ga3bdc60-dirty (liuhh@HW-TV-S5) (Jul 07 2016 - 12:33:43)
其他机型/fastboot版本均不保证成功。在尝试前请先确认以上版本的fastboot可以运行在你的机器上。
- 高安版概况
高安版中,密钥烧入soc。启动时,bootrom即会检查fastboot签名,若签名无法匹配fastboot内容,则拒绝启动。例如,使用十六进制编辑器,找到fastboot中的mv100字样,改为mv200后写回,开机在显示完reg信息后试图启动fastboot即会卡死,ttl再无输出。若没有对应soc密钥的私钥,将无法自行签名fastboot。因此,高安版机器只能使用运营商提供(或通过其他渠道流出)的已签名fastboot。
进入fastboot后,在启动android bootimg前,fastboot将对bootimg的签名进行校验。一次不成功的校验过程如下:
[HMT]Verify kernel begin.
HI_Flash_Read Ret= 1024
HI_Flash_Read Ret= 1024
The kernel size is [0]
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
[HMT] RSA Verify the kernel Error.
[HMT] Check RSA ERROR!!
[HMT] The kernel verify failed.
此时fastboot将停留在shell界面。高安版刷机的目标就是让fastboot能顺利引导我们的kernel。
- 直接尝试引导(未尝试)
最直接的思路就是在shell界面强行指定引导我们的内核:
mmc read 0 0x1FFBFC0 0x29000 0x6000
bootimg 0x1FFBFC0
当然问题也是明显的,每次启动均要在ttl上操作,类似苹果的临时越狱。本人未在机器上尝试,但如果完美破解不可用的话,不妨一试。
- U盘恢复模式引导
Hi3798可以通过短接J16强制进入U盘恢复模式,U盘中至少需要三个文件:fastboot.bin、bootargs.bin、recovery.img。但事实上,高安版同样具有此功能,只需要将fastboot.bin替换成对应高安版可用的fastboot。替换后的试验结果如下:
(Re)start USB...
USB0: Register 1212 NbrPorts 2
USB EHCI 1.00
scanning bus 0 for devices... 3 USB Device(s) found
USB1: Register 1111 NbrPorts 1
USB EHCI 1.00
scanning bus 1 for devices... 1 USB Device(s) found
scanning usb for storage devices... 1 Storage Device(s) found
Security Begin Read RSA Key!
Secure boot is enabled
reading bootargs.bin
bootargs.bin on device:usb:0:1 FOUND!
reading bootargs.bin from 0
..reading recovery.img
recovery.img on device:usb:0:1 FOUND!
reading recovery.img from 0
............................................................................................................................................................................................................................................................................................................................................................................................................................................................Check Hisilicon_ADVCA ...
Not hisilicon ADVCA image ...
## Booting kernel from Legacy Image at 01000000 ...
Image Name: Linux-7.10.0_s40
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2572224 Bytes = 2.5 MiB
Load Address: 02000000
Entry Point: 02000000
Loading Kernel Image ... OK
OK
Starting kernel ...
此时fastboot就不再显示Verify kernel begin
信息了,且可以看到内核名称已经被成功篡改为了Linux-7.10.0_s40
。将recovery.img替换为自己的内核即可绕过高安正常启动。
实验中观察到:
fastboot.bin、bootargs.bin、recovery.img三者缺一不可。缺少fastboot.bin将不会通过U盘引导,缺少bootargs.bin或recovery.img将导致fastboot立即回落emmc启动流程。
bootargs.bin必须是有效的uboot env文件,否则立即回落emmc。
实验所使用的fastboot版本无论任何情况下都会无视bootcmd
,但bootargs
能正常传递。
Fastboot 3.3.0-00893-ge04e6b5-dirty (tangan@HW-TV-S9) (Oct 19 2016 - 21:30:10)
能正常引导,但通过U盘启动时无法拉起emmc。
直接引导
经过不懈研究,终于发现无需U盘或ttl即可随意启动任意kernel的方法。示例如下(依然使用自制Linux-7.10.0_s40
):
Security Begin Read RSA Key!
Secure boot is enabled
get key value 0x0
HI_Flash_Read Ret= 3072
HI_Flash_Read Ret= 3072
HI_Flash_Read Ret= 10485760
HI_Flash_Read Ret= 10485760
******** boot from kernel...********
[HMT]Verify kernel begin.
HI_Flash_Read Ret= 1024
HI_Flash_Read Ret= 1024
The kernel size is [0]
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
[HMT] RSA Verify the kernel Error.
[HMT] Check RSA ERROR!!
[HMT] The kernel verify failed.
HI_Flash_Read Ret= 512
HI_Flash_Read Ret= 512
Stb mac is : [9C:71:3A:6D:1B:BE]
hpm_code_average = 0x105
Reserve Memory
Start Addr: 0x3FFFE000
Bound Addr: 0x8E64000
Free Addr: 0x3E47E000
Alloc Block: Addr Size
0x3FBFD000 4194304
0x3F8FC000 3145728
0x3F87B000 524288
0x3F878000 8192
0x3F843000 212992
0x3F742000 1048576
0x3F73E000 12288
0x3EF54000 8294400
0x3EDBE000 1658880
0x3E5D4000 8294400
0x3E481000 1384448
0x3E47E000 8192
Press Ctrl+C to stop autoboot
kernel @ 3e08000 (2572288 bytes)
ramdisk @ 4e00000 (2347778 bytes)
page size @ 2048 bytes
initrd rd_start = 4e00000,rd_end = 503d302
## Booting kernel from Legacy Image at 01ffc7c0 ...
Image Name: Linux-7.10.0_s40
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2572224 Bytes = 2.5 MiB
Load Address: 02000000
Entry Point: 02000000
load:2000000,blob_start:1ffc7c0,blob_end:22707c0,image_start:1ffc800,image_len:273fc0
Loading Kernel Image ... OK
OK
kernel loaded at 0x02000000, end = 0x02273fc0
images.os.start = 0x1FFC7C0, images.os.end = 0x22707c0
images.os.load = 0x2000000, load_end = 0x2273fc0
ret -2
initrd rd_start = 4e00000,rd_end = 503d302
Starting kernel ...
(为防js涨价,方法暂时保密)
实验中观察到:
bootcmd
依然被无视,这意味着无法自行指定kernel的存放位置。
- 传递的
cmdline
实为bootargs_1G
,出于某些原因bootargs
被无视了。为了正确启动需要将blkdevparts
等参数手动添加到bootargs_1G
。