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权限的方法相关推荐
- 2022-01-26 Android app java 获取设备制造商的方法:Build.MANUFACTURER,实际上是读ro.product.manufacturer的值。
一.Android app java 获取设备制造商的方法:Build.MANUFACTURER 二.例如 二.分析Build.MANUFACTURER流程,实际上是读ro.product.manu ...
- 计算机管理员永久访问权限,win7系统账户怎样永久获取管理员权限?
win7系统账户怎样永久获取管理员权限? 腾讯视频/爱奇艺/优酷/外卖 充值4折起 win7系统账户怎样永久获取管理员权限? 1.点击开始菜单,在"计算机"上单击右键选择" ...
- 10计算机管理员权限获得,Win10永久获取管理员权限的方法
Win10怎么永久获取管理员的权限呢?使用电脑的小伙伴都知道,一般我们要运行某个文件或进行进行说明比较重要的步骤的时候,都需要使用管理员的身份来运行.如果没有管理员权限的话,我们使用Win10的时候就 ...
- win10永久获取管理员权限的办法
大家在使用电脑的时候经常会遇到需要管理员权限才能操作的情况,那么win10系统的管理员权限怎么获取呢?下面小编就来教教大家win10永久获取管理员权限的办法. 方法一 1.在开始菜单上单击鼠标右键,在 ...
- 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )
文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...
- Android应用.三星i9000系列(3).无需刷机轻松获取Root权限
Android应用.三星i9000系列指南(3).无需刷机轻松获取Root权限 草木瓜 20110403 一.前言 从购机到现在,也刚几天,平常忙于工作,没怎么捣鼓手机.晚上偶尔想打开 wifi玩玩, ...
- android 删除文件函数,Android updater
这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...
- android service intent-filter,如何在permission中加入intent-filter过滤器获取NotificationListenerService权限...
现在要让我的app获取NotificationListenerService权限,我勾选了BIND_NOTIFICATION_LISTENER_SERVICE权限后,用native.js跳到ACTIO ...
- android sqlite自定义函数,Android中自定义一个View的方法详解
本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...
最新文章
- 计算机视觉这篇就够了
- [转] 使用模板自定义 WPF 控件
- 一文搞懂 Java 线程中断
- c# union结构体_P/Invoke各种总结(八、在C#中使用Union联合体)
- Python多种方式实现”欢迎小红“
- 作业六 栈的使用和界面编程探索
- C#复制文件夹下的所有内容到另一个文件夹
- html (第四本书第九章参考)
- window.open打开txt文件
- VBA 数据透视表的创建
- vue中清除浏览器缓存得方法
- python练习题003:圆的面积
- python植物大战僵尸辅助_Python自学入门,如何制作植物大战僵尸
- oracle 拼音首字母查询,使用ORACLE函数实现按汉字拼音首字母查询
- HTML中为什么点击按钮没有反应
- Pytorch中torch.nn.Softmax的dim参数含义
- python2exe_Python 使用Py2exe进行bin化
- 安卓设置keychain_简单实现KeyChain实例
- Java经典实验_猴子的经典实验(转载)
- 如何使用Python实现图像文字识别OCR
热门文章
- javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场
- junit:junit_简而言之,JUnit:另一个JUnit教程
- 使用Java :: Geci生成setter和getter
- java百里香_百里香Spring测试的意见
- Apache Ant 1.9.13和1.10.5发布–支持Java 11单文件源程序
- JDK 12,合并的收集器和命名的挑战
- elastic 修改map_Amazon Elastic Map Reduce使用Apache Mahout计算建议
- 非静态方法可以访问Java中的静态变量/方法吗?
- 带有Netflix Ribbon的Spring Cloud Rest Client-基础知识
- dbunit测试dao_用于数据库测试的DBUnit,Spring和注释