上周拿到一家工厂的OTT盒子,编译升级包后,升级失败,发现是由于magic key校验失败。本来可以找工厂拿升级包升级,不用自己破解升级,没办法只能服从安排,自己先折腾折腾,看能不能破解,这工厂也蛋疼呀,没事把key改就算了,uboot中还把nand命令裁剪了,sdcard也不能用,怎么都不能升级。
自己研究了一下recovery,发现进入recovery后,init.rc脚本中就执行了recovery可执行文件,如:
/sbin/recovery --update-package=/udisk/update.zip --wipe-data --wipe-catch -wipe-media
这样执行当然可以升级,但是recovery仍然会取校验magic key,因此本地把recovery中的校验部分去掉,如下: bootable/recovery/install.cpp
static int really_install_package(const char *path, int* wipe_cache) { ...... #if 0 int numKeys; Certificate* loadedKeys = load_keys(PUBLIC_KEYS_FILE, &numKeys); if (loadedKeys == NULL) { LOGE("Failed to load keys\n"); return INSTALL_CORRUPT; } LOGI("%d key(s) loaded from %s\n", numKeys, PUBLIC_KEYS_FILE); ui->Print("Verifying update package...\n"); #endif int err; #if 0 err = verify_file(path, loadedKeys, numKeys); free(loadedKeys); LOGI("verify_file returned %d\n", err); if (err != VERIFY_SUCCESS) { LOGE("signature verification failed\n"); return INSTALL_CORRUPT; } #endif ...... } }
编译后的recovery在out/../../target/recovery/root/sbin/下,拷贝到udisk
下一步就是要进入recovery了,在uboot下执行run recovery就可以进入recovery了,这时要先把udisk拔下,进入recovery后再插上udisk
进了recovery后,将recovery拷贝到/sbin/下
要先mount u盘到/udisk: busybox mount /dev/block/sda1 /udisk
然后拷贝到/sbin目录下: busybox cp /udisk/recovery /sbin/recovery
最后执行recovery就可以了:
/sbin/recovery --update-package=/udisk/update.zip --wipe-data --wipe-catch -wipe-media
很多工厂都没有修改magic key,一开始我也不清楚这个工厂要修改,从这次案例中,感觉是应该是担心的工厂胡乱把他的盒子升级吧,不管怎么样,当做是学习了。
附加:
有些方案执行recovery可能不行,还有第二中方法
将recovery拷贝到/sbin下后,重新执行init.rc:
./init init.rc
这个方法在双核的板子上测试过,四核的板子这样执行是重启后进入recovery了