日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android root权限函数,android 4.4下app永久获取root权限的方法

發布時間:2023/12/3 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android root权限函数,android 4.4下app永久获取root权限的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本帖最后由 jackson 于 2017-4-16 20:55 編輯

通過參照

[FAQ11414]android KK 4.4 版本后,user 版本su 權限嚴重被限制問題說明

http://www.voidcn.com/blog/wds1181977/article/p-6157006.html

明確要修改三個地方:

(1)把dalvik/vm/native/dalvik_system_Zygote.cpp文件中函數forkAndSpecializeCommon里面以下代碼注釋掉。

for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {

err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);

if (err < 0) {

if (errno == EINVAL) {

ALOGW("PR_CAPBSET_DROP %d failed: %s. "

"Please make sure your kernel is compiled with "

"file capabilities support enabled.",

i, strerror(errno));

} else {

ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));

dvmAbort();

}

}

}

(2)把dalvik/vm/Init.cpp文件中函數initZygote()里面的以下代碼注釋掉。

if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {

// Older kernels don't understand PR_SET_NO_NEW_PRIVS and return

// EINVAL. Don't die on such kernels.

if (errno != EINVAL) {

SLOGE("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));

return -1;

}

}

(3)關閉SELinux,可通過命令setenforce 0 臨時關閉。

通過測試發現,su權限仍然被限制,無法讓app臨時獲取root權限。系統應該在某些地方還做了權限限制。

糾結了一陣子,后面在了解Zygote相關知識的過程中發現有一種方式可以讓app永久獲取root權限,說明如下。

因為所有Android應用進程都是zygote fork出來的,新fork出來的應用進程還保持著root權限,這顯然是不被允許

的,所以這個fork出來的子進程的權限需要被降級。

這個降級操作的代碼也是在dalvik/vm/native/dalvik_system_Zygote.cpp文件中函數forkAndSpecializeCommon里面:

err = setresgid(gid, gid, gid);

if (err < 0) {

ALOGE("cannot setresgid(%d): %s", gid, strerror(errno));

dvmAbort();

}

err = setresuid(uid, uid, uid);

if (err < 0) {

ALOGE("cannot setresuid(%d): %s", uid, strerror(errno));

dvmAbort();

}

系統通過調用setresgid和setresuid將APK進程的uid/gid從root修改為App安裝時分配的id,也就是做了權限退化。

嘗試把這部分代碼注釋掉,讓android所有fork出的進程都具有root,更新系統后,發現機器啟動異常,查看log:

I/Zygote??(31781): Accepting command socket connections

I/? ?? ???(31986): System server: starting sensor init.

D/SensorService(31986): nuSensorService starting...

E/Sensors (31986): open_sensors called begin.

I/QCOM PowerHAL(31986): QCOM power HAL initing.

I/SystemServer(31986): Entered the Android system server!

I/SystemServer(31986): Waiting for installd to be ready.

I/SystemServer(31986): Enabled StrictMode logging for WM Looper

I/Installer(31986): connecting...

I/Installer(31986): disconnecting...

E/Installer(31986): connection failed

日志表明,系統應該掛在了安裝應用環節。具體緣由還沒去研究,估計系統作了security check,禁止某些進程

具有root權限。

于是換種方式修改:

if(gid < 10062) {

err = setresgid(gid, gid, gid);

if (err < 0) {

ALOGE("cannot setresgid(%d): %s", gid, strerror(errno));

dvmAbort();

}

}

if(uid < 10062) {

err = setresuid(uid, uid, uid);

if (err < 0) {

ALOGE("cannot setresuid(%d): %s", uid, strerror(errno));

dvmAbort();

}

}

修改思路是讓安裝的非內置的app具有root權限。10062這個id值不固定,根據不同機器內置的apk數量來定。android默

認10000到99000的AID是分配給應用程序的,具體可參考system/core/include/private/android_filesystem_config.h

結合上文(1)和(2)的修改(SELinux不需要關閉),安裝的app具有了root權限,su權限解放。

后期補充:

經過測試,這種方式獲取root會導致一些app運行不了,通過函數setcapability來bypass掉DAC檢測后能正常運行app。

考慮安全性問題,請讀者慎用這種方式獲取root。

可通過這樣的方式:在init.rc里面創建service,這樣肯定具有root權限,app通過socket方式與service通信。

總結

以上是生活随笔為你收集整理的android root权限函数,android 4.4下app永久获取root权限的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。