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

问题:

我遇到的问题是,在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)

{
   switch(msg.cmd) {
   case PROP_MSG_SETPROP:
        msg.name[PROP_NAME_MAX-1] = 0;
        msg.value[PROP_VALUE_MAX-1] = 0;
        if(memcmp(msg.name,"ctl.",4) == 0) {
            if (check_control_perms(msg.value, cr.uid, cr.gid)) {
                 handle_control_message((char*) msg.name + 4, (char*) msg.value);
               } else {
                  ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
                          msg.name + 4, msg.value, cr.uid, cr.pid);
               }
          }
    }
 }

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

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

    int i;
    if (uid == AID_SYSTEM || uid == AID_ROOT)
        return 1;
       /* Search the ACL */
     for (i = 0; control_perms[i].service; i++) {
           if (strcmp(control_perms[i].service, name) == 0) {
                if ((uid && control_perms[i].uid == uid) ||
                   (gid && control_perms[i].gid == gid)) {
                    return 1;
            }
        }
     }
     return 0;
   }

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

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

RocketMQ入门案例【面试+工作】

2113
来自专栏编程

Ansible 2 Api 源码分析及实现

Ansible 2 API ansible 2 API发生了很大的变化。 通过对ansible 2.4.2 的源代码(Python 环境为2.7.5)进行分析来...

40010
来自专栏乐沙弥的世界

使用CRM方式管理heartbeat

1、在heartbeat v2之后的版本,可以将haresources方式管理的资源转化为基于CIB方式进行管理 2、使用CRM(CIB)管理,需要配置ha...

684
来自专栏枕边书

PHP中的数据库三、redis

memcache虽然好用,解决了数据库遇到高并发时的IO问题,但还有很多问题丞待解决: 1、数据持久性问题,memcache用内存进行存储,一旦memcache...

1859
来自专栏Jerry的SAP技术分享

使用Java程序消费SAP Leonardo的机器学习API

以sap leonardo作为关键字在微信上搜索,能搜到不少文章。但是我浏览了一下,好像没有发现有从具体编程角度上来介绍的。所以我就贡献一篇。

1292
来自专栏Core Net

ASP.NET Core 2.0 : 三. 项目结构

3655
来自专栏小狼的世界

PHP中Autoload使用中的一些问题

PHP中提供了Autoload来帮助我们方便的进行文件的包含,但是autoload并非想象的那样能够处理所有的情况,今天就来记录一下前几天遇到的autoload...

552
来自专栏杨建荣的学习笔记

清理session的小插曲(二) (r6笔记第4天)

在上周巡检系统的时候发现session列表中显示有一个session的状态为“KILLED",当时没有太在意,等到周一回来做检查的时候,发现那个session的...

2606
来自专栏编程

史上最全Django知识总结!神级程序员强推:掌握此文就掌握Django

一、视图函数(views.py中的函数):第一个参数类型是HttpRequest对象,返回值是HttpResponse对象 二、URLconf(urls.py)...

2897
来自专栏pydata

mysql使用总结

create database sina default character set utf8mb4 collate utf8mb4_unicode_ci; ...

672

扫描关注云+社区