系统:Android
平台:MTK
对于一些应用(像apple music 4.7版本以及之后的版本),会检测该设备是否已经root过,root过的设备就无法正常使用该应用,那么我们该如何处理,使得该应用能正常的使用在咱们的设备上,
方案有两种,但都需要可以对Android源码进行定制的能力。
- 修改su的二进制文件的保存位置。
- 修改su在系统中的名称,避免被检测。
在讨论如何使root过的设备能正常使用该APP前,我们需要先了解检测的方案是什么样的。
一、一般性的检测方案
检测方案会对Android设备特定目录检测二进制文件(su)的存在,如果存在则判定设备已经被root过,可以执行只有root用户才能执行的操作,下面的函数即可检测:
private boolean checkRootMethod1() {
String[] paths = {
"/system/app/Superuser.apk", // SuperSU的APK路径
"/sbin/su", // su二进制文件路径
"/system/bin/su", // su二进制文件路径
"/system/xbin/su", // su二进制文件路径
"/data/local/xbin/su", // su二进制文件路径
"/data/local/bin/su", // su二进制文件路径
"/system/sd/xbin/su", // su二进制文件路径
"/system/bin/failsafe/su", // su二进制文件路径
"/data/local/su", // su二进制文件路径
};
for (String path : paths) {
if (new File(path).exists()) return true;
}
return false;
}
其实从检测的目录中,我们也可以想到对应的策略去避免被检测 出来。
二、屏蔽root设备检测
从检测方案中我们可以想到对应的策略去规避检测。
2.1 更改su的存放位置
此时需要对应修改su的编译脚本,更改对应的生成的su文件测放的位置。
编译脚本位置:system/extra/su/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -std=c11 -Wall -Werror
LOCAL_SRC_FILES:= su.c
LOCAL_MODULE:= su
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := option
//option指的是系统指定编译才会编译
//如果是debug就表示如果编译debug版本的a 就编译进去
include $(BUILD_EXECUTABLE)
TARGET_OUT_OPTIONAL_EXECUTABLES:该参数便决定了编译完成后,su文件在系统重存放的位置。其为编译脚本的宏定义,在Android源码的build目录下可以找到相应的定义,了解对应的具体指代位置。
- 直接改为指定的目录文件可以吗?
答案是不可以,因为试过,没有生效,当然也有可能是我没改到位。 - 怎么改有效果?
查看当前系统中的宏定义有没有自己需要的目录位置,例如:vendor目录的宏定义,TARGET_OUT_VENDOR_OPTIONAL_EXECUTABLES,即可将其改到系统的vendor目录下。
**注意:**事先在out目录清除之前生成的su文件,不然依旧会将其打包进入img文件中。 - 还需要修改对应的权限文件,在system/meditek/sepolicy/中,修改原来su对应权限项从而完成完整的替换。
2.2更改su文件的名称
即修改原su二进制可执行文件的名字,改名字即修改Android.mk里面模块的名字即可。打包成名字即为修改后的名字。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -std=c11 -Wall -Werror
LOCAL_SRC_FILES:= su.c
LOCAL_MODULE:= sus
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := option
例如上方将其改为sus,在编译成系统镜像之后,便可以实现在系统重调用sus获取root权限。也要注意修改对应的权限文件,在system/meditek/sepolicy/中,修改原来su对应权限项从而完成完整的替换。