破解android recovery升级

上周拿到一家工厂的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了

你可能感兴趣的:(android,reocvery)