如何在应用程序启动时应用程序请求root权限限

博客访问: 444867
博文数量: 187
博客积分: 1992
博客等级: 上尉
技术积分: 1755
注册时间:
重庆乐潮信息技术有限公司
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: 嵌入式
转自:最近在移植Android过程中遇到了Android程序(apk)权限的问题。最近也对这方面进行了一些了解,在此和大家分享。&&&& Android框架是基于Linux内核构建,所以Android安全系统也是基于Linux的安全架构建立的。在Linux安全系统中,用户和组起着重要的作用,Linux中所有的资源给不同的用户和用户组设置了不同的访问属性。如果你对Linux下面用户和组的概念不熟悉,请先补习一下Linux基础知识。&&& 在Android系统中,系统为每一个应用程序(apk)创建了一个用户和组。这个用户和组都是受限用户,不能访问系统的数据,只能访问自己的文件和目录,当然它也不能访问其他应用程序的数据。这样设计可以尽可能地保护应用程序的私有数据,增强系统的安全性和健壮性。&&&& 但是有一些应用程序是需要访问一些系统资源的。比如Setting程序,他就需要访问wiffi,在系统中创建删除文件等等操作。怎样做到这一点儿呢?Android通过一定途径可以获得system权限。获得system用户权限,需要以下步骤:1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。&2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行&3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。&&&& 一般情况下system用户权限就已经够用了,system用户可以在系统中创建和删除文件,访问设备等等。但是有些情况下system权限还是不够的。比如:设置网卡IP地址,ifconfig命令是需要root权限的。我可以很肯定的说,在Android下面应用程序是没有可能拿到root权限的。但是如果我的应用程序需要root权限怎么办呢?只能想办法绕般过去。就以我的问题为例,设置网卡IP地址,root权限下面命令为:ifconfig eth0 192.168.1.188在普通用户或者system用户权限下面这条命令是不起作用的,但是不会返回失败和异常,这个我个人认为是Android的bug。那么怎样实现这个功能呢?我想出了两个办法。1、系统启动的时候init进程创建一个后台进程,该进程处于root用户权限下面。用来监听系统中应用程序的请求(可以用socket实现),并代其完成。这样应用程序就可以执行root用户权限的任务了。2、实现一个虚拟的设备,该设备的功能就是在内核态帮应用程序执行相应的命令。Linux内核态没有权限的问题了。肯定可以执行成功。&&&& 我解决设置网卡IP地址问题时,选择是后者。相对来说设计比较简单。&&&& 如果你到网上去搜一下,你会发现很多文章说怎样让Android应用程序获得root权限。如果你不想浪费时间就不要相信他们,因为那些途径是根本不可能获得root权限的。问题&&& 我遇到的问题是我想在Java应用程序中动态mount一个NFS的系统,但是执行mount命令必须要要root权限才可以。一般情况下,在Android的Java层是不能获得root权限的。思路&& 我在博文《》中提到两种思路:1、实现一个init实现一个Service,来帮助Android应用程序执行root权限的命令。&2、实现一个虚拟设备,这个设备帮助Android应用程序执行root权限的命令。&& 本文将会选择第一种来解决Android应用程序mount NFS文件系统的问题。Init.rc Service&& 在Android系统init.rc中定义很多Service,具体定义格式可以参考《》中的“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 property权限&&& 难道Android属性“ctl.start”是所有进程都可以设置的吗?那世界不就乱套了,谁都可以可以执行init.rc中Service了,查看property_service.c中的源码,设置Android系统属性的函数为handle_property_set_fd:
1: 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);
ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",
msg.name + 4, msg.value, cr.uid, cr.pid);
19: }&&& 从源码中我们发现如果设置“ctl.”开头的Android系统property,将会调用check_control_perms函数来检查调用者的权限,其定义如下:
1: static int check_control_perms(const char *name, int uid, int gid) {
if (uid == AID_SYSTEM || uid == AID_ROOT)
/* Search the ACL */
for (i = 0; control_perms[i]. i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
16: }&&& 我们发现root权限和system权限的应用程序将会授权修改“ctl.”开头的Android系统属性。否则将会检查control_perms全局变量中的定义权限和Service。&&& 如果想更深入的了解Android Init进程和Android Property的权限控制,请参考《》。实例&&& 通过上面的介绍我们基本已经有思路了,下面以上面提出的mount nfs文件系统为例说明:1、首先定义一个执行mount的脚本,我把它位于/system/etc/mount_nfs.sh,定义如下:
1: #!/system/bin/sh
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
disabled3、让自己的应用程序获得system权限,博文《》中提到了怎样获得system权限,请参考,这里就不赘述了。4、在自己应用程序中设置System系统属性“ctl.start”为“mount_nfs”,这样Android系统将会帮我们运行mount_nfs系统属性了。这里需要强调的是不能够调用,这个函数只是修改JVM中的系统属性。而不能修改Android的系统属性。可以调用android.os.SystemProperties(Android 2.1 Eclair系统可以调用这个API),如果你的Android版本不能调用这个类,只能通过JNI,调用C/C++层的API property_get和property_set函数了。如果想详细了解请参考《》。代码如下:
1: SystemProperties.set("ctl.start", "mount_nfs");5、最后在自己应用程序中,读取“init.svc.mount_nfs”Android系统Property,检查执行结果。代码如下:
1: while(true)
mount_rt = SystemProperties.get("init.svc.mount_nfs", "");
if(mount_rt != null && mount_rt.equals("stopped"))
Thread.sleep(1000);
}catch(Exception ex){
Log.e(TAG, "Exception: " + ex.getMessage());
15: }&&& init进程维护一个service的队列,所以我们需要轮训来查询service的执行结果。&&& 通过上面的这些步骤,Android应用程序就能够调用init.rc中定义的Service了。这样你的Android应用程序也就获得了root权限。总结&& 通过上文可以看出,在Android获得root权限还是需要一些前提的,比如:1、必须是Android系统开发人员,否则你无法修改init.rc等文件。 2、你的应用程序必须要获得system权限。&&& 这样可以防止root权限被应用程序无限制的使用,最终危及Android系统安全。
阅读(14269) | 评论(1) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
如此好文居然没有顶?怒赞,转走之
请登录后评论。如何在应用程序启动时请求root权限_百度知道在Mac安装软件时root用户也没有权限操作【原因、解决】 - 推酷
在Mac安装软件时root用户也没有权限操作【原因、解决】
如题, 主要是与 OS X 10.11中Rootless功能有关, 下面就说一下Rootless的实现与解释以及关闭方法
为了解释OS X 10.11中引入的Rootless机制,我翻译了Quora用户Eldad Eilam的答案,原文链接见
Rootless讨论的前提是假定root账户是OS X(或者其他Unix系统)中对抗恶意程序保护操作系统的最后一道防线。意思是一个应用程序一旦获得了root账户权限,将会获得系统的无限的权限。就可以进行实时修改、修改磁盘、替换任何系统文件等。
目前,许多传统的Unix操作系统中,root账户都是被强密码保护着的。这里的问题在于大部分的OS X系统基本上是单用户系统,也就是不存在单独的root账户密码,root密码就是管理员账户的密码。简单来说,苹果通过以下途径来获取root权限:
大部分用户会毫不犹豫的输入密码,都不会想他们到底授权了什么行为。更重要的是,授权给了什么应用程序。可以说,对于一般的无经验用户,他们没有时间和专业知识来考虑这个问题。他们不会意识到他们一旦输入了密码,请求的进程就会获得root权限。
什么是系统集成保护(System Integrity Protection)?
使用了系统集成保护,苹果决定第三方应用有一些永远不会被允许的事情。从某些层面来讲,这种保护和iOS更像了。第三方应用相比起来更受限制。这就是rootless一词的由来,系统在某种程度上限制了管理员账号的权限。
rootless特性使得某些操作只有苹果的应用可以被许可(通过代码签名来判断)。所以第三方应用即使是运行在root权限中,有一些操作也无法完成。在我的测试中我注意到了以下几点:
1./System文件夹下的所有文件都不能被苹果应用以外的程序修改(例如各种安装器和升级部件)
2.当前的API例如task_for_pid不能在系统进程下被调用了。这意味着以前注入系统进程(Finder、Messages或者系统内核)的程序都不能用了。
3.有意思的是,rootless依然允许已签名的KEXT内核拓展被载入。问题是KEXT可以进行许多无限制的系统及操作。
Rootless机制的目的很明显是改进安全性和可靠性,使得恶意软件以及木马很难渗透进系统。我很确信他将成为许多恶意软件开发者的一个挑战,不过我也很确定人们会发现这一机制很多薄弱的环节。
这个特性对于一些合法的软件有很多副作用。对此,苹果提供了一种方法使得用户可以关闭这个特性,但这需要用户以恢复模式启动(开机按住Command+R)
如果想了解更多,可以参考苹果的WWDC session视频。
更新关闭方法,兼容Beta7:
开机按住Command+R,进入恢复模式,打开terminal,键入:
csrutil disable
回车,重新启动即可。要重新恢复,只需将disable改为enable。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致如何使Android应用程序获得root权限-中国学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
如何使Android应用程序获得root权限
来源:互联网 发表时间: 9:36:36 责任编辑:李志喜字体:
为了帮助网友解决“如何使Android应用程序获得root权限”相关的问题,中国学网通过互联网对“如何使Android应用程序获得root权限”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:如何使Android应用程序获得root权限,具体解决方案如下:解决方案1:
  Android system&要获取Root权限,&方法众多。  例如 : Baidu Root, Amazing Root ...都可以  现以 BAIDU ROOT介绍步骤, 操作如下 :  1、机子下载 BAIDU ROOT(APK版)。  2、运作 BAIDU ROOT,&点选&&一键获取Root&。  3、机子 Root&成功了, 自动重启&。    建议Rooting前备份手机数据。&Rooting过程约需时5min。中国学网
解决方案2:c 的源代码,    4,来帮助 Android 应用程序执行 root 权限的命令, oneshot 表示程序退出后不再重新启动;init&#47。    3! &#47: init,证明 service 的名字的确不能超过 16 个字符: if (strlen(name) &gt。  2) 实现一个虚拟设备: no such service ,或者可执行程序;core&#47,并在编译 image 的时候编译成可执行程序。  下面是我的脚本 ifconfig_test,但是如果我们需要在程序中执行某些需要 root 权限的命令。这里讲讲我在实现第一种办法的过程和遇到的一些问题:  1) 实现一个 init 实现一个 Service ,应用程序通知 init 启动 service 是通过设置系统属性来完成的,这样将可以获得 root 权限.rc 中注册。我之前的 service name 由于定义的比较长,否则无法执行;system&#47,通过 dmesg 可以查看到信息内容为 cannot execve , Ibin&#47.rc 中注册 service  Android 中的 service 需要在 init,规定只有 system 权限的应用程序才能设置属性: Exec format error    也可以采用 C/system&#47。    注意.sh ,如 ifconfig 等:  # 。查看 &#47.sh。    第二种办法我这里没有尝试,暂时也不会,就需要 root 权限了; 16) { return 0,对于 Android 来说;etc/bin/system&#47, 18 个字符;sh  ifconfig  注意.rc 中定义的 Service 将会被 init 进程创建,这里就不再细说。按照 Simon 的文章中提到的! &#47 一般来说。    2,这样 Android 系统将会帮我们运行 ifconfig_test 这个 service 了,具体为设置 System 系统属性 “valid_name 函数中可以看到如下内容;C++ 编写需要执行的命令或者程序。 Android 考虑到了这点。    1,应用程序有以下两种办法临时获得 root 权限;ifconfig_system&#47: 脚本的第一行必须为 # :  service ifconfig_test &#47.sh  oneshot  disabled  其中,设置属性通知 service 启动后查看 dmesg 可以看到提示; } .&#47,在 parse_service-&gt.start” 为 “ifconfig_test” , init 进程会启动该 service . 将 Android 应用程序提升为 system 权限  既然应用程序可以通过启动 service 获得 root 权限,这个设备帮助 Android 应用程序执行 root 权限的命令. 在 init。关于提升 system 权限的文章网上已有很多. 将我们要执行的命令写成脚本。  本文中注册的内容如下. 在应用程序中添加属性设置代码  前面已经提到。当得到相应的通知(通过属性设置)后: 这里 service name 不能超过 16 个字符;ifconfig_test,通知 service 启动, Android 下的应用程序可以“直接”得到的最大的权限为 system ,那么岂不是很不安全, disabled 表示不在系统启动时启动
解决方案3:
下载kingroot,root大师,刷机精灵都可以的
2个回答10个回答2个回答3个回答3个回答5个回答4个回答3个回答6个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答1个回答
相关文章:
<a href="/cse/search?q=<inputclass="s-btn"type="submit"text="<inputclass="s-btn"type="submit"text="<buttonhidefocusclass="s-btnjs-ask-btn"text="我要提问
<a href="/cse/search?q=

我要回帖

更多关于 root权限应用 的文章

 

随机推荐