前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【专业技术】android 应用程序如何获取root权限

【专业技术】android 应用程序如何获取root权限

作者头像
程序员互动联盟
发布于 2018-03-12 04:02:54
发布于 2018-03-12 04:02:54
2K00
代码可运行
举报
运行总次数:0
代码可运行

问题:

我遇到的问题是,在setting中我要操作/dev/mem设备,在一个寄存器中写值。对/dev/mem的操作毫无疑问是需要root权限的。开始我的做法是使用jni方法。添加一个jni调用然后setting调用。但是就算我把/dev/mem的权限模式设置为777,在setting中依旧无权限打开/dev/mem。

解决方法:

把操作/dev/mem的部分写成一个独立的应用程序,然后在init.rc中启动一个service,把此服务的属性设置为 oneshot以及disabled,然后在需要的时候在setting中启动此服务。

主要修改有两个地方,第一个是init.rc,添加了下面一个服务:

service set_recovery_mode /system/bin/set_recovery_mode class core disabled

第二个地方是setting中需要启动set_recovery_mode服务的地方,最简单的方法是添加下面代码:

try {

Runtime.getRuntime().exec("start set_recovery_mode");

} catch (Exception e) {

e.printStackTrace();

}

附加介绍下init程序中与service相关的内容

Android系统init.rc中定义很多Service,具体定义格式可以参考《Android Platform Developer’s Guide》中的“Android Init Language”。Init.rc中定义的Service将会被Init进程创建,这样将可以获得root权限。

现在问题是Android应用程序怎样启动让init进程知道我们想运行那个进程呢?

答案是设置系统属性“ctl.start”,把 “ctl.start”设置为你要运行的Service,假设为“xxx”,Android系统将会帮你运行“ctl.start”系统属性中指定的 Service。那么运行结果init进程将会将会写入命名为“init.svc.+Service名称”的属性中,也就是“init.svc.xxx” 属性,应用程序可以参考查阅这个值来确定Service执行的情况。

Android property权限

难道Android属性“ctl.start”是所有进程都可以设置的吗?那世界不就乱套了,谁都可以可以执行init.rc中Service了,查看 property_service.c中的源码,设置Android系统属性的函数为

handle_property_set_fd:

void handle_property_set_fd(int fd)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   switch(msg.cmd) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   case PROP_MSG_SETPROP:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        msg.name[PROP_NAME_MAX-1] = 0;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        msg.value[PROP_VALUE_MAX-1] = 0;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        if(memcmp(msg.name,"ctl.",4) == 0) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            if (check_control_perms(msg.value, cr.uid, cr.gid)) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                 handle_control_message((char*) msg.name + 4, (char*) msg.value);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
               } else {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                  ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                          msg.name + 4, msg.value, cr.uid, cr.pid);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
               }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
          }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 }

从源码中我们发现如果设置“ctl.”开头的Android系统property,将会调用check_control_perms函数来检查调用者的权限,其定义如下:

static int check_control_perms(const char *name, int uid, int gid) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int i;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    if (uid == AID_SYSTEM || uid == AID_ROOT)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        return 1;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       /* Search the ACL */
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     for (i = 0; control_perms[i].service; i++) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
           if (strcmp(control_perms[i].service, name) == 0) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                if ((uid && control_perms[i].uid == uid) ||
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                   (gid && control_perms[i].gid == gid)) {
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                    return 1;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     return 0;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   }

我们发现root权限和system权限的应用程序将会授权修改“ctl.”开头的Android系统属性。否则将会检查control_perms全局变量中的定义权限和Service。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android系统启动——7附录1:Android属性系统
属性系统在Android 系统中大量使用,用来保存系统级别的设置或者在进程间传递一些简单的信息。每个属性由属性名称和属性值组成,名称通常是一串‘.’分割的字符串,这些名称的前缀有特定的含义,不能随意改动,但是前缀后面的字符串可以由应用程序来制定。而且属性值只能是字符串,如果需要在程序中使用数值,需要自定完成字符串和数值之间的转换。
隔壁老李头
2018/08/30
1.6K0
Android系统启动——7附录1:Android属性系统
安卓root权限管理_root权限在哪里设置
Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, Android系统权限相关的内容,
全栈程序员站长
2022/11/17
14.3K0
init进程启动过程
init进程是Android系统中用户空间的第一个进程,进程号为1,是Android系统启动的一个关键步骤,作为第一个进程,它的主要工作是创建Zygote和启动属性服务等。init进程是由多个源文件共同组成的,源码目录在system/core/init中。
八归少年
2023/11/13
5310
[Android][Framework]SystemProperties
在Android 系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.prop 以及default.prop 这两个文件中,主要属性集中在build.prop中。
wOw
2020/01/20
2.3K0
读书笔记--Android系统启动
==本文为读书和博客学习笔记,记录将知识总结自己理解的方式。可能存在错误。文末会给出相关参考链接==
g小志
2020/07/21
6570
Android系统启动——2init进程
严格上讲,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完成意义上的"操作系统";而这一系列进程是维持Android设备正常工作的关键,所以它们肯定有一个"根进程",这个"根进程"衍生出了这一系列进程。这个"根进程"就是init进程。
隔壁老李头
2018/08/30
3K0
Android系统启动——2init进程
Android Framework学习(一)之init进程解析
init进程是Android系统中用户空间的第一个进程,它被赋予了很多极其重要的工作职责,init进程相关源码位于system/core/init,本篇博客我们就一起来学习init进程(基于Android 7.0)。
老马的编程之旅
2022/06/22
1.8K0
Android Framework学习(一)之init进程解析
android开机动画多长时间_Android开机动画原理分析
Android系统开机动画, 是由bootanimation进程将多桢的图片按次序循环播放,在屏幕上形成的动画效果。
全栈程序员站长
2022/08/27
1.1K0
Android开机动画启动流程
在Android设备开机启动时,会展示Android开机动画,用于增加用户体验和展示设备品牌等信息。它也是Android系统启动的一部分。开机动画是由bootanimation负责的,因此首先先了解下bootanimation是如何启动的。
八归少年
2023/11/14
8340
像极客一样提取Android的Root权限
本文将深入揭示提取Android ROOT权限的完整过程。这一过程与网上的方法有很大的差异。很多网上提取ROOT权限的方式都是使用别人做好的程序,有的甚至点击一下按钮就会自动完成所有的工作。这样做尽管可以成功提取ROOT权限,但读者并不能了解其中的原理,而且由于Android设备的千差万别,可能并不是每一种Android设备都可以很容易找到提取ROOT权限的工具。所以最通用的方法就是尽可能利用现成的工具来完成提取ROOT权限的工作。那么现成的工具有什么呢?其实主要就是Android源代码以及Linux内核源代码。也就是说,大多数工作都可以通过这些源代码来解决。当了解了这一过程的原理后,如果并没有找到合适的提取ROOT权限的工具,就可以通过本文介绍的方法很容易获取Android设备的ROOT权限。
蒙娜丽宁
2020/11/04
2.4K0
像极客一样提取Android的Root权限
Android Framework分析(1)-init
init进程是Linux系统中用户空间的第一个进程,进程号固定为1。Kernel启动后,在用户空间启动init进程,并调用init中的main()方法执行init进程的职责。对于init进程的功能分为4部分:
老马的编程之旅
2022/06/23
1.1K0
Android Framework分析(1)-init
Android系统启动之Init流程(下)
判断启动部分,如果是ueventd,调用ueventd_main主函数,如果是watchdogd,调用watchdogd_main主函数.
李小白是一只喵
2020/04/23
1.3K0
Android系统启动之Init流程(下)
Android init 启动
Android是基于Linux系统的,所以Android启动将由Linux Kernel启动并创建init进程。该进程是所有用户空间的鼻祖。
Rouse
2020/12/14
2.6K0
android进阶之了解Android系统与开机过程
Android系统的源代码数量非常庞大,这些代码主要分成4层,从低到高为Linux内核层、系统库层、应用程序框架层和应用程序层,它们分别由驱动工程师、系统工程师、框架工程师和应用程序工程师来开发。如图所示为整个Android系统的框架图:
见得乐
2022/09/08
7120
Android系统属性(c接口)
属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.proc 以及default.proc 这两个文件中,主要属性集中在build.proc中。
李小白是一只喵
2020/04/24
9780
Android系统属性(c接口)
Android 用户态启动流程分析
从硬件上电启动到终端软件可用是一个漫长而复杂的过程,我们在开心享受着丰富的应用程序时候,可能并没想到这其中所包含的工程师心血。
evilpan
2023/02/12
1K0
[Android][Recovery]自动挂载system分区
前一篇Recovery打开adb shell里提到system目录是用来挂载系统/system分区的,所以是一个空目录。这一点是通过打开adb shell后,查看文件目录知道的。
wOw
2020/01/20
5.4K0
Android系统启动——3init.rc解析
init.rc文件是以“块”(section)为单位服务的,,一个“块”(section)可以包含多行。“块”(section)分成两大类:一类称为"动作(action)",另一类称为“服务(service)”。
隔壁老李头
2018/08/30
5.6K0
Android系统启动——3init.rc解析
Android系统启动——4 zyogte进程 (C篇)
我们大家都是知道"一鼎三足"和"三角形的稳定性",那么支撑Android系统的三个"足"是什么?即init进程、SystemServer进程和Zygote进程。本篇文章我们就好好来研究下Zygote进程
隔壁老李头
2018/08/30
2.9K0
Android系统启动——4 zyogte进程 (C篇)
Android系统启动流程 -- 学习笔记
Android系统每年都会迎来大版本的更新,Android系统的应用程序基于java语言编写,底层又是基于Linux内核,系统的启动流程包含了整个系统从内核-->runtime-->java世界的全过程,掌握Android系统的启动的原理是整体上理解Android架构的关键。
用户6414482
2022/08/28
8730
Android系统启动流程 -- 学习笔记
相关推荐
Android系统启动——7附录1:Android属性系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验