我们在开发过程中会用到root权限,但是又不想其它的应用能够检测到手机是root的,该怎么做呢?
首先,检测检测手机root有很重要的一个检测方式, 就是 检测 /system/xbin/su 文件的 s位. 如下图:
-rwsr-sr-x 1 root root 11056 2018-12-05 23:33 procmem
-rwsr-x--- 1 root shell 11064 2018-12-05 23:33 su
从上面我们可以清除看到 权限组一项 有是 s位的, 现在一些应用的检测手段就是 通过得到手机的PATH环境变量,然后扫描该环境变量路径中的全部文件来分析 是否有这个s 位. 那么我们完全可以这么干.
1` 编译的时候删除掉 procmem 这个文件, 删掉是不会有啥影响的.
2` 将su文件的路径给改一改. 比如放到 上一级 system 目录下面.
这两个文件的源码都在 AOSP/system/extras 目录下. 直接修改Android.mk 文件 改变其编译后的路径即可. 但是, su文件如果仅仅是改了路径是不行的. 因为其权限问题.
我们要知道 所有system 分区的文件权限其实都已经在代码中 给预先定义好了, 所以如果要改su文件的路径,那么 代码中定义的权限也需要改掉. 同样如果我们需要在 system分区新增加文件, 也需要去定义权限.
该权限文件路径 AOSP/system/core/libcutils/fs_config.cpp 摘取代码片段如下:
{ 00600, AID_ROOT, AID_ROOT, 0, "system/build.prop" },
{ 00444, AID_ROOT, AID_ROOT, 0, sys_conf_dir + 1 },
{ 00444, AID_ROOT, AID_ROOT, 0, sys_conf_file + 1 },
{ 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.rc" },
{ 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.sh" },
{ 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.ril" },
{ 00555, AID_ROOT, AID_ROOT, 0, "system/etc/ppp/*" },
{ 00555, AID_ROOT, AID_ROOT, 0, "system/etc/rc.*" },
{ 00440, AID_ROOT, AID_ROOT, 0, "system/etc/recovery.img" },
{ 00600, AID_ROOT, AID_ROOT, 0, "vendor/build.prop" },
{ 00600, AID_ROOT, AID_ROOT, 0, "vendor/default.prop" },
{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_dir + 1 },
{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_file + 1 },
// the following two files are INTENTIONALLY set-uid, but they
// are NOT included on user builds.
{ 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procmem" },
{ 04750, AID_ROOT, AID_SHELL, 0, "system/su" },
我们可以看到 其中 /system/su 就是我修改后的路径, 原本是 /system/xibin/su.
此处修改完毕,还有一处aosp/system/sepolicy/private/file_contexts 该文件中 对于 /system/xbin/su的 声明也要改掉.
改完编译后, 执行 /system/su 就会起效了. 直接执行 su 是找不到的.