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. xxx app 项目问题解决一览

    前话:作为人生旅途中的小记录 不同账号玩法限制       解决 <vn_rule>x</vn_rule> 6.调整下注筹码 **** 解决 不同账号的玩法限制    **** ...

  2. mave 安装本地jar包到maven库

    Maven 安装 JAR 包的命令是: mvn install:install-file -Dfile=本地jar包的位置 -DgroupId=groupId -DartifactId=artifac ...

  3. 第五节 面向连接传输:TCP

    第五节 面向连接传输:TCP   TCP概述RFCs:793,1122,1323,2018,2581   点对点:   一个发送方,一个接收方   可靠,按序的字节流:   无“报文边界”,无结构但有 ...

  4. Oracle技术整理(转载)

  5. php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证及缺点

    在php中,可以使用Header函数做一些有趣的事情,用户验证就是其中一个很有意思的功能.具体用法: Header("WWW-Authenticate: Basic realm=" ...

  6. linux查看文件及文件夹的大小

    最近发现服务器的磁盘容量使用率超过了90%,所以有必要查看是哪个文件占用了太多的空间, 服务器系统:CentOS6.5 df -h #查看磁盘使用情况,步骤1 cd / #切换到根目录, 步骤2 du ...

  7. .project

    http://blog.csdn.net/qiushuichangtian888/article/details/9299843 一个老项目导入新环境后老是提示build.properties不存在的 ...

  8. iabtis初探

    1.简介 与Hibernate相比,ibatis属于一种半自动的ORM框架,主要解决了java对象与SQL入参及结果集的映射关系.简单易学.容易上手:但是安全性较差,对于金融等对安全要求较高的系统来说 ...

  9. 【servlet】 第一个servlet

    简单打印haha Helloyt.java package day01; import java.io.IOException; import javax.servlet.ServletConfig; ...

  10. thinkphp中select()和find()的区别

    find()返回一个一维数组 select()返回一个二维数组 所以在取值时有所不同,一维数组取值用$data["data"],二维数组取值用$data[0]["data ...