- 浏览: 163951 次
- 性别:
- 来自: 马赛大回旋
文章分类
最新评论
-
ihopethatwell:
楼主请教一下,如果我添加packages/MSystemUI/ ...
Framework添加AIDL文件 -
285985787:
太感谢了 哈哈
eclipse查看android源码工程(附件) -
bluishoul:
应该比较大吧 还是自己编译吧 但是我的ubuntu是装的wub ...
Android 4.0 编译全程... -
地球小野花:
gzfreeman 写道请问用了多长时间?几个小时。具体没计算 ...
Android 4.0 编译全程... -
地球小野花:
bluishoul 写道求镜像 呵呵 bluishoul@gm ...
Android 4.0 编译全程...
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权限的命令。 本文将会选择第一种来解决Android应用程序mount NFS文件系统的问题。
在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属性“ctl.start”是所有进程都可以设置的吗?那世界不就乱套了,谁都可以可以执行init.rc中Service了,查看property_service.c中的源码,设置Android系统属性的函数为handle_property_set_fd:
思路
2、实现一个虚拟设备,这个设备帮助Android应用程序执行root权限的命令。Init.rc Service
Android property权限
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,定义如下:
2、在init.rc中加入一个Service定义,定义如下:
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属性系统》。代码如下: 5、最后在自己应用程序中,读取“init.svc.mount_nfs”Android系统Property,检查执行结果。代码如下:
init进程维护一个service的队列,所以我们需要轮训来查询service的执行结果。 通过上面的这些步骤,Android应用程序就能够调用init.rc中定义的Service了。这样你的Android应用程序也就获得了root权限。 通过上文可以看出,在Android获得root权限还是需要一些前提的,比如: 1、必须是Android系统开发人员,否则你无法修改init.rc等文件。 2、你的应用程序必须要获得system权限。 这样可以防止root权限被应用程序无限制的使用,最终危及Android系统安全。 希望本文对你能有所帮助,如果有错误之处敬请指正。
实例
1: #!/system/bin/sh
2:
3: /system/bin/busybox mount -o rw,nolock -t nfs 192.168.1.6:/nfs_srv /data/mnt
1: service mount_nfs /system/etc/mount_nfs.sh
2: oneshot
3: disabled
1: SystemProperties.set("ctl.start", "mount_nfs");
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: }
总结
发表评论
-
1123456
2012-02-08 11:41 851 -
Android 4.0 编译全程...
2011-11-18 13:35 9742进过几天的等待,几经波折终于把android 4.0 的代码下 ... -
Android 4.0 亮点之WI-FI Direct
2011-11-15 20:01 8797Wi-Fi Direct 来自官网: Android ... -
Android 4.0 源码下载中....
2011-11-15 11:02 8530经过3.0+ 版本不开源,终于等到4.0的开源,也可以看看4. ... -
Android RIL CDMA分支总结(1)
2011-05-16 21:36 4830Android RIL CDMA分支总结 1. CDM ... -
Android APN的设置问题
2011-03-18 13:08 2393Android APN的设置问题 原创作品,允许转 ... -
eclipse查看android源码工程(附件)
2011-03-11 13:47 3930eclipse查看android源码工程(附件) 网上 ... -
快速体验Android 2.3
2010-12-07 10:21 1603由于Google目前只是开放了Android 2.3的源 ... -
Google 正式发布Android 2.3 -姜饼来了
2010-12-07 09:58 971最值得期待的视频通话功能。动起来吧~ -
Android Launcher解读之一AndroidManifest.xml
2010-11-29 16:50 0AndroidManifest.xml是何物?它在And ... -
android linux 基础知识总结
2010-09-06 11:03 0android linux 基础知识总结 (很好,很强大 ... -
Android源码下“系统级开发”——Settings例子
2010-09-04 13:50 9434在Android开发过程中,通常会遇到有很多隐藏的 ... -
PC机上体验Android x86操作系统
2010-09-03 13:15 7830Android X86是一款支持x86硬件平台上 ... -
透过HAL(硬件抽象层)看顶层API是如何访问硬件
2010-08-07 15:01 15035文章导读:HAL硬件抽象层的实现及 ... -
Android应用程式编译成系统程序
2010-08-05 22:22 7040Android应用程式编译成系统程序简介 简 ... -
android.编译程序的模板.android.mk.txt
2010-08-03 00:31 1587# 编译动态库的模板: #Test S ... -
android.源码启动模拟器
2010-08-02 13:47 6423Android.源码中启动模 ... -
Android源码 Bluetooth设置的类说明
2010-08-01 23:57 6120Android应用程序(Setting)中有关蓝牙设定部 ... -
在Linux下Android编译中修改Java的环境
2010-07-31 16:44 2735Android 在编译过程中需要用到Java Versi ...
相关推荐
### Android应用程序请求root权限代码详解 #### 一、概述 在Android开发中,有时需要对系统进行更深层次的操作,例如修改系统文件或访问特定的硬件资源等,这就需要使用到root权限。root权限通常被视为超级用户...
标题"android应用获得执行root权限动作__socket_service"表明我们要讨论如何在Android应用中通过Socket服务来实现root权限的获取。这种方式通常涉及到创建一个在系统层面运行的服务,该服务具有root权限,并通过...
Android应用源码获取root权限静默安装是一个获取root权限后,不...不过应用程序运行命令获取ROOT权限,设备必须已破解(获得ROOT权限),代码中主要对流进行操作,有对文件读写不清楚的都可以看看。(源码采用GBK编码)
其次,获取 root 权限可以让用户安装一些需要root权限的应用程序,例如一些游戏和工具等等。 那么,谁需要获取 root 权限呢?第一类人群是黑客或喜欢对系统进行hacking的人,因为他们需要更多的控制权和自由度。第...
同时,获取 root 权限也可以让用户更好地管理设备,例如控制应用程序的权限、设置系统参数等。 在获取 root 权限之前,用户需要了解相关的知识和风险,例如 Linux 命令行操作、SDK 安装和配置等。此外,用户也需要...
不过应用程序运行命令获取ROOT权限,设备必须已破解(获得ROOT权限),代码中主要对流进行操作,有对文件读写不清楚的都可以看看。(源码采用GBK编码)。之前也介绍过一个静默卸载的项目...
修改源码让APP获取root权限可以执行su命令的git diff记录
对于开发者来说,获取root权限能够更深入地调试和优化应用程序,而对于普通用户,root权限则意味着更大的自由度和定制化能力。本工具专注于帮助Android用户简单有效地获取root权限。 首先,让我们了解一下什么是USB...
压缩包内有apk,demo源码,以及NDK 安装文档,主要是教你如何在已经root过得手机上只通过一次获取root权限,以后就再也不会弹出root授权框,主要思想是绕过superuser.apk的权限检查
当用户或应用程序请求root权限时,这个"su"程序会处理请求,并在获得授权后允许执行相应的操作。 在提供的压缩包子文件名称列表中,"META-INF"和"system"两个目录都有特殊含义: 1. **META-INF**:这个目录通常...
在Android操作系统中,"获得root权限"是指获取到设备的最高管理员权限,允许用户对系统进行深度修改,包括删除预装应用、安装自定义固件、优化系统性能等。对于XT800+运行Android 2.3.4版本的手机用户来说,这可能是...
在Android系统中,APK是应用程序的安装包,它们通常运行在用户权限下,不能访问系统的核心功能。然而,为了实现更高级的功能,比如修改系统设置、管理其他应用或者优化性能,开发者有时需要获取到设备的root权限。...
- 在Linux(包括Android)中,ROOT权限意味着用户拥有系统管理员的权力,可以修改系统文件、安装需要超级用户权限的应用、删除预装应用、优化系统性能等。 - 开放ROOT权限后,用户可以进行深度定制,例如改变系统...
### Android手机获取Root权限教程详解 #### Root权限概念与重要性 **Root权限**,对于Android设备来说,意味着用户能够获得对其操作系统最高级别的控制权。这一权限赋予了用户修改或替换设备操作系统的能力,几乎...
Android手机获取root权限是许多高级用户为了更深度定制和优化设备所采取的步骤。Root权限类似于Linux系统中的超级管理员账户,允许用户访问和修改手机的底层文件,包括系统核心和设置。这种权限通常由手机制造商限制...
在Android系统中,`su` 文件是一个至关重要的组件,它使得用户可以获取到系统的超级用户权限,也就是我们常说的root权限。Root权限是Android系统中的一种高级权限,允许用户访问和修改系统的受保护部分,包括系统...