[toc]
问题
通过分析发现,Qin1s+的/system/build.prop文件中存在现在软件安装的策略。主要体现在ro.sys.appinstallwhitelist=true
此行配置上,具体的软件安装策略白名单存在放/system/etc/install-white-list.xml
。因此要解决Qin1s+只能安装QQ的问题,只有通过修改build.prop的办法。因此需要对手机进行root操作。
PreScheme 准备工作
- 获取系统升级所需的upadte.zip文件,并从update.zip文件中获得boot.img、recovery_from_boot.p、update_recovery.sh、recovery-sources.dat四个文件
- 准备Android开发所需的ADB环境
- 展讯平台驱动程序(用于fastboot连接)
- Magic Manager(用于通过Magic Patch方式获得已经Root的内核)
- boot.img修改编辑工具(rom助手)
- ApplyPatch文件(用于提取recovery.img)
- IDA PRO 64、WinHex(用于解除recovery刷包时的签名验证)
- SuperSu刷机包(用于刷入root权限,根据个人情况使用)
打开开发者模式
- 在通话界面输入
*#83781#*#*
进入EngineerMode - 按下向右方向的按键,上面的标题会从“TELEPHONEY”转为“DEBUG&LOG”,开启“Allow Debug”的选项。
- 退出EngineerMode,进入手机设置,找到设置的“关于手机”选项。
- 找到版本号,点击手机中间圆按键,直到提示“您已处于开发者模式!”或“您已处于开发者模式,无需进行此操作。”后返回设置主菜单。
- 进入开发者模式的选项,打开开启开发者选项,找到USB调试,并勾选。
- 将手机连接至电脑。
- 在adb命令行窗口输入adb reboot recovery
- 进去后会看到一个大红叉,按8键进入recovery模式
SchemeOne. 修改Boot.img获得临时/永久Roor权限
授予ADB调试Root权限
- 使用Boot解包工具解包Boot.img文件
-
修改ramdisk下的default.prop文件
ro.secure=1 # 允许未知来源的安装 ro.allow.mock.location=1 # 允许模拟位置 ro.debuggable=1 # 允许ADB以Root方式进行调试
- 保存后重新打包Boot.img,见修改后的Boot.img文件拷贝到fastboot.exe目录下
-
手机进入fastboot模式
-
使用
fastboot boot boot.img
将Boot.img下载到RAM中并通过该引导文件引导手机启动(此步骤重启手机后,手机将使用boot分区的文件引导。与步骤6二选一,但此步不会因为boot.img的错误而损坏手机) -
使用
fastboot falsh boot boot.img
将Boot.img刷入boot分区。(此步骤将会直接改写boot分区,如果boot.img在创建时出现问题,将导致手机无法开机。步骤5既可以临时使用修改后的boot.img启动系统,也可以验证boot.img的正确性) -
开机进入系统后连接电脑的ADB调试
-
使用
adb root
获得ADB的root权限 -
将system分区下的buIld.prop导出到电脑,并将属性install-white-list的值true修改为false
-
将system分区下的build.prop做好备份并删除,将修改号的build.prop导入到system分区目录下
-
重启系统解决软件安装限制
直接Root手机
- 准备一个安卓手机,连接电脑,并将Boot.img拷入到文件根目录下
- 下载Magic Manager,安装到不限制安装的安卓手机中,或者通过修改包名为“com.tencent.mm”安装到Qin1s+中
- 打开Magic Manager,点击“安装”
- 选择根目录下的Boot.img文件,等待Patch完成。Patch完之后的Boo.img放置在根目录下的Donwload文件夹中,文件名为Magic_Patched.img。
- 将Magic_Patched.img从手机的Download目录中拷贝到电脑的fastboot.exe目录下
- 手机进入fastboot模式
- 使用
fastboot boot Magic_Patched.img
将Boot.img下载到RAM中并通过该引导文件引导手机启动(此步骤重启手机后,手机将使用boot分区的文件引导。与步骤8二选一,但此步不会因为boot.img的错误而损坏手机) - 使用
fastboot falsh boot Magic_Patched.img
将Magic_Patched.img.img刷入boot分区。(此步骤将会直接改写boot分区,如果boot.img在创建时出现问题,将导致手机无法开机。步骤7既可以临时使用修改后的boot.img启动系统,也可以验证boot.img的正确性) - 开机进入系统后检查root权限
- 使用
adb shell
进入ADB调试模式 - 输入
su
检查root权限 - 将system分区下的buIld.prop导出到电脑,并将属性install-white-list的值true修改为false
- 将system分区下的build.prop做好备份并删除,将修改号的build.prop导入到system分区目录下
- 重启系统解决软件安装限制
SchemeTwo. 修改Recovery刷入Su文件
生成recovery.img文件
-
生成ApplyPatch命令。主要检查update_recovery.sh内Applypatch部分的参数,将绝对路径调整为相对路径,将含boot的参数修改为boot.img,将含recovery的参数修改为recovery.img,例如
# update_recovery.sh中的原始命令 applypatch -b /system/etc/recovery-resource.dat EMMC:/dev/block/platform/soc/by-name/boot:9979904:ed82ae281bd7ca37fdf9875d36c9496de3007881 EMMC:/dev/block/platform/soc/by-name/recovery f3e68de8e4c6097ef951b27b2bcdc5368b06647a 10479616 ed82ae281bd7ca37fdf9875d36c9496de3007881:/system/recovery-from-boot.p # 修改适配后的命令 applypatch -b recovery-resource.dat boot.img recovery.img f3e68de8e4c6097ef951b27b2bcdc5368b06647a 10479616 ed82ae281bd7ca37fdf9875d36c9496de3007881:/system/recovery-from-boot.p # 原始命令中存在对boot.img的完整性校验,如果对所用于提取recover.img的boot.img的完整性存在疑问,可以在linux控制台(非adb shell)下通过sha1sum boot.img进行检查。
-
将ApplyPatch、boot.img、recovery_from_boot.p、recovery-sources.dat移动到tmp文件夹中,并将tmp文件夹拷入到adb目录下备用
-
使用
adb push ./tmp /data/local
将文件push到设备的/data/local/tmp目录下 -
使用电脑连接任意已经root的安卓手机或者AVD设备,以root权限运行adb shell命令
-
使用
cd /data/local/tmp
命令进入到/data/local/tmp文件目录下 -
运行修改适配后的命令,控制台窗口显示
patched boot.img. xxxxx
(xxxx指内容无法记忆清楚,本文全靠回忆操作书写) -
使用
ls -la
查看生成是否成功生成recovery.img,成功生成后退出adb shell -
使用
adb pull /data/local/tmp/recovery.img ./
拉取生成的recovery.img文件至本地 -
在linux控制台中输入
sha1sum recovery.img
查看生成的recovery.img是否符合update_recovery.sh中的原始命令里所标识的sha1值。如果符合,说明recovery.img生成成功。
解除recovery签名验证
- 解包recovery.img文件,进入到/system/sbin目录下,提取recovery二进制文件
- 打开IDA Pro,新建一个项目,选择recovery二进制文件,处理器选择ARM Little xxxxx。使用IDA默认加载配置即可
- 等待IDA Pro分析文件完成,从汇编窗口点击地址进入汇编文本,也可以通过左边函数窗口点击进入汇编文本界面(如果汇编文件显示的为关系块图示,右键选择text view切换到汇编文本模式)
- 在Edit中所搜文本"signature",定位到"signature verification failed",浏览上下文,找到最近的CMP指令所在的位置,修改下一句BEQ的指令。可以修改为BNE但这样的作法会导致官方的包无法通过验证,因此,推荐直接修改为无条件跳转指令B。(某些平台为CBZ指令,那么则推荐修改为CBNZ,具体使用什么汇编语言需要视CPU平台而定。对CBZ的暂时没有过多研究,能否使用无条件跳转指令有待考证)
- 由于IDA Pro没有办法直接修改recovery的二进制文件,另外,加载带内存中的二进制可执行文件和作为二进制存储的二进制文件,其地址是不同的,所以需要通过IDA Pro的Hex View窗口,定位到BEQ的上下文,复制其BEQ的上下文十六进制以待Win Hex备用
- 拷贝recovery二进制可执行文件,并用Win Hex打开,打开菜单“Edit”,“Search Hex Value”,将BEQ上下文十六进制复制到框里点搜索(自行去除所复制的十六进制值之间的空格),定位到基地址以后,将BEQ指令的六十进制修改为B指令的十六进制即可
- *可选,重新进入IDA Pro验证是否成功。(此步骤可以在步骤4的IDA Pro操作中,进入到Hex View窗口,定位到BEQ指令的十六进制,通过右键修改或者F2进行临时修改查看效果)
- 将修改好的recovery二进制执行文件替换到已经解包的recovery.img的/systen/sbin目录下,重新打包即可。
验证recovery.img
- 手机连接电脑,进入fastboot模式
- 使用
fastboot boot recovery.img
查看手机能够成功进入recvoery模式,若能则成功了一般,若不能,需要重修对recovery的修改做验证评估。 - 若能成功进入recovery模式,使用任意刷机包,刷入文件,界面显示成功刷入并且开机后能够在刷机包的制定目录中找到文件或者新增的功能成功应用。则表示recovery.img去除权限成功,否则重新进行汇编分析。