android root权限函数,android 4.4下app永久获取root权限的方法
本帖最后由 jackson 于 2017-4-16 20:55 編輯
通過參照
[FAQ11414]android KK 4.4 版本后,user 版本su 權(quán)限嚴(yán)重被限制問題說明
http://www.voidcn.com/blog/wds1181977/article/p-6157006.html
明確要修改三個(gè)地方:
(1)把dalvik/vm/native/dalvik_system_Zygote.cpp文件中函數(shù)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文件中函數(shù)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)關(guān)閉SELinux,可通過命令setenforce 0 臨時(shí)關(guān)閉。
通過測試發(fā)現(xiàn),su權(quán)限仍然被限制,無法讓app臨時(shí)獲取root權(quán)限。系統(tǒng)應(yīng)該在某些地方還做了權(quán)限限制。
糾結(jié)了一陣子,后面在了解Zygote相關(guān)知識(shí)的過程中發(fā)現(xiàn)有一種方式可以讓app永久獲取root權(quán)限,說明如下。
因?yàn)樗蠥ndroid應(yīng)用進(jìn)程都是zygote fork出來的,新fork出來的應(yīng)用進(jìn)程還保持著root權(quán)限,這顯然是不被允許
的,所以這個(gè)fork出來的子進(jìn)程的權(quán)限需要被降級(jí)。
這個(gè)降級(jí)操作的代碼也是在dalvik/vm/native/dalvik_system_Zygote.cpp文件中函數(shù)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();
}
系統(tǒng)通過調(diào)用setresgid和setresuid將APK進(jìn)程的uid/gid從root修改為App安裝時(shí)分配的id,也就是做了權(quán)限退化。
嘗試把這部分代碼注釋掉,讓android所有fork出的進(jìn)程都具有root,更新系統(tǒng)后,發(fā)現(xiàn)機(jī)器啟動(dòng)異常,查看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
日志表明,系統(tǒng)應(yīng)該掛在了安裝應(yīng)用環(huán)節(jié)。具體緣由還沒去研究,估計(jì)系統(tǒng)作了security check,禁止某些進(jìn)程
具有root權(quán)限。
于是換種方式修改:
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();
}
}
修改思路是讓安裝的非內(nèi)置的app具有root權(quán)限。10062這個(gè)id值不固定,根據(jù)不同機(jī)器內(nèi)置的apk數(shù)量來定。android默
認(rèn)10000到99000的AID是分配給應(yīng)用程序的,具體可參考system/core/include/private/android_filesystem_config.h
結(jié)合上文(1)和(2)的修改(SELinux不需要關(guān)閉),安裝的app具有了root權(quán)限,su權(quán)限解放。
后期補(bǔ)充:
經(jīng)過測試,這種方式獲取root會(huì)導(dǎo)致一些app運(yùn)行不了,通過函數(shù)setcapability來bypass掉DAC檢測后能正常運(yùn)行app。
考慮安全性問題,請(qǐng)讀者慎用這種方式獲取root。
可通過這樣的方式:在init.rc里面創(chuàng)建service,這樣肯定具有root權(quán)限,app通過socket方式與service通信。
總結(jié)
以上是生活随笔為你收集整理的android root权限函数,android 4.4下app永久获取root权限的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android申请权限一次性申请多个,a
- 下一篇: android中暂停服务,Android