Android系统权限及签名

 
2015-03-23 19:13:33CSDN-chen52671-点击数:
50

 
 

Android权限及签名

引子

现象:系统中的一个定制Service,服务是对外开放的,使用系统签名

LOCAL_CERTIFICATE := platform

应用层调用这个系统服务,获取底层的一些信息。如果在IDE里进行开发,普通签名,无法调用到该服务, 改成在系统编译环境里编译,并在Android.mk中加入如下语句:

LOCAL_CERTIFICATE := platformandroid:sharedUserId="android.uid.system“android:process="com.android.phone"

就可以顺利的获取到系统服务。其内在的原因是什么?

Linux权限

说起Android的权限和签名,就要先从Linux的权限说起,我们都知道Linux的文件系统是有权限限制的,对于每一个文件或者目录,我们执行 ls -l 指令都会看到类似如下的显示: -rw-r–r–  1 xxxxx xxxxx  681 2013-05-24 09:16 Android.mk 分别代表:文件种类和权限;硬链接个数;User;Group;大小;最后访问/修改时间;文件/目录名  文件权限代表是否对对应用户,用户组,其他用户开放读或者写权限。而User;Group则是代表了该文件是属于谁的,比如用户ABC创建的一个文件,该文件的User则为ABC。linux就是通过文件权限和用户用户组这种方式来保证安全的。 而文件权限是通过进程来体现的,用户访问一个文件,总是要通过进程来访问,即便是打开一个终端界面,也是打开了一个bash进程来查看文件的。 就如下图所示: 图1

对于Android而言,启动一个Application,一般同样要启动一个单独的进程来运行,就像这样:

drwxr-x--x u0_a49   u0_a49            2013-01-01 08:00 com.example.testdrwxr-x--x radio    radio                  2013-01-03 06:35 com.android.phone

上面的test应用启动了一个单独的进程,它的用户的用户组都是u0_a49。这样如果没有意外的话,其只能访问到该应用自己的data数据。 问题来了,如果我想访问其他不适自己data的文件及目录该怎么办呢?首先想到的就是能不能把自定义的应用的用户组改成和其他某应用一样呢?比如User改成radio。

答案是可以的。不过Android为了保证系统安全,还有个规定: 必须在AndroidManifest.xml具有相同签名+相同shareUserId属性的两个App,才可以分配相同的用户ID。因为com.android.phone是系统应用,其签名是LOCAL_CERTIFICATE := platform 系统签名,所以我必须同样采用LOCAL_CERTIFICATE := platform系统签名,并且android:sharedUserId=”android.uid.radio” 才可以让这个自定义的App和phone应用具有相同的UID。(当然如果只是想访问,android:sharedUserId可以设为更高权限的用户也可以实现)。

AndroidManifest.xml中还有一个标签android:process,比如:android:process=”com.android.phone”,它可以单独应用于某个Activity或者Service,也可以直接应用于Application。作用就是将对应的Activity或者Service放在com.android.phone这个进程中运行。而使用这个标签的前提就是前一段所说的:具有相同签名+相同shareUserId属性。 标签android:process的作用比如phone应用中运行的某个动态库或者持有的某个单例对象,如果另外一个app想要使用或者说调用的话,是没法使用,或者拿到的是另外一个单例—因为是另一个进程了。这个时候通过android:process将对于的Activity让其在phone进程中运行。这样就可以很方便的使用phone应用中的资源了。 图2

签名和APK的关系:通常APK对于的是Linux中的User和Process。APK的运行,就代表一个独特的进程的运行,而该进程又属于某个User。具有相同签名和相同shareUserId属性的两个APK,才会属于同一个User.(APK安装时,PackageManagerService会检查) 签名和权限的关系:签名是为了让系统识别是不是同一个作者,除了前面提到的系统签名外,每个作者都可以自定义自己的签名。对于签名级的权限,比如一个作者的应用定义了一个权限。并设置权限的android:protectionLevel 为”signature”。那么只有该作者使用同样签名的另一个应用,才可以使用该权限。

Root后的手机呢

为什么root后就可以无视那些权限呢? 拿一个root过得手机,执行如下代码:

Process process = Runtime.getRuntime().exec("su");os = new DataOutputStream(process.getOutputStream());  os.writeBytes(“echo 1500000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq" + "/n"); 

su程序的权限如下所示:

System/bin/su-rwsr-xr-x root root 

关键就是那个执行权限标志位S,代表当任何用户执行该文件时,都拥有该文件所有者的权限—–root。 当然这里说的比较简略,其实在应用执行root权限操作的时候,向Superuser.apk申请超级用户请求, Superuser.apk利用系统漏洞,执行类似如下的操作。让su程序居然这些功能。

cp /data/tmp/su /system/bin/chown root:root su chmod 4775 /system/bin/su 

这样上面修改cpu频率的语句就可以顺利执行。

Q&A

Q:android:sharedUserId和android:process的关系? A:sharedUserId是对整个apk而言, android:process则是对某一个activity或者servicce而言,很多时候sharedUserId是android:process的前提 Q:android:sharedUserId和android:process分别对应用来说有什么作用。 A:sharedUserId可以让应用的uid变成类似system,phone,虽然没有root用户权限高,但是也可以做很多事了,具体要看其需求。具有phone的uid,然后才可以设定应用内的activity的android:process属性。 使用android:process的原因很多: a)比如Stk应用,想要使用CatService(单例模式),于是它调用CatService.getInstance(),调用时如果已经存在CatService实例才会正确返回,该实例还没有建立,是拿不到的。而这个CatService是在Phone应用中,使用CommandsInterface 对象(Ril)作为参数建立。这是就需要把Stk应用放在Phone进程里,才可以拿到CatService实例。 b)又或者想要设计一个系统应用,想要调用Phone  phone = PhoneFactory.getDefaultPhone()获得Phone对象,但是这个调用只能运行在phone进程中(原因见该函数源码)。这就必须把调用该语句的activity设为android:process=“com.android.phone“——如Setting里的IccLockSettings。

Android系统权限及签名的更多相关文章

  1. 对Android系统权限的认识

    Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制 Android系统权限相关的内容 (一)linux文件系统上的权限 -rwxr-x--x ...

  2. Android系统权限和root权限

    Android系统权限和root权限http://www.verydemo.com/demo_c189_i277.html

  3. Android系统权限和root权限大全

    tyle="margin:20px 0px 0px; font-size:14.285714149475098px; line-height:26px; font-family:Arial; ...

  4. android系统权限SET_PREFERRED_APPLICATIONS怎么获取

    最近自己写个demo,需要用到SET_PREFERRED_APPLICATIONS权限 在网上找了半天,大概有两种方式: 1. 将手机root后,把apk强行push到system/app目录下,重启 ...

  5. Android系统开发 编译系统签名的APP

    前言 一般情况下,我们使用的签名都是自己生成的Java签名来编译APP. 但是,如果需要开发一些特定设备的APP(对权限有更高的要求,需求一些系统基本的权限,比如让APP可以控制设备的休眠),那就需要 ...

  6. Android——系统权限

    Android是一个特权分隔的操作系统,每一个应用程序运行在不同的系统身份中(Linux的user ID和group ID).系统部分和不同的身份被隔离开来.因此,Linux隔离了应用程序(与其它程序 ...

  7. android系统权限的管理

    被权限搞了好久,决定好好的研究一下: 参考资料 http://blog.csdn.net/xieyan0811/article/details/6083019?reload http://blog.c ...

  8. [转]通过apk签名使应用程序有系统权限

    [转]通过apk签名使应用程序有系统权限 (2013-01-08 13:40:50) 转载▼ 标签: it 分类: Android 出处:http://blog.csdn.net/doom66151/ ...

  9. Android系统签名简介

    apk的签名,简单说开发者可以通过签名 对应用进行标识和更新.包名在一个设备上是唯一的,这样可以避免被相同包名应用随意覆盖安装.这是一个非常重要的安全功能.系统中的签名文件,也是对系统中应用进行签名, ...

随机推荐

  1. Hibernate框架--关联映射,一对多,多对多 inverse cascade

    回顾Hibernate: 1. hibernate开发环境搭建 ----> 引入jar: hibernate.jar + required + jpa + 驱动包 ---> hiberna ...

  2. 获取集合、数组后要判断为空的必要性以及根据构造器创建对象后不是null的证实

    在开发过程中,凡是获取到一个集合对象,在利用或者说遍历这个集合对象之前,都要进行是否为null以及size()>0的判断,但是如果size()>0的话,不是就已经可以说明此集合对象不为nu ...

  3. [WPF] 浏览百度地图并获取经纬度地址信息

    项目中需要利用登记的区域和地址在百度地图上定位,并获取该地址的经纬度. 本次功能对我来说主要难点如下:1.百度地图API的基本使用方法,请首选使用百度地图的JavaScript大众版(PS:之前使用W ...

  4. 关于C++中字符的转换

    VS的工程属性中我们常会设置Character Set:

  5. thinkphp整合系列之短信验证码、订单通知

    现在这个短信通知泛滥的年代:应用如果没有个短信注册:你都不敢说你是搞开发的: 这个验证码搞起来是不难的:但是如果刚接触也是有点不知从哪下手的迷茫: 先讲下概念: 要想发送验证码:需要至少三项:appi ...

  6. document.domain的修改问题

    有时候,需要修改document.domain. 典型的情形:http://a.xxx.com/A.htm 的主页面有一个<iframe src="http://b.xxx.com/B ...

  7. spark 编程向导

    http://spark.apache.org/docs/latest/programming-guide.html

  8. 删除 mysql 日志文件后 ,启动出错

    把 mysql-bin.index 里面的索引全部删除

  9. 决策树J48算法

    1.J48原理 基于从上到下的策略,递归的分治策略,选择某个属性放置在根节点,为每个可能的属性值产生一个分支,将实例分成多个子集,每个子集对应一个根节点的分支,然后在每个分支上递归地重复这个过程.当所 ...

  10. STM32的外部中断配置及使用

    STM32的外部中断配置及使用 配置1:GPIO: 配置外部中断为输入模式: 配置2:EXTI: 配置外部中断线和触发模式: 配置3:NVIC: 配置外部中断源和中断优先级: 需要注意的是:RCC_A ...