永久開啟user版本adb root許可權
[Solution]
* adb 的root 許可權是在system/core/adb/adb.c 中控制。主要根據ro.secure 以及 ro.debuggable 等system property 來控制。
預設即檔ro.secure 為0 時,即開啟root 許可權,為1時再根據ro.debuggable 等選項來確認是否可以用開啟root 許可權。為此如果要永久性開啟adb 的root 許可權,有兩種修改的方式:
1. 修改system property ro.secure, 讓ro.secure=0。
2. 修改adb.c 中開啟root 許可權的判斷邏輯。
* 在L 版本上adb 會受到SELinux 的影響, 所以需要調整SELinux policy 設定.
下面詳細說明這兩種修改方式:
第一種方法. 修改system property ro.secure, 讓ro.secure=0。
(1)修改alps/build/core/main.mk
ifneq (,$(user_variant))
# Target is secure in user builds.
ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
將ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 改成 ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 即可。
(2)在android JB 版本(4.1) 以後,google 從編譯上直接去除了adbd 的user 版本root 許可權, 為此您要修改system/core/adb/Android.mk 中的編譯選項ALLOW_ADBD_ROOT, 如果沒有開啟這個選項,那麼adb.c 中將不會根據ro.secure 去選擇root 還是shell 許可權,直接返回shell 許可權。因此您必須需要Android.mk 中的第126行:
ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
===> ifneq (,$(filter userdebug user eng,$(TARGET_BUILD_VARIANT)))
(3)在android L (5.0) 以後, google 預設開啟SELinux enforce mode, 需要在user build 上將su label 預設build 進SEPolicy.
放開SELinux 的限制. 更新alps/external/sepolicy/Android.mk 116 行, 將su label 預設編譯進入sepolicy.
sepolicy_policy.conf := $(intermediates)/policy.conf
$(sepolicy_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
$(sepolicy_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
$(sepolicy_policy.conf) : $(call build_policy, $(sepolicy_build_files))
@mkdir -p $(dir $@)
$(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
-D target_build_variant=$(TARGET_BUILD_VARIANT) \
-D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
-s $^ > $@
$(hide) sed '/dontaudit/d' $@ > $@.dontaudit
將-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng
即第一種方法在android L(5.0) 以後你需要改(1),(2),(3).
第二種方法. 修改adb.c 中開啟root 許可權的判斷邏輯。這裡針對4.1 以後版本 和4.1以前版本有所區別。
(1).如果是JB 4.1 以後版本,直接修改函式should_drop_privileges() 函式, 清空這個函式,直接返回 0 即可。返回0 即開啟root 許可權。
(2).如果是JB 4.1 以前版本,直接修改函式adb_main 函式,在
/* don't listen on a port (default 5037) if running in secure mode */
/* don't run as root if we are running in secure mode */
if (secure) {
struct __user_cap_header_struct header;
struct __user_cap_data_struct cap;
if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) {
exit(1);
}
在這段程式碼前加一行:
secure = 0; //mtk71029 add for root forever.
/* don't listen on a port (default 5037) if running in secure mode */
/* don't run as root if we are running in secure mode */
if (secure) {
struct __user_cap_header_struct header;
struct __user_cap_data_struct cap;
if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) != 0) {
exit(1);
}
(3)在android L (5.0) 以後, google 預設開啟SELinux enforce mode, 需要在user build 上將su label 預設build 進SEPolicy.
放開SELinux 的限制. 更新alps/external/sepolicy/Android.mk 116 行, 將su label 預設編譯進入sepolicy.
sepolicy_policy.conf := $(intermediates)/policy.conf
$(sepolicy_policy.conf): PRIVATE_MLS_SENS := $(MLS_SENS)
$(sepolicy_policy.conf): PRIVATE_MLS_CATS := $(MLS_CATS)
$(sepolicy_policy.conf) : $(call build_policy, $(sepolicy_build_files))
@mkdir -p $(dir $@)
$(hide) m4 -D mls_num_sens=$(PRIVATE_MLS_SENS) -D mls_num_cats=$(PRIVATE_MLS_CATS) \
-D target_build_variant=$(TARGET_BUILD_VARIANT) \
-D force_permissive_to_unconfined=$(FORCE_PERMISSIVE_TO_UNCONFINED) \
-s $^ > $@
$(hide) sed '/dontaudit/d' $@ > $@.dontaudit
將-D target_build_variant=$(TARGET_BUILD_VARIANT) 改成 -D target_build_variant=eng
即第二種方法在android L(5.0) 以後你需要改(1),(3).
[測試與確認]
當修改完成後,只需要重新build bootimage ,然後download 即可,然後到setting 中開啟debug 選項,adb 連線後,會顯示 #, 即root 成功。
總結如下:
第一種方法成功:分三步走
第一步:修改build/core/main.mk將ro.secure=1修改為=0;
第二步:在system/core/adb/Android.mk
ifneq (,(filter userdebug user eng),$TARGET_BUILD_VARIANT)
第三步:在external/sepolicy/Android.mk
LOCAL_MODULE_PATH: $(TARGET_ROOT_OUT)下
將 -D target_build_variant = eng
相關文章
- MAC 開啟root許可權Mac
- Mac 開啟和關閉root許可權Mac
- MYSQL 開啟root遠端登入許可權MySql
- Android系統許可權和root許可權Android
- Atitit godaddy 檔案許可權 root許可權設定Go
- 取消 root 級管理員的 root 許可權
- 自動輸入密碼使用root許可權開啟shell指令碼密碼指令碼
- 【Android】Phoenix OS(鳳凰系統)啟用root許可權Android
- 小米紅米及MIUI手機開啟系統自帶ROOT許可權教程UI
- Android手機獲取Root許可權Android
- Oracle 定義者許可權與呼叫者許可權(AUTHID CURRENT_USER)Oracle
- ubuntu 開放root使用者的SSH訪問許可權Ubuntu訪問許可權
- MySQL資料庫Root許可權MOF方法提權研究MySql資料庫
- artisan日誌 root 許可權解決辦法
- 設定mysql遠端連線root許可權MySql
- Android應用程式獲得root許可權Android
- nfs 掛載目錄 root 許可權不夠 ?NFS
- Mac 在命令列中獲得Root許可權Mac命令列
- win10系統如何開啟管理員許可權 win10開啟管理員許可權的圖文教程Win10
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- App開發許可權APP
- 通過 VirtualApp 實現免 Root 許可權 HookAPPHook
- Ubuntu-給新增使用者新增root許可權Ubuntu
- 如何在Oracle VM下更改root許可權密碼Oracle密碼
- 給非 root 使用者新增 docker 使用許可權Docker
- Mac osx下獲取root使用者許可權Mac
- 儲存過程許可權__Authid Current_User儲存過程
- 許可權之選單許可權
- MacBook如何開啟微信攝像頭的許可權?Mac
- 免費gm許可權手遊 永久免費gm手遊平臺
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- macOS 系統 Root 管理員許可權漏洞解決方案Mac
- linux新增使用者,並賦予root許可權Linux
- root 無法刪除檔案,提示許可權不夠?
- 每日安全資訊:全部 Docker 版本都存在漏洞,允許攻擊者獲得主機 root 訪問許可權Docker訪問許可權
- 【USER】Oracle 一個普通使用者有多少許可權Oracle
- django開發之許可權管理(一)——許可權管理詳解(許可權管理原理以及方案)、不使用許可權框架的原始授權方式詳解Django框架