25.18 红米手机如何root https://scz.617.cn/android/201404041813.txt Q: 我是移动JHACNBA13.0,如何root? A: 2014-04-04 18:13 该版本红米后台已经有/system/xbin/su,但权限是0644,没有x权限。想办法给su加x 权限,比如修改卡刷包的"META-INF\com\google\android\updater-script": #set_perm(0, 0, 0644, "/system/xbin/su"); set_perm(0, 0, 06755, "/system/xbin/su"); 该版本红米自带root开关: 安全中心->授权管理->允许应用获取ROOT权限 用的应该是/system/app/LBESEC_MIUI.apk。 但稳定版中自带root开关是灰的,不可选。用IDA反汇编官方卡刷包中的system\xbin\su, 在"Strings window"中看到一个有意思的提示: "SU is disabled in release version" 查看交叉引用,对其附近的ARM汇编代码反汇编后,伪代码如下,我加了点注释: -------------------------------------------------------------------------- /* * 从/system/build.prop中读"ro.build.version.incremental" */ property_get( "ro.build.version.incremental", &incremental, &property ); /* * 从/system/build.prop中读"ro.build.type" */ property_get( "ro.build.type", &type, &property ); /* * 组织正则表达式的模式匹配串"[0-9]+.[0-9]+.[0-9]+" */ regcomp( &preg, "[0-9]+.[0-9]+.[0-9]+", 5 ); /* * 进行模式匹配,返回0表示匹配,非0表示不匹配 */ regret = regexec( &preg, &incremental, 0, 0, 0 ); /* * regcomp()分配了动态内存,这里释放它,后面用不上了。 */ regfree( &preg ); if ( regret && !strcmp( &type, "user" ) ) { /* * 翻译成大白话,如果"ro.build.version.incremental"不是形如"数字.数字.数字" * 并且"ro.build.type"等于"user"的话,/system/xbin/su认为自己处在release * 版中,不让用! */ _android_log_print( 6, 0, "SU is disabled in release version", buf_a ); memset( &buf_b, 0, 0x400 ); /* * 灰掉"安全中心->授权管理->允许应用获取ROOT权限" */ android::String8::String8( &buf_c, "com.lbe.security.miui.su" ); sprintf( &buf_b, "content://%s/disabled", buf_c ); ... } -------------------------------------------------------------------------- 注释把问题都说清楚了。为了让su认为自己不在release版中,有两个办法: 1) ro.build.version.incremental=4.2.1 // 满足".."即可 2) ro.build.type=eng // 不是"user"即可,比如"userdebug" 这两种修改方案任选其一就可以了,两处一起改没必要,我个人建议改"type=eng"。 怎么改/system/build.prop呢?这变成鸡生蛋、蛋生鸡的问题了,目前看来比较好的 办法是: 1) 用"SP Flash Tool"线刷"CWM Recovery" 2) 进入"CWM Recovery",配合"adb shell"改/system/build.prop、/system/xbin/su 这种组合不需要降级安装老版本卡刷包,不需要林林总总的一键ROOT工具,程序员可 能比较喜欢。 本文有点标题党了,我是平生第一次折腾智能手机(SP),分享一下程序员视角下的瞎 折腾,边学边分享吧,希望有人喜欢。