`
地球小野花
  • 浏览: 163951 次
  • 性别: Icon_minigender_1
  • 来自: 马赛大回旋
社区版块
存档分类
最新评论

Android应用程序获得root权限

阅读更多

Android应用程序获得root权限

 

原文:(http://my.unix-center.net/~Simon_fu/?p=951

    我在博文《Android程序的安全系统》中提到两种让root权限的办法。最近在网上发现很多朋友转载那篇文章,但是对那篇文章中提到的第一种方法怎样实现,不是很明白。本文将会以一个例子实现来演示怎样让一个Android应用程序获得root权限。

 

问题

    我遇到的问题是我想在Java应用程序中动态mount一个NFS的系统,但是执行mount命令必须要要root权限才可以。一般情况下,在Android的Java层是不能获得root权限的。

思路

   我在博文《Android程序的安全系统》中提到两种思路:

1、实现一个init实现一个Service,来帮助Android应用程序执行root权限的命令。 
2、实现一个虚拟设备,这个设备帮助Android应用程序执行root权限的命令。

   本文将会选择第一种来解决Android应用程序mount NFS文件系统的问题。

Init.rc 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属性系统》。

Android property权限

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

   1: void handle_property_set_fd(int fd)

 

   2: {

 

   3:     ......

 

   4:     switch(msg.cmd) {

 

   5:     case PROP_MSG_SETPROP:

 

   6:         msg.name[PROP_NAME_MAX-1] = 0;

 

   7:         msg.value[PROP_VALUE_MAX-1] = 0;

 

   8:  

 

   9:         if(memcmp(msg.name,"ctl.",4) == 0) {

 

  10:             if (check_control_perms(msg.value, cr.uid, cr.gid)) {

 

  11:                 handle_control_message((char*) msg.name + 4, (char*) msg.value);

 

  12:             } else {

 

  13:                 ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",

 

  14:                         msg.name + 4, msg.value, cr.uid, cr.pid);

 

  15:             }

 

  16:         }

 

  17:         ......

 

  18:     }

 

  19: }


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

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

 

   2:     int i;

 

   3:     if (uid == AID_SYSTEM || uid == AID_ROOT)

 

   4:         return 1;

 

   5:  

 

   6:     /* Search the ACL */

 

   7:     for (i = 0; control_perms[i].service; i++) {

 

   8:         if (strcmp(control_perms[i].service, name) == 0) {

 

   9:             if ((uid && control_perms[i].uid == uid) ||

 

  10:                 (gid && control_perms[i].gid == gid)) {

 

  11:                 return 1;

 

  12:             }

 

  13:         }

 

  14:     }

 

  15:     return 0;

 

  16:}








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

    如果想更深入的了解Android Init进程和Android Property的权限控制,请参考《Android Permission》。

实例

    通过上面的介绍我们基本已经有思路了,下面以上面提出的mount nfs文件系统为例说明:

1、首先定义一个执行mount的脚本,我把它于/system/etc/mount_nfs.sh,定义如下:

   1: #!/system/bin/sh

 

   2:  

 

   3: /system/bin/busybox mount -o rw,nolock -t nfs 192.168.1.6:/nfs_srv /data/mnt

2、在init.rc中加入一个Service定义,定义如下:

   1: service mount_nfs /system/etc/mount_nfs.sh

 

   2:     oneshot

 

   3:     disabled

3、让自己的应用程序获得system权限,博文《Android程序的安全系统》中提到了怎样获得system权限,请参考,这里就不赘述了。

4、在自己应用程序中设置System系统属性“ctl.start”为“mount_nfs”,这样Android系统将会帮我们运行mount_nfs系统属性了。这里需要强调的是不能够调用System.getProperty,这个函数只是修改JVM中的系统属性。而不能修改Android的系统属性。可以调用android.os.SystemProperties(Android 2.1 Eclair系统可以调用这个API),如果你的Android版本不能调用这个类,只能通过JNI,调用C/C++层的API property_get和property_set函数了。如果想详细了解请参考(翻译)Android属性系统。代码如下:

 1: SystemProperties.set("ctl.start", "mount_nfs");

5、最后在自己应用程序中,读取“init.svc.mount_nfs”Android系统Property,检查执行结果。代码如下:

   1: while(true)

 

   2: {

 

   3:     mount_rt = SystemProperties.get("init.svc.mount_nfs", "");

 

   4:     if(mount_rt != null && mount_rt.equals("stopped"))

 

   5:     {

 

   6:         return true;

 

   7:     }

 

   8:     

 

   9:     try

 

  10:     {

 

  11:         Thread.sleep(1000);

 

  12:     }catch(Exception ex){

 

  13:         Log.e(TAG, "Exception: " + ex.getMessage());

 

  14:     }

 

  15: }

init进程维护一个service的队列,所以我们需要轮训来查询service的执行结果。

    通过上面的这些步骤,Android应用程序就能够调用init.rc中定义的Service了。这样你的Android应用程序也就获得了root权限。

总结

   通过上文可以看出,在Android获得root权限还是需要一些前提的,比如:

1、必须是Android系统开发人员,否则你无法修改init.rc等文件。 2、你的应用程序必须要获得system权限。

    这样可以防止root权限被应用程序无限制的使用,最终危及Android系统安全。

    希望本文对你能有所帮助,如果有错误之处敬请指正。

 

 

 

分享到:
评论

相关推荐

    Android应用程序请求root权限代码

    ### Android应用程序请求root权限代码详解 #### 一、概述 在Android开发中,有时需要对系统进行更深层次的操作,例如修改系统文件或访问特定的硬件资源等,这就需要使用到root权限。root权限通常被视为超级用户...

    android应用获得执行root权限动作__socket_service

    标题"android应用获得执行root权限动作__socket_service"表明我们要讨论如何在Android应用中通过Socket服务来实现root权限的获取。这种方式通常涉及到创建一个在系统层面运行的服务,该服务具有root权限,并通过...

    Android应用源码获取root权限静默安装.rar

    Android应用源码获取root权限静默安装是一个获取root权限后,不...不过应用程序运行命令获取ROOT权限,设备必须已破解(获得ROOT权限),代码中主要对流进行操作,有对文件读写不清楚的都可以看看。(源码采用GBK编码)

    android获取root权限

    其次,获取 root 权限可以让用户安装一些需要root权限的应用程序,例如一些游戏和工具等等。 那么,谁需要获取 root 权限呢?第一类人群是黑客或喜欢对系统进行hacking的人,因为他们需要更多的控制权和自由度。第...

    Android上获得系统root权限的方法

    同时,获取 root 权限也可以让用户更好地管理设备,例如控制应用程序的权限、设置系统参数等。 在获取 root 权限之前,用户需要了解相关的知识和风险,例如 Linux 命令行操作、SDK 安装和配置等。此外,用户也需要...

    Android应用源码获取root权限静默安装

    不过应用程序运行命令获取ROOT权限,设备必须已破解(获得ROOT权限),代码中主要对流进行操作,有对文件读写不清楚的都可以看看。(源码采用GBK编码)。之前也介绍过一个静默卸载的项目...

    Android修改源码让APP获取root权限可以执行su命令的git diff记录

    修改源码让APP获取root权限可以执行su命令的git diff记录

    android 获取root权限工具

    对于开发者来说,获取root权限能够更深入地调试和优化应用程序,而对于普通用户,root权限则意味着更大的自由度和定制化能力。本工具专注于帮助Android用户简单有效地获取root权限。 首先,让我们了解一下什么是USB...

    安卓应用程序永久获取Root权限的方法

    压缩包内有apk,demo源码,以及NDK 安装文档,主要是教你如何在已经root过得手机上只通过一次获取root权限,以后就再也不会弹出root授权框,主要思想是绕过superuser.apk的权限检查

    android root权限包

    当用户或应用程序请求root权限时,这个"su"程序会处理请求,并在获得授权后允许执行相应的操作。 在提供的压缩包子文件名称列表中,"META-INF"和"system"两个目录都有特殊含义: 1. **META-INF**:这个目录通常...

    android 2.3.4 获得root 权限

    在Android操作系统中,"获得root权限"是指获取到设备的最高管理员权限,允许用户对系统进行深度修改,包括删除预装应用、安装自定义固件、优化系统性能等。对于XT800+运行Android 2.3.4版本的手机用户来说,这可能是...

    APK获取root权限工具

    在Android系统中,APK是应用程序的安装包,它们通常运行在用户权限下,不能访问系统的核心功能。然而,为了实现更高级的功能,比如修改系统设置、管理其他应用或者优化性能,开发者有时需要获取到设备的root权限。...

    开放android系统ROOT权限SU

    - 在Linux(包括Android)中,ROOT权限意味着用户拥有系统管理员的权力,可以修改系统文件、安装需要超级用户权限的应用、删除预装应用、优化系统性能等。 - 开放ROOT权限后,用户可以进行深度定制,例如改变系统...

    android手机获取root权限教程

    ### Android手机获取Root权限教程详解 #### Root权限概念与重要性 **Root权限**,对于Android设备来说,意味着用户能够获得对其操作系统最高级别的控制权。这一权限赋予了用户修改或替换设备操作系统的能力,几乎...

    android手机获取root权限详细教程资料.pdf

    Android手机获取root权限是许多高级用户为了更深度定制和优化设备所采取的步骤。Root权限类似于Linux系统中的超级管理员账户,允许用户访问和修改手机的底层文件,包括系统核心和设置。这种权限通常由手机制造商限制...

    su文件用于获取root权限

    在Android系统中,`su` 文件是一个至关重要的组件,它使得用户可以获取到系统的超级用户权限,也就是我们常说的root权限。Root权限是Android系统中的一种高级权限,允许用户访问和修改系统的受保护部分,包括系统...

Global site tag (gtag.js) - Google Analytics