本帖最后由 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权限的方法相关推荐

  1. 2022-01-26 Android app java 获取设备制造商的方法:Build.MANUFACTURER,实际上是读ro.product.manufacturer的值。

    一.Android app java 获取设备制造商的方法:Build.MANUFACTURER 二.例如  二.分析Build.MANUFACTURER流程,实际上是读ro.product.manu ...

  2. 计算机管理员永久访问权限,win7系统账户怎样永久获取管理员权限?

    win7系统账户怎样永久获取管理员权限? 腾讯视频/爱奇艺/优酷/外卖 充值4折起 win7系统账户怎样永久获取管理员权限? 1.点击开始菜单,在"计算机"上单击右键选择" ...

  3. 10计算机管理员权限获得,Win10永久获取管理员权限的方法

    Win10怎么永久获取管理员的权限呢?使用电脑的小伙伴都知道,一般我们要运行某个文件或进行进行说明比较重要的步骤的时候,都需要使用管理员的身份来运行.如果没有管理员权限的话,我们使用Win10的时候就 ...

  4. win10永久获取管理员权限的办法

    大家在使用电脑的时候经常会遇到需要管理员权限才能操作的情况,那么win10系统的管理员权限怎么获取呢?下面小编就来教教大家win10永久获取管理员权限的办法. 方法一 1.在开始菜单上单击鼠标右键,在 ...

  5. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  6. Android应用.三星i9000系列(3).无需刷机轻松获取Root权限

    Android应用.三星i9000系列指南(3).无需刷机轻松获取Root权限 草木瓜 20110403 一.前言 从购机到现在,也刚几天,平常忙于工作,没怎么捣鼓手机.晚上偶尔想打开 wifi玩玩, ...

  7. android 删除文件函数,Android updater

    这是Android系统来运行updater-scripts的Edify语言的基本介绍. 大部分的Edify命名都是函数,当调用这些函数结束的时候,会返回数据给脚本.当然,你也可以使用这些函数的返回值来 ...

  8. android service intent-filter,如何在permission中加入intent-filter过滤器获取NotificationListenerService权限...

    现在要让我的app获取NotificationListenerService权限,我勾选了BIND_NOTIFICATION_LISTENER_SERVICE权限后,用native.js跳到ACTIO ...

  9. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

最新文章

  1. 计算机视觉这篇就够了
  2. [转] 使用模板自定义 WPF 控件
  3. 一文搞懂 Java 线程中断
  4. c# union结构体_P/Invoke各种总结(八、在C#中使用Union联合体)
  5. Python多种方式实现”欢迎小红“
  6. 作业六 栈的使用和界面编程探索
  7. C#复制文件夹下的所有内容到另一个文件夹
  8. html (第四本书第九章参考)
  9. window.open打开txt文件
  10. VBA 数据透视表的创建
  11. vue中清除浏览器缓存得方法
  12. python练习题003:圆的面积
  13. python植物大战僵尸辅助_Python自学入门,如何制作植物大战僵尸
  14. oracle 拼音首字母查询,使用ORACLE函数实现按汉字拼音首字母查询
  15. HTML中为什么点击按钮没有反应
  16. Pytorch中torch.nn.Softmax的dim参数含义
  17. python2exe_Python 使用Py2exe进行bin化
  18. 安卓设置keychain_简单实现KeyChain实例
  19. Java经典实验_猴子的经典实验(转载)
  20. 如何使用Python实现图像文字识别OCR

热门文章

  1. javafx阴影_JavaFX技巧23:节省内存! 属性的阴影场
  2. junit:junit_简而言之,JUnit:另一个JUnit教程
  3. 使用Java :: Geci生成setter和getter
  4. java百里香_百里香Spring测试的意见
  5. Apache Ant 1.9.13和1.10.5发布–支持Java 11单文件源程序
  6. JDK 12,合并的收集器和命名的挑战
  7. elastic 修改map_Amazon Elastic Map Reduce使用Apache Mahout计算建议
  8. 非静态方法可以访问Java中的静态变量/方法吗?
  9. 带有Netflix Ribbon的Spring Cloud Rest Client-基础知识
  10. dbunit测试dao_用于数据库测试的DBUnit,Spring和注释