一、问题描述:
常常跟OTA打交道的朋友可能会经常遇到客户root后的手机OTA升级失败的问题,如果用户取得root权限,手误破坏了system分区数据,是很有可能导致OTA升级失败的,甚至导致手机无法正常开机,因此为了避免取得root权限的手机ota升级失败导致无法开机的情况,我们在OTA升级前对设备进行root检测,如果发现设备已经root,则禁止手机安装更新。
二、实现方案:
1.修改update_script打包脚本:
/* /bootable/recovery/ota_from_target_files.py */
def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
......
  script.AssertRootCheck()
script.AssertSomeFingerprint(source_fp, target_fp)
......
/* Edify_generator.py */
  def AssertRootCheck(self):
    cmd = ('root_check() ||abort("This phone has been root or an error occurred, can not upgrade.");')
    self.script.append(cmd)
下面是升级过程中recovery相关log:
====== Updater-Script:
mount("ext4", "EMMC", "/dev/block/mmcblk0p6", "/system");
root_check() ||abort("This phone has been root or an error occurred, can not upgrade.");
file_getprop("/system/build.prop", "ro.build.fingerprint") == "***" || file_getprop("/system/build.prop", "ro.build.fingerprint") == "***" || abort("Package expects build fingerprint of *** or ***; this device has " + getprop("ro.build.fingerprint") + ".");
getprop("ro.product.device") == "***" || abort("This package is for \"***\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Verifying current system...");
......
如上,脚本第一句是挂载system分区,这是升级前必须要做的动作。之后,在校验fingerprint之前增加了root_check()的动作。这里root_check()是一个接口,该函数的函数体以二进制代码的形式也保存在HOTA包中,供升级时调用。
2.修改安装更新时对应root检测接口root_check()函数:
#define ROOT_SAVE_MAGIC  0x00071029
#define ROOT_UNIT_MAGIC  0x00071029
#define ROOT_MAX_RECORD  1024
#define MAX_TIME_LEN    32
#define MAX_ACTION_LEN  32
#define TASK_COMM_LEN   16

struct root_save_head{
     int           magic;
     int           count;
     char          reserved[512-8];
};

struct root_save_unit{
     int             magic;
     pid_t          ppid;
     pid_t          pid;
     pid_t          tid;
     int             cap;
     int             fork_by_sh;  
     char           parent_name[TASK_COMM_LEN];
     char           process_name[TASK_COMM_LEN];
     char           thread_name[TASK_COMM_LEN];
        char           action[MAX_ACTION_LEN];
     char             time[MAX_TIME_LEN];
     char            reserved[512-136];
};

static struct root_save_head  save_head_tmp;
static struct root_save_unit  save_unit_tmp;

static const char *ROOTM_PATCH = "/dev/rootm";
Value* RootCheckFN(const char* name, State* state, int argc, Expr* argv[]) {
    if (argc != 0) {
        return ErrorAbort(state, "%s() expects no args, got %d", name, argc);
    }

int result = 1;
    int fd;
    int magic = 0;
    int count = 0;

    int index = 0;
    int result_check=1;

fd = open(ROOTM_PATCH, O_RDONLY, 0);

if(fd == -1){
        fprintf(stderr, "Can not open %s, errno=%d\n", ROOTM_PATCH, errno);
        result = 1;
        return StringValue(strdup(result == 0 ? "t" : ""));
    }

if(sizeof(struct root_save_head) != read(fd, &save_head_tmp, sizeof(struct root_save_head))){
        fprintf(stderr, "Can not read the header of records\n");
        close(fd);
        result = 1;
        return StringValue(strdup(result == 0 ? "t" : ""));
    }

magic = save_head_tmp.magic;
    count = save_head_tmp.count;

if(magic != ROOT_SAVE_MAGIC || count > ROOT_MAX_RECORD || count <= 0){
        close(fd);
        fprintf(stderr, "System partition check Pass!\n");
     result = 0;
     return StringValue(strdup(result == 0 ? "t" : ""));

    }else{
        fprintf(stderr,"System partition check Fail!\n");
        fprintf(stderr, "System have been Root.\n");
        result = 1;
        return StringValue(strdup(result == 0 ? "t" : ""));
    }
    return StringValue(strdup(result == 0 ? "t" : ""));
}
void RegisterInstallFunctions() {
RegisterFunction("root_check", RootCheckFN);
这部分代码逻辑在项目的updater/install.c中,增加了一个root_check()的函数,该函数主要用来进行root检测。之后在/tools/releasetools/edify_generator.py脚本中增加对root_check()的调用。这个脚本的作用就是在制作升级包时生成升级包中的updater-script脚本。上述修改都是在该项目的代码中修改,专门用于制作升级包时生成脚本文件使用的,并不参与实际的软件版本编译,所以对这部分的修改只在生成HOTA升级包时生效,最终在HOTA包中的脚本updater-script中添加了root检测的逻辑调用。 而对已经发布的版本没有任何影响。
经过修改后,用户在进行HOTA升级时,实际的流程是:
主系统下获取升级包 (差分包)---> 进行HOTA升级 ---> 手机重启后进入recovery模式 ---> 在recovery下解析HOTA升级包中的updater-script脚本 ---> 调用root_chek()函数检查root标志是否存在 ----> 如果存在,则执行“abort”退出升级流程并给出手机被root的提示语。 如果不存在,继续执行脚本的下一行,直到脚本执行完毕,开始对版本进行差分升级。【如果root检查没有通过,升级流程abort,那么手机停止在recovery模式,用户点击power键后选中reboot选项,手机重启回到正常模式。】
下面是root过的设备禁止OTA所记录的日志片段:
mount /system /dev/block/platform/mtk-msdc.0/by-name/system
System partition check Fail!
System have been Root.
script aborted: This phone has been root or an error occurred, can not upgrade.
This phone has been root or an error occurred, can not upgrade.
E:Error in /sdcard/dload/update.zip
(Status 7)
Installation aborted.
I:no boot messages recovery
I:[1]check the otaupdate is done!
factory_poweroff_flag=0
demo_mode_flag=0

禁止非法root的设备OTA升级相关推荐

  1. EFR32MG21 zigbee 3.0 OTA 升级实验

    EFR32MG21 zigbee 3.0 OTA 升级实验 参考文档:AN728 https://www.sekorm.com/doc/1607600.html 芯片:EFR32MG21A010F76 ...

  2. ipad一直卡在白苹果_IOS checkm8漏洞越狱 典型应用案例之OTA升级造成白苹果修复案例...

    苹果设备OTA升级系统造成白苹果的现象屡见不鲜,给广大的手机用户造成诸多困扰,在这里解释下什么叫OTA升级,通俗讲,就是你的苹果手机提示你有新的版本,通过WIFI或者4G的网络条件下手机自己进行下载新 ...

  3. VIVO Xplay_2.13.2 目前最新ViVo官方固件,完美root,降噪点,完美支持官方OTA升级,稳定,流畅,实用ROM

    ROM版本 VIVO-Xplay-PD2.13.2 ROM作者 大盛 http://weibo.com/DaShengdd Android版本 Android4.2.2 创建日期 2013.07.31 ...

  4. IoT物联网设备OTA:全量升级和增量升级

    各位看官好,上一篇文章我们聊了一下关于 OTA 升级过程中,新的软件包是如何从开发者的电脑上,安全的下载到嵌入式设备中的. 这个流程似乎很简单,不就是下载一个文件而已嘛,怎么还值得写成一篇文章呢? 其 ...

  5. Android 系统 '七夕'巨献 VIVO Xplay 基于ViVo官方稳定内核,完美root,适度美化,降噪点,完美支持官方OTA升级

    ROM版本 VIVO-Xplay-PD2.13.2 ROM作者 大盛 http://weibo.com/DaShengdd Android版本 Android4.2.2 创建日期 2013.08.13 ...

  6. RTOS设备如何快速实现OTA升级--快速接入OTA平台

    目录 一. 创建产品和零件 1.1 登陆平台 1.2 添加产品 1.3 配置产品 1.4 添加升级零件 二. 添加设备 2.1 单个添加 2.2 批量添加 三. 设备注册激活 3.1 发起请求 3.2 ...

  7. AI也会查水表啦!德国小哥开发水表读取器,可OTA升级,成本不到80元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 不少人家里应该都还有这种老式水表,但你能看懂它的读数吗? 恐怕不少人都会感到一脸懵逼.机械式水表可能是最反人类的设计之一了,安装在阴暗的角 ...

  8. Android OTA 升级之三:生成recovery.img

    Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...

  9. Android 8.0 (35)----Android8.0.0-r4的OTA升级流程

    Android8.0.0-r4的OTA升级流程 原网址:https://blog.csdn.net/dingfengnupt88/article/details/52875228  Android系统 ...

最新文章

  1. CAN设备多机联网之总线容抗注意事项
  2. csv与json互转_CSV文件转JSON
  3. 【大会】嵌入式玩直播,IoT做前处理
  4. 关于 SAP Spartacus UI 框架选型问题
  5. 使用BizTalk Server常见问题处理
  6. jQuery-事件和应用
  7. IoC(控制反转)的主要组件和注入的两种方式
  8. leetcode 1217 python
  9. Jira项目导入,被导入项目与目的系统数据类型不一致导入不成功的解决方案
  10. 带你彻底弄明白!javaswitchcase语句例子
  11. 30美元攻陷Intel SGX enclave,Intel 不打算修复
  12. eml文件可以转换为html,eml格式转换成word eml文件转换word
  13. 美国人因工程学的历史
  14. 电脑怎么用自带录音器录制系统的声音
  15. strtolower() 函数
  16. 混沌数学之Chua's circuit(蔡氏电路)
  17. 时间序列分析之Holt-Winters的R语言实现
  18. 【数据库】Navicat编写MySQL自定义函数详解
  19. 索尼前CEO平井一夫今日正式退休 结束35年索尼生涯
  20. 小心你的眼睛—绝妙的视觉错觉图片集锦

热门文章

  1. 用Python来玩微信小游戏跳一跳
  2. 读书笔记-干法-人生三毒
  3. 如何在CentOS 7上安装指定版本的PHP
  4. 汇编语言中xor指令_汇编语言XOR指令:对两个操作数进行逻辑(按位)异或操作(推荐)...
  5. 全铝合金家居零甲醛家具展示
  6. 深度强化学习落地方法论(7)——训练篇
  7. python画圆填色_如何用python在图像上绘制不同笔触和填充颜色的文本?
  8. dell电脑如何安装ubuntu系统_Dell台式机安装Ubuntu 16.04注意事项( Alienware R6)
  9. 广东省公共资源交易平台逆向分析
  10. 【kafka】二、kafka安装