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通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 项目开发中各个目录的关系

项目根目录&#xff08;Project Root&#xff09;&#xff1a;本地硬盘中存放项目内容的根目录 项目名称&#xff08;Project Name&#xff09;&#xff1a;IDEA 保存的项目名称&#xff0c;默认和项目根目录的名称相同&#xff0c;可以修改。有啥作用&#xff1f;通过 IDEA 部…

apache spark_Apache Spark中的自定义日志

apache spark您是否曾经对运行了几个小时的Spark作业感到沮丧&#xff0c;但由于基础设施问题而失败了。 您会很晚才知道此故障&#xff0c;并浪费了数小时的时间&#xff0c;当Spark UI日志也无法进行事后检查时&#xff0c;它会更加痛苦。 你不是一个人&#xff01; 在本文…

android中暂停服务,Android 装逼技术之暗码启动应用

前言喜欢的小伙伴欢迎关注&#xff0c;我会定期分享Android知识点及解析&#xff0c;还会不断更新的BATJ面试专题&#xff0c;欢迎大家前来探讨交流&#xff0c;如有好的文章也欢迎投稿。什么是暗码&#xff1f;在拨号盘中输入*#*##*#*后&#xff0c;APP 可以监控到这些输入&am…

JShell 详解

文章目录一、简介二、为什么使用 JShell三、参考示例启动 JShell退出 JShell声明定义基本类型的变量声明定义一个方法覆盖已存在的变量、方法、类的定义查看 JShell 默认导入的包自动补全功能列出所有键入的源列出已声明方法及其签名加载外部的源代码查看 JShell 提供的所有指令…

graphql_GraphQL在Wildfly群上

graphql“ GraphQL是API的查询语言&#xff0c;是用于使用现有数据完成这些查询的运行时。 GraphQL为您的API中的数据提供了完整且易于理解的描述&#xff0c;使客户能够准确地询问他们所需的内容&#xff0c;仅此而已&#xff0c;使随着时间的推移更容易开发API并启用强大的开…

android中有哪些utils的作用,AndroidUtils

多年开发Android积攒下来好多常用的工具方法&#xff0c;保存在随笔中&#xff0c;持续更新。TimeUtil/*** 获取距当前时刻的时间戳** param createTime* return*/public static String getTimestamp(long createTime) {long currrentMillis System.currentTimeMillis();// if…

Java中的关键字this_super

文章目录要点错误的理解正确的理解演示代码要点 1.在类的构造器中&#xff0c;可以使用 this() 调用本类的其它构造器&#xff0c;调用的时候根据构造器声明的参数列表传递参数值 2.super() 调用父类的无参构造器 3.super.method() 调用父类的 method() 方法 4.super.name …

Spring Hibernate教程

1.简介 在本文中&#xff0c;我们将演示如何利用最流行的ORM&#xff08;对象关系映射&#xff09;工具之一的Hibernate的功能 &#xff0c;该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因&#xff0c;我们在Java Co…

百度地图瓦片 android,百度地图自定义瓦片图获取

nodejs代码const request require(request);const fs require(fs);const bagpipe require(bagpipe);const TileLnglatTransform require(tile-lnglat-transform);let [x1, y1] [72.26, 54.57]; // 起始点坐标(左上角)let [x2, y2] [137.31, 17.8]; // 终点坐标(右下角)le…

IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键

文章目录设置代码补全快捷键设置展开全部的快捷键折叠全部快捷键设置代码补全快捷键 代码自动补全&#xff0c;即智能提示。 打开【系统偏好设置】如下图所示&#xff1a; 在左侧的菜单栏中找到 Keymap → Main Menu → Code → Code Completion → Basic&#xff1a; 设…

android8 老手机,华为多款老旧手机获升安卓8.0,流畅度飙升!

原标题&#xff1a;华为多款老旧手机获升安卓8.0&#xff0c;流畅度飙升&#xff01;一直以来&#xff0c;在手机用户圈都有这么一个共识&#xff0c;那就是安卓手机不如iPhone流畅&#xff0c;之前安卓手机给人的印象就是容易卡顿&#xff0c;而谷歌则一直在为此事苦恼&#x…

java12关键字var_Java 10:“ var”关键字

java12关键字varJava 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Emp…

IntelliJ IDEA for Mac自定义动态代码模板快捷键(Live Templates Shortcut)

文章目录查看更多的快捷键常用的代码模板自定义代码模板快捷键格式化等号文档注释代码模板快捷键应用示例声明定义引用类型变量数组的 for 循环指定循环次数的 for 循环增强 for 循环倒序 for 循环自动生成普通 for 循环语句自动生成main 方法自动生成输出语句自动生成增强for循…

android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼首先 发送端&#xff1a;package com.example.multicastclient;import android.support.v7.app.ActionBarActivity;import java.io.IOException;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.Mult…

java serial_Java的@Serial批注

java serialJDK可能正在使用JDK 11 &#xff1a; Serial获得另一个标准&#xff08;预定义&#xff09;注释 。 JDK-8202385 [“标记与序列相关的字段和方法的注释”]的目的是添加“某种“ SerialRelated”注释&#xff0c;以促进对序列字段和方法的声明的自动检查。” 这种想法…

IntelliJ IDEA 选中变量名,高亮显示其它地方的这个变量名,高亮颜色如何设置呢?

选中了一个变量名&#xff0c;会高亮显示位于别的地方的这个变量名&#xff0c;那么怎么修改其他地方的高亮颜色&#xff1f; 按下 Command , 打开偏好设置窗口&#xff0c;接着看下图&#xff1a;

rest和rest ful_还有更多REST技巧

rest和rest ful在以前的博客文章中&#xff0c;我介绍了一些实现REST体系结构的想法和技巧。 在这篇文章中&#xff0c;我将介绍更多的想法和技巧。 快取 缓存是原始论文的很大一部分。 见5.1.4节 策略包括验证&#xff08; 客户端检查它是否具有最新版本 &#xff09;和过期…

html实心圆点特殊符号,和平精英名称添加圆点符号的方法 和平精英圆点符号代码分享...

和平精英怎么在名字中添加圆点符号呢&#xff1f;昵称中是可以加入圆点符号的&#xff0c;很多小伙伴们都想要一个性一点的名字&#xff0c;那么就可以用到各种各样的特殊符号&#xff0c;圆点符号复制的代码小编已经分享到下面了&#xff0c;有需要这个圆点符号的玩家快带走吧…

Java包装类和基本数据类型的对照

int --> Integer byte --> Byte short --> Short long --> Long boolean --> Boolean char --> Character double --> Double float --> Float 注&#xff1a;基本类型自动转换成对应的包装类型&#xff0c;叫自动装箱&#xff1b;包装类型转换成对应…

java 8 stream_Java 8 Stream示例

java 8 stream这篇文章将帮助您了解Java 8中一些重要且经常使用的Stream操作&#xff0c;这使您使用Java编程变得容易。 让我们以传统示例为例&#xff0c;“员工和部门”。 public class Employee {private String name;private Integer age;private String city;private De…