我們在開發過程中會用到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 是找不到的.