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权限的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android申请权限一次性申请多个,a
- 下一篇: android8 老手机,华为多款老旧手